On Fri, 3 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.
> 
> The change is to help prepare the vectorizer for being able to handle vector
> statements and so some cases already handle (where safe) the case where
> SLP_TREE_SCALAR_STMTS.length () != SLP_TREE_LANES.
> 
> In some places it just removes the use of .length() so it's easier to see that
> the length amount of statements was never actually used as a property 
> directly.
> 
> i.e. it was a numbered for each.
> 
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> arm-none-linux-gnueabihf, x86_64-pc-linux-gnu
> -m32, -m64 and no issues.
> 
> Any feedback?

Mostly OK.

@@ -8828,7 +8824,14 @@ 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);
+  if (SLP_TREE_SCALAR_OPS (node).length () != group_size)
+    {
+      record_stmt_cost (cost_vec, vect_get_num_copies (vinfo, node),
+                       vec_construct, nullptr, node, vectype, 0,
+                       vect_prologue);
+      return;
+    }
   unsigned HOST_WIDE_INT const_nunits;

I think this should be part of the relevant series, it definitely
looks like not very accurate costing of the existing-vector case.

It would be nice to commit the FOR_EACH -> for (.. : ...) changes
separately, those are really obvious and it makes the patch much
smaller.

In particular

@@ -13997,7 +14001,9 @@ vect_is_simple_use (vec_info *vinfo, slp_tree 
slp_node,
     {
       if (def_stmt_info_out)
        *def_stmt_info_out = NULL;
-      *op = SLP_TREE_SCALAR_OPS (child)[0];
+      *op = vect_get_slp_scalar_def (child, 0);
+      if (!*op)
+       return false;

this wasn't really supposed to FAIL anymore - I just didn't get
to killing off most of the vect_is_simple_use calls.  It looks
it might be "convenient" to do the above for the existing-vector
case, but as said it doesn't really belong to such upfront
cleanup.

Thanks,
Richard.

> 
> Thanks,
> Tamar
> 
> gcc/ChangeLog:
> 
>       * tree-vect-data-refs.cc (vect_slp_analyze_store_dependences,
>       vect_slp_analyze_load_dependences,
>       vect_slp_analyze_instance_dependence): Replace uses of .length ().
>       * tree-vect-slp-patterns.cc (compatible_complex_nodes_p): Support
>       mismatched group sizes and use group size to iterate.
>       * tree-vect-slp.cc (vect_slp_tree_uniform_p): Consider mismatched ops
>       lanes as non uniform.
>       (vect_mark_slp_stmts_relevant, vect_find_last_scalar_stmt_in_slp,
>       vect_find_first_scalar_stmt_in_slp): Use for-each iterator.
>       (vect_build_slp_store_interleaving): Check SLP Lanes instead.
>       (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): Reject layouts where
>       lanes and scalar ops don't match for now.
>       (vect_prologue_cost_for_slp): Cost mismatched lanes and ops as a
>       vec_constructor.
>       (vect_slp_prune_covered_roots, vect_bb_partition_graph_r): Replace
>       iterators.
>       (vect_get_slp_scalar_def): Safely handle cases where LANES and scalar
>       stmts or ops len don't match.
>       (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.
>       (vect_is_simple_use): Support getting scalar def from lane outside of
>       ops vect.
> 
> ---
> diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
> index 
> ab850de024bf41ea7635ce7381bcc6acd8fe0c28..80f7539614c2437d888611098b32467b894bacb0
>  100644
> --- a/gcc/tree-vect-data-refs.cc
> +++ b/gcc/tree-vect-data-refs.cc
> @@ -1037,10 +1037,10 @@ vect_slp_analyze_store_dependences (vec_info *vinfo, 
> slp_tree node)
>    stmt_vec_info last_access_info = vect_find_last_scalar_stmt_in_slp (node);
>    gcc_assert (DR_IS_WRITE (STMT_VINFO_DATA_REF (last_access_info)));
>  
> -  for (unsigned k = 0; k < SLP_TREE_SCALAR_STMTS (node).length (); ++k)
> +  for (auto stmt_vinfo : SLP_TREE_SCALAR_STMTS (node))
>      {
>        stmt_vec_info access_info
> -     = vect_orig_stmt (SLP_TREE_SCALAR_STMTS (node)[k]);
> +     = vect_orig_stmt (stmt_vinfo);
>        if (access_info == last_access_info)
>       continue;
>        data_reference *dr_a = STMT_VINFO_DATA_REF (access_info);
> @@ -1103,12 +1103,12 @@ vect_slp_analyze_load_dependences (vec_info *vinfo, 
> slp_tree node,
>    stmt_vec_info first_access_info = vect_find_first_scalar_stmt_in_slp 
> (node);
>    gcc_assert (DR_IS_READ (STMT_VINFO_DATA_REF (first_access_info)));
>  
> -  for (unsigned k = 0; k < SLP_TREE_SCALAR_STMTS (node).length (); ++k)
> +  for (auto stmt_vinfo : SLP_TREE_SCALAR_STMTS (node))
>      {
> -      if (! SLP_TREE_SCALAR_STMTS (node)[k])
> +      if (! stmt_vinfo)
>       continue;
>        stmt_vec_info access_info
> -     = vect_orig_stmt (SLP_TREE_SCALAR_STMTS (node)[k]);
> +     = vect_orig_stmt (stmt_vinfo);
>        if (access_info == first_access_info)
>       continue;
>        data_reference *dr_a = STMT_VINFO_DATA_REF (access_info);
> @@ -1245,8 +1245,8 @@ vect_slp_analyze_instance_dependence (vec_info *vinfo, 
> slp_instance instance)
>  
>        /* Mark stores in this instance and remember the last one.  */
>        last_store_info = vect_find_last_scalar_stmt_in_slp (store);
> -      for (unsigned k = 0; k < SLP_TREE_SCALAR_STMTS (store).length (); ++k)
> -     gimple_set_visited (SLP_TREE_SCALAR_STMTS (store)[k]->stmt, true);
> +      for (auto stmt_vinfo : SLP_TREE_SCALAR_STMTS (store))
> +     gimple_set_visited (STMT_VINFO_STMT (stmt_vinfo), true);
>      }
>  
>    bool res = true;
> @@ -1265,8 +1265,8 @@ vect_slp_analyze_instance_dependence (vec_info *vinfo, 
> slp_instance instance)
>  
>    /* Unset the visited flag.  */
>    if (store)
> -    for (unsigned k = 0; k < SLP_TREE_SCALAR_STMTS (store).length (); ++k)
> -      gimple_set_visited (SLP_TREE_SCALAR_STMTS (store)[k]->stmt, false);
> +    for (auto stmt_vinfo : SLP_TREE_SCALAR_STMTS (store))
> +      gimple_set_visited (STMT_VINFO_STMT (stmt_vinfo), false);
>  
>    /* If this is a SLP instance with a store check if there's a dependent
>       load that cannot be forwarded from a previous iteration of a loop
> diff --git a/gcc/tree-vect-slp-patterns.cc b/gcc/tree-vect-slp-patterns.cc
> index 
> 181281c2154bedfc8e8c6b1bde1226e194ba99e5..82aec27498432d4634f4cc135bef901d700236bb
>  100644
> --- a/gcc/tree-vect-slp-patterns.cc
> +++ b/gcc/tree-vect-slp-patterns.cc
> @@ -762,7 +762,11 @@ 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);
> +      if (SLP_TREE_SCALAR_OPS (a).length () != group_size
> +       || SLP_TREE_SCALAR_OPS (b).length () != group_size)
> +     return false;
> +      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 
> 2250f6f74a1ae63b0b9e42559955c0ab77ff3135..97a46ac929be16c3516fdbef80ad960954a8fafa
>  100644
> --- a/gcc/tree-vect-slp.cc
> +++ b/gcc/tree-vect-slp.cc
> @@ -378,6 +378,9 @@ vect_slp_tree_uniform_p (slp_tree node)
>    if (SLP_TREE_SCALAR_OPS (node).is_empty ())
>      return false;
>  
> +  if (SLP_TREE_SCALAR_OPS (node).length () != SLP_TREE_LANES (node))
> +    return false;
> +
>    unsigned i;
>    tree op, first = NULL_TREE;
>    FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_OPS (node), i, op)
> @@ -3601,17 +3604,13 @@ vect_bb_slp_mark_stmts_vectorized (bb_vec_info vinfo)
>  static void
>  vect_mark_slp_stmts_relevant (slp_tree node, hash_set<slp_tree> &visited)
>  {
> -  int i;
> -  stmt_vec_info stmt_info;
> -  slp_tree child;
> -
>    if (SLP_TREE_DEF_TYPE (node) != vect_internal_def)
>      return;
>  
>    if (visited.add (node))
>      return;
>  
> -  FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt_info)
> +  for (auto stmt_info : SLP_TREE_SCALAR_STMTS (node))
>      if (stmt_info)
>        {
>       gcc_assert (!STMT_VINFO_RELEVANT (stmt_info)
> @@ -3619,7 +3618,7 @@ vect_mark_slp_stmts_relevant (slp_tree node, 
> hash_set<slp_tree> &visited)
>       STMT_VINFO_RELEVANT (stmt_info) = vect_used_in_scope;
>        }
>  
> -  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
> +  for (auto child: SLP_TREE_CHILDREN (node))
>      if (child)
>        vect_mark_slp_stmts_relevant (child, visited);
>  }
> @@ -3665,9 +3664,7 @@ stmt_vec_info
>  vect_find_last_scalar_stmt_in_slp (slp_tree node)
>  {
>    stmt_vec_info last = NULL;
> -  stmt_vec_info stmt_vinfo;
> -
> -  for (int i = 0; SLP_TREE_SCALAR_STMTS (node).iterate (i, &stmt_vinfo); i++)
> +  for (auto stmt_vinfo : SLP_TREE_SCALAR_STMTS (node))
>      if (stmt_vinfo)
>        {
>       stmt_vinfo = vect_orig_stmt (stmt_vinfo);
> @@ -3683,9 +3680,8 @@ stmt_vec_info
>  vect_find_first_scalar_stmt_in_slp (slp_tree node)
>  {
>    stmt_vec_info first = NULL;
> -  stmt_vec_info stmt_vinfo;
>  
> -  for (int i = 0; SLP_TREE_SCALAR_STMTS (node).iterate (i, &stmt_vinfo); i++)
> +  for (auto stmt_vinfo : SLP_TREE_SCALAR_STMTS (node))
>      if (stmt_vinfo)
>        {
>       stmt_vinfo = vect_orig_stmt (stmt_vinfo);
> @@ -4025,7 +4021,7 @@ vect_build_slp_store_interleaving (vec<slp_tree> 
> &rhs_nodes,
>           .quick_push (SLP_TREE_CHILDREN (rhs_nodes[j])[l]);
>         SLP_TREE_CHILDREN (rhs_nodes[j])[l]->refcnt++;
>         for (unsigned k = 0;
> -            k < SLP_TREE_SCALAR_STMTS (rhs_nodes[j]).length (); ++k)
> +            k < SLP_TREE_LANES (rhs_nodes[j]); ++k)
>           {
>             /* ???  We should populate SLP_TREE_SCALAR_STMTS
>                or SLP_TREE_SCALAR_OPS but then we might have
> @@ -4292,8 +4288,8 @@ vect_build_slp_instance (vec_info *vinfo,
>         /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
>            the number of scalar stmts in 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 ())
>           {
> @@ -4727,8 +4723,8 @@ vect_analyze_slp_reduc_chain (loop_vec_info vinfo,
>        /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
>        the number of scalar stmts in 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 ())
>       {
> @@ -4816,8 +4812,8 @@ vect_analyze_slp_reduction (loop_vec_info vinfo,
>        /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
>        the number of scalar stmts in 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,8 +4885,8 @@ vect_analyze_slp_reduction_group (loop_vec_info 
> loop_vinfo,
>    /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
>       the number of scalar stmts in 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,8 +5141,8 @@ vect_analyze_slp_instance (vec_info *vinfo,
>         /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
>            the number of scalar stmts in 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,8 +5388,8 @@ vect_analyze_slp_instance (vec_info *vinfo,
>         /* ???  We've replaced the old SLP_INSTANCE_GROUP_SIZE with
>            the number of scalar stmts in 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 ())
>           {
> @@ -6087,9 +6083,7 @@ vect_analyze_slp (vec_info *vinfo, unsigned 
> max_tree_size,
>           {
>             if (!SLP_TREE_LOAD_PERMUTATION (load_node).exists ())
>               continue;
> -           unsigned k;
> -           stmt_vec_info load_info;
> -           FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (load_node), k, load_info)
> +           for (unsigned k = 0; k < SLP_TREE_LANES (load_node); k++)
>               if (SLP_TREE_LOAD_PERMUTATION (load_node)[k] != k)
>                 {
>                   loads_permuted = true;
> @@ -7865,6 +7859,8 @@ vect_optimize_slp_pass::get_result_with_layout 
> (slp_tree node,
>        /* If the vector is uniform or unchanged, there's nothing to do.  */
>        if (to_layout_i == 0 || vect_slp_tree_uniform_p (node))
>       result = node;
> +      else if (SLP_TREE_SCALAR_OPS (node).length () != SLP_TREE_LANES (node))
> +     result = node;
>        else
>       {
>         auto scalar_ops = SLP_TREE_SCALAR_OPS (node).copy ();
> @@ -7915,7 +7911,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));
> @@ -8828,7 +8824,14 @@ 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);
> +  if (SLP_TREE_SCALAR_OPS (node).length () != group_size)
> +    {
> +      record_stmt_cost (cost_vec, vect_get_num_copies (vinfo, node),
> +                     vec_construct, nullptr, node, vectype, 0,
> +                     vect_prologue);
> +      return;
> +    }
>    unsigned HOST_WIDE_INT const_nunits;
>    unsigned nelt_limit;
>    unsigned nvectors = vect_get_num_copies (vinfo, node);
> @@ -9194,14 +9197,11 @@ vect_slp_prune_covered_roots (slp_tree node, 
> hash_set<stmt_vec_info> &roots,
>        || visited.add (node))
>      return;
>  
> -  stmt_vec_info stmt;
> -  unsigned i;
> -  FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt)
> +  for (auto stmt : SLP_TREE_SCALAR_STMTS (node))
>      if (stmt)
>        roots.remove (vect_orig_stmt (stmt));
>  
> -  slp_tree child;
> -  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
> +  for (auto child : SLP_TREE_CHILDREN (node))
>      if (child)
>        vect_slp_prune_covered_roots (child, roots, visited);
>  }
> @@ -9411,10 +9411,7 @@ vect_bb_partition_graph_r (bb_vec_info bb_vinfo,
>                          hash_map<slp_tree, slp_instance> &node_to_instance,
>                          hash_map<slp_instance, slp_instance> 
> &instance_leader)
>  {
> -  stmt_vec_info stmt_info;
> -  unsigned i;
> -
> -  FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt_info)
> +  for (auto stmt_info : SLP_TREE_SCALAR_STMTS (node))
>      if (stmt_info)
>        vect_map_to_instance (instance, stmt_info, stmt_to_instance,
>                           instance_leader);
> @@ -9423,8 +9420,7 @@ vect_bb_partition_graph_r (bb_vec_info bb_vinfo,
>                           instance_leader))
>      return;
>  
> -  slp_tree child;
> -  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
> +  for (auto child : SLP_TREE_CHILDREN (node))
>      if (child && SLP_TREE_DEF_TYPE (child) == vect_internal_def)
>        vect_bb_partition_graph_r (bb_vinfo, instance, child, stmt_to_instance,
>                                node_to_instance, instance_leader);
> @@ -10942,13 +10938,19 @@ vect_get_slp_scalar_def (slp_tree slp_node, 
> unsigned n)
>      {
>        if (!SLP_TREE_SCALAR_STMTS (slp_node).exists ())
>       return NULL_TREE;
> +      if (n >= SLP_TREE_SCALAR_STMTS (slp_node).length ())
> +     return NULL_TREE;
>        stmt_vec_info def = SLP_TREE_SCALAR_STMTS (slp_node)[n];
>        if (!def)
>       return NULL_TREE;
>        return gimple_get_lhs (STMT_VINFO_STMT (def));
>      }
>    else
> -    return SLP_TREE_SCALAR_OPS (slp_node)[n];
> +    {
> +      if (n >= SLP_TREE_SCALAR_OPS (slp_node).length ())
> +     return NULL_TREE;
> +      return SLP_TREE_SCALAR_OPS (slp_node)[n];
> +    }
>  }
>  
>  /* Get the Ith vectorized definition from SLP_NODE.  */
> @@ -11003,7 +11005,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;
> @@ -12057,10 +12059,7 @@ vect_remove_slp_scalar_calls (vec_info *vinfo,
>  {
>    gimple *new_stmt;
>    gimple_stmt_iterator gsi;
> -  int i;
> -  slp_tree child;
>    tree lhs;
> -  stmt_vec_info stmt_info;
>  
>    if (!node || SLP_TREE_DEF_TYPE (node) != vect_internal_def)
>      return;
> @@ -12068,10 +12067,10 @@ vect_remove_slp_scalar_calls (vec_info *vinfo,
>    if (visited.add (node))
>      return;
>  
> -  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
> +  for (auto child : SLP_TREE_CHILDREN (node))
>      vect_remove_slp_scalar_calls (vinfo, child, visited);
>  
> -  FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt_info)
> +  for (auto stmt_info : SLP_TREE_SCALAR_STMTS (node))
>      {
>        if (!stmt_info)
>       continue;
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 
> 76e24b2c1699b022e4480fc4aac87ff0b6ddf650..0c7787e8939f2d8b040988584a2213de946eee1b
>  100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -6388,15 +6388,19 @@ 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);
> +       if (SLP_TREE_SCALAR_OPS (slp_op1).length () != group_size)
> +         return false;
> +       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);
> @@ -13997,7 +14001,9 @@ vect_is_simple_use (vec_info *vinfo, slp_tree 
> slp_node,
>      {
>        if (def_stmt_info_out)
>       *def_stmt_info_out = NULL;
> -      *op = SLP_TREE_SCALAR_OPS (child)[0];
> +      *op = vect_get_slp_scalar_def (child, 0);
> +      if (!*op)
> +     return false;
>        *dt = SLP_TREE_DEF_TYPE (child);
>        return true;
>      }
> @@ -14899,4 +14905,3 @@ vect_gen_len (tree len, tree start_index, tree 
> end_index, tree len_limit)
>  
>    return stmts;
>  }
> -
> 
> 
> 

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

Reply via email to