https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118468
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Keywords| |missed-optimization Status|UNCONFIRMED |NEW Blocks| |53947 Last reconfirmed| |2025-01-14 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- That bb 12 isn't inside the loop. The issue is that if-conversion fails to if-convert <bb 3> [local count: 1044213920]: (loop header) # s_15 = PHI <s_10(9), s_7(D)(8)> _1 = *s_15; if (_1 > 63) goto <bb 11>; [50.00%] else goto <bb 4>; [50.00%] <bb 11> [local count: 522106960]: goto <bb 5>; [100.00%] <bb 4> [local count: 522106960]: _14 = (int) _1; _17 = 9223372036854785024 >> _14; _18 = _17 & 1; _19 = _18 == 0; _25 = ~_19; <bb 5> [local count: 1044213920]: # prephitmp_26 = PHI <_25(4), 0(11)> because "Can not ifcvt due to multiple exits" that's a stop-gap to avoid spending time on if-converting that's useless in the end. We also have "basic block after exit bb but before latch" so basically if-conversion doesn't know how to if-convert between two exits - it always tries to remove _all_ control flow, not knowing how to keep hands off of exit tests. Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53947 [Bug 53947] [meta-bug] vectorizer missed-optimizations