https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112457
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|c |tree-optimization Blocks| |53947 --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Well, this is because MAX_EXPR detection fails when store motion inserts flags (the max = max is elided) to avoid store-data races. Also when using -Ofast we avoid this but then the next phiopt comes too late to discover MAX after store motion is applied. The more practical example is int foo2 (int max, int n, int * __restrict a) { for (int i = 0; i < n; ++i) if (max < a[i]) { max = a[i]; } return max; } and that's handled OK. For your second example, index reduction, there's already bugreports. Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53947 [Bug 53947] [meta-bug] vectorizer missed-optimizations