https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107160
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|linkw at gcc dot gnu.org |rguenth at gcc dot gnu.org Status|NEW |ASSIGNED --- Comment #15 from Richard Biener <rguenth at gcc dot gnu.org> --- I think that either vect_find_reusable_accumulator should punt on this or vect_create_epilog_for_reduction shouldn't register this accumulator. The caller of vect_find_reusable_accumulator checks for vec_num == 1 (in the epilog) but we register for vec_num == 2. For SLP reductions we "fail" to reduce to a single accumulator. int vec_num = vec_oprnds0.length (); gcc_assert (vec_num == 1 || slp_node); The following fixes this: diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 1996ecfee7a..b1442a93581 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -6232,7 +6232,8 @@ vect_create_epilog_for_reduction (loop_vec_info loop_vinfo, } /* Record this operation if it could be reused by the epilogue loop. */ - if (STMT_VINFO_REDUC_TYPE (reduc_info) == TREE_CODE_REDUCTION) + if (STMT_VINFO_REDUC_TYPE (reduc_info) == TREE_CODE_REDUCTION + && vec_num == 1) loop_vinfo->reusable_accumulators.put (scalar_results[0], { orig_reduc_input, reduc_info });