https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98848
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- So what about punting if the lhs of the possible over_widen pattern is a PHI on loop header? --- gcc/tree-vect-patterns.c.jj 2021-01-04 10:25:38.650235896 +0100 +++ gcc/tree-vect-patterns.c 2021-02-01 10:13:51.755008757 +0100 @@ -1579,6 +1579,20 @@ vect_recog_over_widening_pattern (vec_in tree type = TREE_TYPE (lhs); tree_code code = gimple_assign_rhs_code (last_stmt); + /* Punt if lhs might be used in a reduction. */ + if (loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (vinfo)) + { + use_operand_p use_p; + imm_use_iterator iter; + FOR_EACH_IMM_USE_FAST (use_p, iter, lhs) + { + gimple *use_stmt = USE_STMT (use_p); + if (gimple_code (use_stmt) == GIMPLE_PHI + && gimple_bb (use_stmt) == LOOP_VINFO_LOOP (loop_vinfo)->header) + return NULL; + } + } + /* Keep the first operand of a COND_EXPR as-is: only the other two operands are interesting. */ unsigned int first_op = (code == COND_EXPR ? 2 : 1); doesn't regress any vect.exp=*over-widen* tests and let's this testcase be vectorized.