https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99755
--- Comment #3 from Andrew Macleod <amacleod at redhat dot com> --- we now know the PHI is an equivalence when the other argument is UNDEFINED.: <bb 4> [local count: 268435456]: x_12 = i_8(D) + 1; x_12 : int [3, +INF] Equivalence set : [x_7, x_12] <<--Equivalence marked <bb 5> [local count: 805306367]: # x_7 = PHI <x_10(D)(2), x_12(4)> _4 = i_8(D) == 2; _5 = j_9(D) == 3; _15 = k_11(D) == 4; _21 = _5 & _15; _16 = _4 & _21; _17 = x_7 != 3; _18 = _16 & _17; if (_18 != 0) goto <bb 6>; [0.00%] else goto <bb 7>; [100.00%] x_7 : int [3, +INF] 5->6 (T) _4 : _Bool [1, 1] 5->6 (T) _5 : _Bool [1, 1] 5->6 (T) x_7 : int [4, +INF] 5->6 (T) i_8(D) : int [2, 2] 5->6 (T) j_9(D) : int [3, 3] Whats missing is potentially recalculating equivalences on outgoing edges. we know 1) i_8 has a range of [2,2] on the edge 5->6 2) we know that x_7 and x_12 are equivalences 3) we know that x_12 = i_8(D) + 1; 4) We have the ability to recompute x_12 using i_8 on that edge, which would conclude x_12 = [3,3] on that edge. We just don't know to ask that question (yet). 5) the equivalence set of x_12=[3, 3] and x_7=[4, +INF] are incompatible. their intersection is EMPTY, which in turns means the edge is unexecutable. This is demonstrated by the requirement that x_7 != 3 be true, as well as (x_7 == x_12 == [3,3]) at the same time. The information is all there, we just need to figure out how best to use it.