https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87355
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |pinskia at gcc dot gnu.org Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed| |2021-12-25 --- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Confirmed. for f, if GCC would swap around the conditional, we would get decent code. That is like this: int f1 (int n, int i) { if (n == THRESHOLD) return i; if (n >= THRESHOLD) return 0; return -1; } If we have: <bb 2> [local count: 1073741823]: if (n_3(D) > 99) goto <bb 3>; [96.19%] else goto <bb 5>; [3.81%] <bb 3> [local count: 1032832263]: if (n_3(D) == 100) goto <bb 5>; [34.00%] else goto <bb 4>; [66.00%] <bb 4> [local count: 681669290]: <bb 5> [local count: 1073741824]: # _1 = PHI <0(4), -1(2), i_4(D)(3)> We should notice that the conditional at bb 3 is independent and that swapping would get us a PHI which has 0, -1 which can then be phiopt'ed.