https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55936
--- Comment #12 from Richard Biener <rguenth at gcc dot gnu.org> --- The main issue is that the PHI merging i and i = baz () has both edges executable. Visiting statement: if (i_22 < 0) Visiting conditional with predicate: if (i_22 < 0) With known ranges i_22: [j_12(D), j_12(D)] EQUIVALENCES: { i_9(D) j_12(D) i_24 i_26 } (4 elements) Predicate evaluates to: DON'T KNOW but Found new range for i_24: [10, 30] so it's the old issue of not being able to use equivalences during iteration. Quote: /* Compute the value of the predicate COND by checking the known ranges of each of its operands. Note that we cannot evaluate all the equivalent ranges here because those ranges may not yet be final and with the current propagation strategy, we cannot determine when the value ranges of the names in the equivalence set have changed. ... we have a similar issue for match-and-simplify valueization where we now conveniently track and update whether stmts are going to be simulated again.