On 10/4/2021 3:43 AM, Aldy Hernandez wrote:
It is frustrating that virtually all the regressions with the hybrid threader for VRP, have not been with the engine itself, but with the independent restrictions we have agreed upon. The following patch is a collection of discussions with Richi, Jeff, and Michael Matz regarding jump threading limitations in the presence of loops, that I hope can lead to further refinements. As I have mentioned before, most of our threading tests are too fragile, so in this patch I have distilled various restrictions into gimple FE tests that I hope can help in maintaining the threader going forward. The goal is to have one test with no valid threads whatsover, and one with exclusively one valid thread per function. This should make it trivial to maintain this going forward. I would like to request the relevant experts to not only examine the patch, but review the tests in this patch, to make sure we agree upon these restrictions. I have distilled the smallest possible test for each restriction and have annotated said tests to make reviewing easy. Note that the test in ssa-thread-valid.c is a thread that Jeff has suggested should be an exception to the path crossing loops restriction, but I have not implemented it yet, because even if we could loosen the restriction, it would violate Richi's restriction of a path that rotates a loop. Comments are highly welcome. By the way, these restrictions trigger *a lot*. We seem to be rotating loops left and right. So I wouldn't be surprised if this requires (as usual) a lot of test tweaking. Untested patch follows. p.s. Note that I'm just facilitating the discussion. I'm highly dependent on the loop experts here ;-). gcc/ChangeLog: * tree-ssa-threadupdate.c (jt_path_registry::cancel_invalid_paths): Tweak. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/ssa-thread-invalid.c: New test. * gcc.dg/tree-ssa/ssa-thread-valid.c: New test.
Let me throw that into the tester and see what pops. Jeff