On Thu, Jul 8, 2021 at 2:41 PM Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > vect_create_epilog_for_reduction only handles two cases: single-loop > reductions and double reductions. “nested cycles” (i.e. reductions > in the inner loop when vectorising an outer loop) are handled elsewhere > and don't need a vector->scalar reduction. > > The function had variables called nested_in_vect_loop and double_reduc > and asserted that nested_in_vect_loop implied double_reduc, but it > still had code to handle nested_in_vect_loop && !double_reduc. > This patch removes that and uses double_reduc everywhere.
OK. (cleaning up after the GCC 10 time refactoring was still on my list :/) > gcc/ > * tree-vect-loop.c (vect_create_epilog_for_reduction): Remove > nested_in_vect_loop and use double_reduc everywhere. Remove dead > assignment to "loop". > --- > gcc/tree-vect-loop.c | 30 ++++-------------------------- > 1 file changed, 4 insertions(+), 26 deletions(-) > > diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c > index bc523d151c6..7c3e3352b43 100644 > --- a/gcc/tree-vect-loop.c > +++ b/gcc/tree-vect-loop.c > @@ -5005,7 +5005,6 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > imm_use_iterator imm_iter, phi_imm_iter; > use_operand_p use_p, phi_use_p; > gimple *use_stmt; > - bool nested_in_vect_loop = false; > auto_vec<gimple *> new_phis; > int j, i; > auto_vec<tree> scalar_results; > @@ -5023,10 +5022,8 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > { > outer_loop = loop; > loop = loop->inner; > - nested_in_vect_loop = true; > - gcc_assert (!slp_node); > + gcc_assert (!slp_node && double_reduc); > } > - gcc_assert (!nested_in_vect_loop || double_reduc); > > vectype = STMT_VINFO_REDUC_VECTYPE (reduc_info); > gcc_assert (vectype); > @@ -5049,8 +5046,6 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > induc_val = STMT_VINFO_VEC_INDUC_COND_INITIAL_VAL (reduc_info); > else if (double_reduc) > ; > - else if (nested_in_vect_loop) > - ; > else > adjustment_def = STMT_VINFO_REDUC_EPILOGUE_ADJUSTMENT (reduc_info); > } > @@ -5923,7 +5918,7 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > { > gcc_assert (!slp_reduc); > gimple_seq stmts = NULL; > - if (nested_in_vect_loop) > + if (double_reduc) > { > new_phi = new_phis[0]; > gcc_assert (VECTOR_TYPE_P (TREE_TYPE (adjustment_def))); > @@ -5942,21 +5937,12 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > > epilog_stmt = gimple_seq_last_stmt (stmts); > gsi_insert_seq_before (&exit_gsi, stmts, GSI_SAME_STMT); > - if (nested_in_vect_loop) > - { > - if (!double_reduc) > - scalar_results.quick_push (new_temp); > - else > - scalar_results[0] = new_temp; > - } > - else > - scalar_results[0] = new_temp; > - > + scalar_results[0] = new_temp; > new_phis[0] = epilog_stmt; > } > > if (double_reduc) > - loop = loop->inner; > + loop = outer_loop; > > /* 2.6 Handle the loop-exit phis. Replace the uses of scalar loop-exit > phis with new adjusted scalar results, i.e., replace use <s_out0> > @@ -6017,14 +6003,6 @@ vect_create_epilog_for_reduction (loop_vec_info > loop_vinfo, > scalar_dest = gimple_assign_lhs (scalar_stmt_info->stmt); > } > > - if (nested_in_vect_loop) > - { > - if (double_reduc) > - loop = outer_loop; > - else > - gcc_unreachable (); > - } > - > phis.create (3); > /* Find the loop-closed-use at the loop exit of the original scalar > result. (The reduction result is expected to have two immediate > uses,