https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116520
Andi Kleen <andi-gcc at firstfloor dot org> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|incorrect |Multiple condition lead to | |missing vectorization due | |to missing early break --- Comment #1 from Andi Kleen <andi-gcc at firstfloor dot org> --- const unsigned char *search_line_fast2 (const unsigned char *s, const unsigned char *end) { while (s < end) { if (*s == '\n' || *s == '\r' || *s == '\\' || *s == '?') break; s++; } return s; } compiled with -march=skylake-avx512 -fopt-info-all gives ../gcc/gcc/testsuite/gcc.dg/vect/vect-switch-search-line-fast.c:9:12: missed: couldn't vectorize loop ../gcc/gcc/testsuite/gcc.dg/vect/vect-switch-search-line-fast.c:9:12: missed: not vectorized: unsupported control flow in loop. due to this: /* Check if we have any control flow that doesn't leave the loop. */ class loop *v_loop = loop->inner ? loop->inner : loop; basic_block *bbs = get_loop_body (v_loop); for (unsigned i = 0; i < v_loop->num_nodes; i++) if (EDGE_COUNT (bbs[i]->succs) != 1 && (EDGE_COUNT (bbs[i]->succs) != 2 || !loop_exits_from_bb_p (bbs[i]->loop_father, bbs[i]))) { free (bbs); return opt_result::failure_at (vect_location, "not vectorized:" " unsupported control flow in loop.\n"); } But the control flow clearly leaves the loop. At the gimple level it gives code like <bb 8> [local count: 110211694]: <bb 3> [local count: 1044213920]: # s_15 = PHI <s_9(9), s_6(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; _12 = ~_19; <bb 5> [local count: 1044213920]: # prephitmp_4 = PHI <_12(4), 0(11)> _10 = _1 == 92; _13 = prephitmp_4 | _10; if (_13 != 0) goto <bb 12>; [8.03%] else goto <bb 6>; [91.97%] <bb 12> [local count: 83800317]: # s_5 = PHI <s_15(5)> goto <bb 7>; [100.00%] <bb 6> [local count: 960413605]: s_9 = s_15 + 1; if (end_7(D) > s_9) goto <bb 9>; [97.25%] else goto <bb 13>; [2.75%] <bb 13> [local count: 26411378]: # s_20 = PHI <s_9(6)> goto <bb 7>; [100.00%] <bb 9> [local count: 934002227]: goto <bb 3>; [100.00%] which seems to come from if to switch and then switch expansion?