https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71433
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rguenth at gcc dot gnu.org --- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- The issue is that jump-threading duplicated a tail with equal conditions so VRP is faced with <bb 3>: if (e_14(D) < -52) goto <bb 6>; else goto <bb 14>; # r_7 = PHI <r_20(13)> if (e_14(D) < -52) goto <bb 5>; else goto <bb 15>; <bb 15>: e_23 = ASSERT_EXPR <e_14(D), e_14(D) >= -52>; goto <bb 7>; <bb 14>: e_22 = ASSERT_EXPR <e_14(D), e_14(D) >= -52>; <bb 7>: _1 = e_14(D) < 0; _2 = (long int) _1; if (e_14(D) < 0) due to the fact that VRP does not insert PHIs for asserts (the assumption is that we'll always merge to [-INF, +INF] I guess) we lose the fact that e_14(D) >= -52 at the entry to BB 7. So it's basically VRPs own stupidness. The EVRP DOM-based algorithm should be fine here (and I hope we can rip out the SSA propagator based VRP at some point, I believe I now fixed most of its short-comings, loops still need to be dealt with though - stay tuned).