https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63168
Bug ID: 63168 Summary: not vectorized: latch block not empty Product: gcc Version: 5.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: enhancement Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: glisse at gcc dot gnu.org Consider the 2 codes below. int mymax1(int *it, int *end) { int max = *it++; for (; it != end; it++) if (*it > max) max = *it; return max; } int mymax2(int *it, int *end) { int max = *it; while (++it != end) if (*it > max) max = *it; return max; } Compiled with g++ -Ofast, the first one is vectorized but not the second one. It gives up immediately because of "latch block not empty". That seems rather fragile :-( <bb 3>: max_8 = *it_6; max_10 = MAX_EXPR <max_2, max_8>; <bb 4>: # it_1 = PHI <it_6(3), it_4(D)(2)> # max_2 = PHI <max_10(3), max_5(2)> it_6 = it_1 + 4; if (it_6 != end_7(D)) goto <bb 3>; else goto <bb 5>; There are several related bugs (like PR 33447), feel free to mark as a dup if you can identify one for sure. (code taken from http://stackoverflow.com/q/25622109/1918193 apparently there may be other issues with what gcc produces)