https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104639
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- it's odd that VRP doesn't optimize this though. VRP2 says Exported global range table: ============================ i_6 : int ~[4, 4] bool foo (int i) { bool _3; <bb 2> [local count: 118111600]: if (i_2(D) == 4) goto <bb 3>; [97.00%] else goto <bb 4>; [3.00%] <bb 3> [local count: 955630224]: <bb 4> [local count: 118111600]: # i_6 = PHI <i_2(D)(2), 6(3)> _3 = i_6 != 0; return _3; but shouldn't ranger figure that i_2(D) != 0 && 6 != 0 is the same as i_2(D) != 0? Alternatively this could be sth for phiopt. PRE still sees the loop (I guess it was previously the one optimizing this)