https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90037
--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Jeffrey A. Law from comment #8) > So, if we change phionlycprop to look for other const/copy initializations > that can be eliminated and run a pass between DOM and the erroneous-path > isolation pass, then the false positive is eliminated (as expected). > > There's two things I don't like about that. First, it turns phionlycprop > into a full-fledged constant propagation pass. phionlycprop is supposed to > be so fast that we never really notice it. It accomplishes this by only > looking at PHI nodes that are degenerates and any constants exposed by > propagating way the degenerate PHI. Essentially it's just cleaning up > painfully obvious cruft left by jump threading. > > To pick up this case we'd have to scan statements in blocks. We could > restrict that to blocks where we eliminated degenerate PHI. But still. > Ugh. > > Second, once phionlycprop is doing more work, I'm less inclined to want to > add another instance of the pass. > > Finally, once phionlycprop is doing more work one could legitimately ask if > we should just drop the code and use the lattice copy propagator. > > Just for fun I replaced all the phi-only cprop calls with calls into the > lattice propagator (including the one I added between DOM and erroneous-path > optimization). As expected that fixes the testcase too. It also happens to > clean up things slightly better at an earlier point in the optimizer > pipeline. I don't know if it's a good trade-off though. As a middle-ground you can now run non-iterating value-numbering on a SEME region. We are already doing that for unrolled loop bodies, if-converted loop bodies and loop header copies, exactly to (mostly) get local constant propagation & simplifications done. IMHO the copied paths jump threading creates are a perfect candidate for this treatment as well. See for example tree-ssa-loop-ch.c where it calls do_rpo_vn (obviously VN needs up-to-date SSA so the VN is delayed until after all loop-header copying is done and we remember the SEME regions to VN).