https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118468
Bug ID: 118468 Summary: vectorizer: extra phi blocks vectorization of if Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: andi-gcc at firstfloor dot org Target Milestone: --- This is forked from PR116126 to handle another early exit problem const unsigned char *search_line_fast2 (const unsigned char *s, const unsigned char *end) { while (s < end) { if (*s == '\n' || *s == '\r' #ifdef MORE || *s == '\\' || *s == '?' #endif ) return s; s++; } return s; } When build cc1 -O3 -mavx10.2 search-line-fast-short.c -quiet -fopt-info-all -o x.s -fdump-tree-vect it vectorizes but with -DMORE=1 it gives: search-line-fast-short.c:3:18: missed: couldn't vectorize loop search-line-fast-short.c:3:18: missed: not vectorized: unsupported control flow in loop. tree-vect-loop.c: /* Check if we have any control flow that doesn't leave the loop. */ basic_block *bbs = get_loop_body (loop); for (unsigned i = 0; i < 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"); tree-if-conv converts the if, but then generates: _13 = _5 | prephitmp_26; if (_13 != 0) goto <bb 12>; [8.03%] else goto <bb 6>; [91.97%] (still inside loop) <bb 12> [local count: 83800317]: # s_24 = PHI <s_15(5)> goto <bb 7>; [100.00%] -> leaving loop So the empty basic block with the extra PHI prevents vectorization. The question is what to do about it. Either if-conv could avoid it, or the vectorizer could handle this case.