https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51049
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So at -O1 we get what we expect: ``` _1 = *i_4(D); _7 = j_5(D) != 2; _8 = _1 != 0; _9 = _7 & _8; if (_9 != 0) goto <bb 3>; [43.56%] else goto <bb 4>; [56.44%] <bb 3> [local count: 467721933]: _6 = (int) _1; <bb 4> [local count: 1073741824]: # _2 = PHI <_6(3), j_5(D)(2)> ``` But at -O2 we get: ``` if (_1 != 0) goto <bb 3>; [66.00%] else goto <bb 5>; [34.00%] <bb 3> [local count: 708669599]: if (j_5(D) != 2) goto <bb 4>; [66.00%] else goto <bb 5>; [34.00%] <bb 4> [local count: 467721933]: _6 = (int) _1; <bb 5> [local count: 1073741824]: # _2 = PHI <_6(4), j_5(D)(3), j_5(D)(2)> ``` Because VRP comes along and replaces j_5(D) with 2 along the edge `3->5` and ifcombine does not do handle that as the phi entries are different (but maybe can be proved as the same).