On Thu, Jul 8, 2021 at 2:46 PM Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > This patch passes the reduc_info to get_initial_defs_for_reduction, > so that the function can get general information from there rather > than from the first SLP statement. This isn't a win on its own, > but it becomes important with later patches.
So the original code should have used SLP_TREE_REPRESENTATIVE instead of SLP_TREE_SCALAR_STMTS ()[0] (there might have been issues with doing that - my recollection is weak here). I'm not sure if reduc_info is actually better - only the representative will have STMT_VINFO_VECTYPE set, for the reduc_info there's STMT_VINFO_REDUC_VECTYPE (and STMT_VINFO_REDUC_VECTYPE_IN). So I think if you want to use reduc_info then you want to use STMT_VINFO_REDUC_VECTYPE? > gcc/ > * tree-vect-loop.c (get_initial_defs_for_reduction): Take the > reduc_info as an additional parameter. > (vect_transform_cycle_phi): Update accordingly. > --- > gcc/tree-vect-loop.c | 23 ++++++++++------------- > 1 file changed, 10 insertions(+), 13 deletions(-) > > diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c > index a31d7621c3b..565c2859477 100644 > --- a/gcc/tree-vect-loop.c > +++ b/gcc/tree-vect-loop.c > @@ -4764,32 +4764,28 @@ get_initial_def_for_reduction (loop_vec_info > loop_vinfo, > return init_def; > } > > -/* Get at the initial defs for the reduction PHIs in SLP_NODE. > - NUMBER_OF_VECTORS is the number of vector defs to create. > - If NEUTRAL_OP is nonnull, introducing extra elements of that > - value will not change the result. */ > +/* Get at the initial defs for the reduction PHIs for REDUC_INFO, whose > + associated SLP node is SLP_NODE. NUMBER_OF_VECTORS is the number of > vector > + defs to create. If NEUTRAL_OP is nonnull, introducing extra elements of > + that value will not change the result. */ > > static void > get_initial_defs_for_reduction (vec_info *vinfo, > + stmt_vec_info reduc_info, > slp_tree slp_node, > vec<tree> *vec_oprnds, > unsigned int number_of_vectors, > bool reduc_chain, tree neutral_op) > { > vec<stmt_vec_info> stmts = SLP_TREE_SCALAR_STMTS (slp_node); > - stmt_vec_info stmt_vinfo = stmts[0]; > unsigned HOST_WIDE_INT nunits; > unsigned j, number_of_places_left_in_vector; > - tree vector_type; > + tree vector_type = STMT_VINFO_VECTYPE (reduc_info); > unsigned int group_size = stmts.length (); > unsigned int i; > class loop *loop; > > - vector_type = STMT_VINFO_VECTYPE (stmt_vinfo); > - > - gcc_assert (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def); > - > - loop = (gimple_bb (stmt_vinfo->stmt))->loop_father; > + loop = (gimple_bb (reduc_info->stmt))->loop_father; > gcc_assert (loop); > edge pe = loop_preheader_edge (loop); > > @@ -4823,7 +4819,7 @@ get_initial_defs_for_reduction (vec_info *vinfo, > { > tree op; > i = j % group_size; > - stmt_vinfo = stmts[i]; > + stmt_vec_info stmt_vinfo = stmts[i]; > > /* Get the def before the loop. In reduction chain we have only > one initial value. Else we have as many as PHIs in the group. */ > @@ -7510,7 +7506,8 @@ vect_transform_cycle_phi (loop_vec_info loop_vinfo, > = neutral_op_for_slp_reduction (slp_node, vectype_out, > STMT_VINFO_REDUC_CODE > (reduc_info), > first != NULL); > - get_initial_defs_for_reduction (loop_vinfo, > slp_node_instance->reduc_phis, > + get_initial_defs_for_reduction (loop_vinfo, reduc_info, > + slp_node_instance->reduc_phis, > &vec_initial_defs, vec_num, > first != NULL, neutral_op); > }