On Thu, 16 Jul 2026, Tamar Christina wrote:

> Continuing the work started in GCC 12 with g:a0dae768c6f78eba
> this patch replaces uses of SLP_TREE_SCALAR_STMTS with SLP_TREE_LANES when 
> used
> to determine the number of lanes in the SLP tree.  This de-couples the need to
> have the same number of scalar statements as lanes in the SLP tree.
> 
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> -m32, -m64 and no issues.
> 
> OK with the updated comments?

Yes.

Thanks,
Richard.

> Thanks,
> Tamar
> 
> gcc/ChangeLog:
> 
>       * tree-vect-slp-patterns.cc (compatible_complex_nodes_p): Support
>       mismatched group sizes and use group size to iterate.
>       * tree-vect-slp.cc (vect_build_slp_instance,
>       vect_analyze_slp_reduc_chain, vect_analyze_slp_reduction,
>       vect_analyze_slp_reduction_group, vect_analyze_slp_instance,
>       vect_analyze_slp): Compare against lanes instead of .length ().
>       (vect_optimize_slp_pass::get_result_with_layout): replace .length ()
>       with .exist ().
>       (vect_transform_slp_perm_load_1): Use lanes instead of .length ().
>       (vect_remove_slp_scalar_calls): Replace iterators.
>       * tree-vect-stmts.cc (vectorizable_shift): Use group size over ops
>       length.
> 
> ---
> diff --git a/gcc/tree-vect-slp-patterns.cc b/gcc/tree-vect-slp-patterns.cc
> index 
> 181281c2154bedfc8e8c6b1bde1226e194ba99e5..3194642ef88e20b60eadc44b1d69c0d4f5a59a96
>  100644
> --- a/gcc/tree-vect-slp-patterns.cc
> +++ b/gcc/tree-vect-slp-patterns.cc
> @@ -762,7 +762,10 @@ compatible_complex_nodes_p (slp_compat_nodes_map_t 
> *compat_cache,
>       are externals.  */
>    if (SLP_TREE_DEF_TYPE (a) != vect_internal_def)
>      {
> -      for (unsigned i = 0; i < SLP_TREE_SCALAR_OPS (a).length (); i++)
> +      unsigned group_size = SLP_TREE_LANES (a);
> +      gcc_assert (SLP_TREE_SCALAR_OPS (a).length () == group_size
> +               && SLP_TREE_SCALAR_OPS (b).length () == group_size);
> +      for (unsigned i = 0; i < group_size; i++)
>       {
>         tree op1 = SLP_TREE_SCALAR_OPS (a)[pa[i % 2]];
>         tree op2 = SLP_TREE_SCALAR_OPS (b)[pb[i % 2]];
> diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
> index 
> ff11b392305db07e7691d8c3dc7e3eee134aa78d..c4e8514b5b6a776d6b008fa51000f951bd39968a
>  100644
> --- a/gcc/tree-vect-slp.cc
> +++ b/gcc/tree-vect-slp.cc
> @@ -4293,10 +4293,10 @@ vect_build_slp_instance (vec_info *vinfo,
>         vinfo->slp_instances.safe_push (new_instance);
>  
>         /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
> -          the number of scalar stmts in the root in a few places.
> +          the number of SLP lanes of the root in a few places.
>            Verify that assumption holds.  */
> -       gcc_assert (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (new_instance))
> -                     .length () == group_size);
> +       gcc_assert (SLP_TREE_LANES (SLP_INSTANCE_TREE (new_instance))
> +                    == group_size);
>  
>         if (dump_enabled_p ())
>           {
> @@ -4728,10 +4728,10 @@ vect_analyze_slp_reduc_chain (loop_vec_info vinfo,
>        vinfo->slp_instances.safe_push (new_instance);
>  
>        /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
> -      the number of scalar stmts in the root in a few places.
> +      the number of SLP lanes of the root in a few places.
>        Verify that assumption holds.  */
> -      gcc_assert (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (new_instance))
> -               .length () == group_size);
> +      gcc_assert (SLP_TREE_LANES (SLP_INSTANCE_TREE (new_instance))
> +               == group_size);
>  
>        if (dump_enabled_p ())
>       {
> @@ -4817,10 +4817,10 @@ vect_analyze_slp_reduction (loop_vec_info vinfo,
>        vinfo->slp_instances.safe_push (new_instance);
>  
>        /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
> -      the number of scalar stmts in the root in a few places.
> +      the number of SLP lanes of the root in a few places.
>        Verify that assumption holds.  */
> -      gcc_assert (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (new_instance))
> -               .length () == group_size);
> +      gcc_assert (SLP_TREE_LANES (SLP_INSTANCE_TREE (new_instance))
> +               == group_size);
>  
>        if (dump_enabled_p ())
>       {
> @@ -4889,10 +4889,10 @@ vect_analyze_slp_reduction_group (loop_vec_info 
> loop_vinfo,
>    loop_vinfo->slp_instances.safe_push (new_instance);
>  
>    /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
> -     the number of scalar stmts in the root in a few places.
> +     the number of SLP lanes of the root in a few places.
>       Verify that assumption holds.  */
> -  gcc_assert (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (new_instance))
> -           .length () == group_size);
> +  gcc_assert (SLP_TREE_LANES (SLP_INSTANCE_TREE (new_instance))
> +           == group_size);
>  
>    if (dump_enabled_p ())
>      {
> @@ -5145,10 +5145,10 @@ vect_analyze_slp_instance (vec_info *vinfo,
>         vinfo->slp_instances.safe_push (new_instance);
>  
>         /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
> -          the number of scalar stmts in the root in a few places.
> +          the number of SLP lanes of the root in a few places.
>            Verify that assumption holds.  */
> -       gcc_assert (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (new_instance))
> -                     .length () == group_size);
> +       gcc_assert (SLP_TREE_LANES (SLP_INSTANCE_TREE (new_instance))
> +                   == group_size);
>  
>         if (dump_enabled_p ())
>           {
> @@ -5392,10 +5392,10 @@ vect_analyze_slp_instance (vec_info *vinfo,
>         vinfo->slp_instances.safe_push (new_instance);
>  
>         /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
> -          the number of scalar stmts in the root in a few places.
> +          the number of SLP lanes of the root in a few places.
>            Verify that assumption holds.  */
> -       gcc_assert (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (new_instance))
> -                     .length () == group_size);
> +       gcc_assert (SLP_TREE_LANES (SLP_INSTANCE_TREE (new_instance))
> +                   == group_size);
>  
>         if (dump_enabled_p ())
>           {
> @@ -7914,7 +7914,7 @@ vect_optimize_slp_pass::get_result_with_layout 
> (slp_tree node,
>  
>        unsigned int num_lanes = SLP_TREE_LANES (node);
>        result = vect_create_new_slp_node (num_inputs, VEC_PERM_EXPR);
> -      if (SLP_TREE_SCALAR_STMTS (node).length ())
> +      if (SLP_TREE_SCALAR_STMTS (node).exists ())
>       {
>         auto &stmts = SLP_TREE_SCALAR_STMTS (result);
>         stmts.safe_splice (SLP_TREE_SCALAR_STMTS (node));
> @@ -8827,7 +8827,7 @@ vect_prologue_cost_for_slp (vec_info *vinfo, slp_tree 
> node,
>       constants can be implemented as load from the constant pool.
>       When all elements are the same we can use a splat.  */
>    tree vectype = SLP_TREE_VECTYPE (node);
> -  unsigned group_size = SLP_TREE_SCALAR_OPS (node).length ();
> +  unsigned group_size = SLP_TREE_LANES (node);
>    unsigned HOST_WIDE_INT const_nunits;
>    unsigned nelt_limit;
>    unsigned nvectors = vect_get_num_copies (vinfo, node);
> @@ -10998,7 +10998,7 @@ vect_transform_slp_perm_load_1 (vec_info *vinfo, 
> slp_tree node,
>    stmt_vec_info stmt_info = SLP_TREE_SCALAR_STMTS (node)[0];
>    int vec_index = 0;
>    tree vectype = SLP_TREE_VECTYPE (node);
> -  unsigned int group_size = SLP_TREE_SCALAR_STMTS (node).length ();
> +  unsigned int group_size = SLP_TREE_LANES (node);
>    unsigned int mask_element;
>    unsigned dr_group_size;
>    machine_mode mode;
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 
> 76e24b2c1699b022e4480fc4aac87ff0b6ddf650..f41d49541d570b656eec10227f7f030051acd0bb
>  100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -6388,15 +6388,18 @@ vectorizable_shift (vec_info *vinfo,
>        /* Now adjust the constant shift amount in place.  */
>        if (incompatible_op1_vectype_p
>         && dt[1] == vect_constant_def)
> -     for (unsigned i = 0;
> -          i < SLP_TREE_SCALAR_OPS (slp_op1).length (); ++i)
> -       {
> -         SLP_TREE_SCALAR_OPS (slp_op1)[i]
> -           = fold_convert (TREE_TYPE (vectype),
> -                           SLP_TREE_SCALAR_OPS (slp_op1)[i]);
> -         gcc_assert ((TREE_CODE (SLP_TREE_SCALAR_OPS (slp_op1)[i])
> -                      == INTEGER_CST));
> -       }
> +     {
> +       unsigned group_size = SLP_TREE_LANES (slp_op1);
> +       gcc_assert (SLP_TREE_SCALAR_OPS (slp_op1).length () == group_size);
> +       for (unsigned i = 0; i < group_size; ++i)
> +         {
> +           SLP_TREE_SCALAR_OPS (slp_op1)[i]
> +             = fold_convert (TREE_TYPE (vectype),
> +                             SLP_TREE_SCALAR_OPS (slp_op1)[i]);
> +           gcc_assert ((TREE_CODE (SLP_TREE_SCALAR_OPS (slp_op1)[i])
> +                        == INTEGER_CST));
> +         }
> +     }
>        SLP_TREE_TYPE (slp_node) = shift_vec_info_type;
>        DUMP_VECT_SCOPE ("vectorizable_shift");
>        vect_model_simple_cost (vinfo, 1, slp_node, cost_vec);
> 
> 
> 

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)

Reply via email to