On 30/10/2019 13:49, Richard Biener wrote:
> Why do you need this?  The vectorizer already creates such CTORs.  Any
> testcase that you can show?

typedef long v2di __attribute__((vector_size(16)));
v2di v;
void
foo()
{
   v = (v2di){v[1], v[0]};
}


>>           * tree-vect-slp.c (vect_analyze_slp_instance): Add case for vector 
>> constructors.
>>           (vect_bb_slp_scalar_cost): Likewise.
>>           (vect_slp_check_for_constructors): New function.
>>           (vect_slp_analyze_bb_1): Add check for vector constructors.
>>           (vect_schedule_slp_instance): Add case to fixup vector constructor 
>> stmt.
>>           (vectorize_slp_instance_root_stmt): New function
>>           * tree-vectorizer.h (SLP_INSTANCE_ROOT_STMT): New field.
> +         SLP_INSTANCE_ROOT_STMT (new_instance) = constructor ?
> stmt_info->stmt\
> +                                                 : NULL;
>
> SLP_INSTANCE_ROOT_STMT should be a stmt_vec_info I guess...
>
> @@ -2801,6 +2830,10 @@ vect_bb_slp_scalar_cost (basic_block bb,
>                  stmt_vec_info use_stmt_info = vinfo->lookup_stmt
> (use_stmt);
>                  if (!use_stmt_info || !PURE_SLP_STMT (use_stmt_info))
>                    {
> +                   /* Check this is not a constructor that will be
> vectorized
> +                      away.  */
> +                   if (BB_VINFO_GROUPED_STORES (vinfo).contains
> (use_stmt_info))
> +                       continue;
>                      (*life)[i] = true;
>
> ... which you then simply mark as PURE_SLP_STMT where we call
> vect_mark_slp_stmts in vect_slp_analyze_bb_1.
>
> I see you have the TYPE_VECTOR_SUBPARTS check still at transform
> stage in vectorize_slp_instance_root_stmt, please simply move
> it to vect_slp_check_for_constructors or to vect_analyze_slp_instance
> where you have the other rejects (non-SSA names in the ctor).
If the check is in vect_slp_check_for_constructors, which vector is used 
as the input to tYPE_VECTOR_SUBPARTS, the lhs of the constructor?
> That is, vectorize_slp_instance_root_stmt may not fail.
>
> +bool
> +vectorize_slp_instance_root_stmt (slp_tree node, slp_instance instance)
> +{
> +
>
> extra newline
>
> +  if (SLP_TREE_NUMBER_OF_VEC_STMTS (node) == 1)
>
> the stmt replacing can be commonized between == 1 and > 1 cases.
>
>     FOR_EACH_VEC_ELT (slp_instances, i, instance)
>       {
> +      slp_tree node = SLP_INSTANCE_TREE (instance);
>         /* Schedule the tree of INSTANCE.  */
> -      vect_schedule_slp_instance (SLP_INSTANCE_TREE (instance),
> +      vect_schedule_slp_instance (node,
>                                    instance, bst_map);
> +
> +      /* Vectorize the instance root.  */
> +      if (instance->root == node && SLP_INSTANCE_ROOT_STMT (instance)
> +         && SLP_TREE_VEC_STMTS (node).exists ())
> +       if (!vectorize_slp_instance_root_stmt (node, instance))
> +         {
>
> instance->root == node is always true.  Likewise
> SLP_TREE_VEC_STMTS (node).exists ().
>
> @@ -4061,15 +4201,42 @@ vect_schedule_slp (vec_info *vinfo)
>         if (is_a <loop_vec_info> (vinfo))
>
> the ChangeLog doesn't mention this.  I guess this isn't necessary
> unless you fail vectorizing late which you shouldn't.
>
> diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
> index
> 56be28b0cc5a77412f996e70636b08d5b615813e..9f8419e4208b7d438ace41892022f93ebcadd019
> 100644
> --- a/gcc/tree-vectorizer.h
> +++ b/gcc/tree-vectorizer.h
> @@ -151,6 +151,10 @@ public:
>     /* The root of SLP tree.  */
>     slp_tree root;
>
> +  /* For vector constructors, the constructor stmt that the SLP tree is
> built
> +     from, NULL otherwise.  */
> +  gimple *root_stmt;
>
> as said, make this a stmt_vec_info
>
> Thanks,
> Richard.
>
>
>> gcc/testsuite/ChangeLog:
>>
>> 2019-10-10  Joel Hutton  <joel.hut...@arm.com>
>>
>>           * gcc.dg/vect/bb-slp-40.c: New test.
>>           * gcc.dg/vect/bb-slp-41.c: New test.
>>
>>

Reply via email to