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)