[PATCH 06/10] vect: Pass reduc_info to get_initial_defs_for_reduction

Richard Sandiford richard.sandiford@arm.com
Thu Jul 8 16:48:56 GMT 2021


Richard Biener <richard.guenther@gmail.com> writes:
> 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?

I guess I'm a bit fuzzy on the details, but AIUI STMT_VINFO_REDUC_VECTYPE
is the type that we do the arithmetic in, which might be different from
the types of the phis.  Is that right?

In this context we want the types of the phis, since the routine is
providing the initial values.  Using STMT_VINFO_REDUC_VECTYPE gives
things like:

-----------------------------------------------------------------------
gcc.dg/torture/pr92345.c:8:1: error: incompatible types in 'PHI' argument 1
vector(4) int

vector(4) unsigned int

vect_fr_lsm.11_58 = PHI <vect__7.14_64(6), { 0, 0, 0, 0 }(10)>
-----------------------------------------------------------------------

Thanks,
Richard

>
>> 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);
>>         }


More information about the Gcc-patches mailing list