https://gcc.gnu.org/g:d5b1baa7f2251895447d99cd2f6a1eabb2c94601

commit r16-3512-gd5b1baa7f2251895447d99cd2f6a1eabb2c94601
Author: Richard Biener <rguent...@suse.de>
Date:   Mon Sep 1 15:01:24 2025 +0200

    Pass vectype to vect_check_gather_scatter
    
    The strided-store path needs to have the SLP trees vector type so
    the following patch passes dowm the vector type to be used to
    vect_check_gather_scatter and adjusts all other callers.  This
    removes one of the last pieces requiring STMT_VINFO_VECTYPE
    during SLP stmt analysis.
    
            * tree-vectorizer.h (vect_check_gather_scatter): Add
            vectype parameter.
            * tree-vect-data-refs.cc (vect_check_gather_scatter): Get
            vectype as parameter.
            (vect_analyze_data_refs): Adjust.
            * tree-vect-patterns.cc (vect_recog_gather_scatter_pattern): 
Likewise.
            * tree-vect-slp.cc (vect_get_and_check_slp_defs): Get vectype
            as parameter, pass down.
            (vect_build_slp_tree_2): Adjust.
            * tree-vect-stmts.cc (vect_mark_stmts_to_be_vectorized): Likewise.
            (vect_use_strided_gather_scatters_p): Likewise.

Diff:
---
 gcc/tree-vect-data-refs.cc | 12 ++++++------
 gcc/tree-vect-patterns.cc  | 10 +++++-----
 gcc/tree-vect-slp.cc       |  7 ++++---
 gcc/tree-vect-stmts.cc     |  7 +++++--
 gcc/tree-vectorizer.h      |  4 ++--
 5 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
index f9bf6a216970..1395776599a2 100644
--- a/gcc/tree-vect-data-refs.cc
+++ b/gcc/tree-vect-data-refs.cc
@@ -4554,12 +4554,13 @@ vect_describe_gather_scatter_call (stmt_vec_info 
stmt_info,
 }
 
 /* Return true if a non-affine read or write in STMT_INFO is suitable for a
-   gather load or scatter store.  Describe the operation in *INFO if so.
-   If it is suitable and ELSVALS is nonzero store the supported else values
-   in the vector it points to.  */
+   gather load or scatter store with VECTYPE.  Describe the operation in *INFO
+   if so.  If it is suitable and ELSVALS is nonzero store the supported else
+   values in the vector it points to.  */
 
 bool
-vect_check_gather_scatter (stmt_vec_info stmt_info, loop_vec_info loop_vinfo,
+vect_check_gather_scatter (stmt_vec_info stmt_info, tree vectype,
+                          loop_vec_info loop_vinfo,
                           gather_scatter_info *info, vec<int> *elsvals)
 {
   HOST_WIDE_INT scale = 1;
@@ -4568,7 +4569,6 @@ vect_check_gather_scatter (stmt_vec_info stmt_info, 
loop_vec_info loop_vinfo,
   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
   tree offtype = NULL_TREE;
   tree decl = NULL_TREE, base, off;
-  tree vectype = STMT_VINFO_VECTYPE (stmt_info);
   tree memory_type = TREE_TYPE (DR_REF (dr));
   machine_mode pmode;
   int punsignedp, reversep, pvolatilep = 0;
@@ -5273,7 +5273,7 @@ vect_analyze_data_refs (vec_info *vinfo, bool *fatal)
       if (gatherscatter != SG_NONE)
        {
          gather_scatter_info gs_info;
-         if (!vect_check_gather_scatter (stmt_info,
+         if (!vect_check_gather_scatter (stmt_info, vectype,
                                          as_a <loop_vec_info> (vinfo),
                                          &gs_info)
              || !get_vectype_for_scalar_type (vinfo,
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index 16694d7991cd..64a49cccc245 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6032,16 +6032,17 @@ vect_recog_gather_scatter_pattern (vec_info *vinfo,
      This is null if the operation is unconditional.  */
   tree mask = vect_get_load_store_mask (stmt_info);
 
+  /* DR analysis nailed down the vector type for the access.  */
+  tree gs_vectype = STMT_VINFO_VECTYPE (stmt_info);
+
   /* Make sure that the target supports an appropriate internal
      function for the gather/scatter operation.  */
   gather_scatter_info gs_info;
-  if (!vect_check_gather_scatter (stmt_info, loop_vinfo, &gs_info)
+  if (!vect_check_gather_scatter (stmt_info, gs_vectype, loop_vinfo, &gs_info)
       || gs_info.ifn == IFN_LAST)
     return NULL;
 
   /* Convert the mask to the right form.  */
-  tree gs_vectype = get_vectype_for_scalar_type (loop_vinfo,
-                                                gs_info.element_type);
   if (mask)
     mask = vect_convert_mask_for_vectype (mask, gs_vectype, stmt_info,
                                          loop_vinfo);
@@ -6103,8 +6104,7 @@ vect_recog_gather_scatter_pattern (vec_info *vinfo,
   stmt_vec_info pattern_stmt_info = loop_vinfo->add_stmt (pattern_stmt);
   loop_vinfo->move_dr (pattern_stmt_info, stmt_info);
 
-  tree vectype = STMT_VINFO_VECTYPE (stmt_info);
-  *type_out = vectype;
+  *type_out = gs_vectype;
   vect_pattern_detected ("gather/scatter pattern", stmt_info->stmt);
 
   return pattern_stmt;
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 5236eac5a42a..6258a8eb53de 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -641,7 +641,7 @@ vect_slp_child_index_for_operand (const gimple *stmt, int 
op,
    swapping operands of father node of this one, return 1; if everything is
    ok return 0.  */
 static int
-vect_get_and_check_slp_defs (vec_info *vinfo, unsigned char swap,
+vect_get_and_check_slp_defs (vec_info *vinfo, tree vectype, unsigned char swap,
                             bool *skip_args,
                             vec<stmt_vec_info> stmts, unsigned stmt_num,
                             vec<slp_oprnd_info> *oprnds_info)
@@ -711,7 +711,7 @@ vect_get_and_check_slp_defs (vec_info *vinfo, unsigned char 
swap,
        {
          gcc_assert (STMT_VINFO_GATHER_SCATTER_P (stmt_info));
          if (!is_a <loop_vec_info> (vinfo)
-             || !vect_check_gather_scatter (stmt_info,
+             || !vect_check_gather_scatter (stmt_info, vectype,
                                             as_a <loop_vec_info> (vinfo),
                                             first ? &oprnd_info->first_gs_info
                                             : &gs_info))
@@ -2618,7 +2618,8 @@ out:
   slp_oprnd_info oprnd_info;
   FOR_EACH_VEC_ELT (stmts, i, stmt_info)
     {
-      int res = vect_get_and_check_slp_defs (vinfo, swap[i], skip_args,
+      int res = vect_get_and_check_slp_defs (vinfo, vectype,
+                                            swap[i], skip_args,
                                             stmts, i, &oprnds_info);
       if (res != 0)
        matches[(res == -1) ? 0 : i] = false;
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 15e0d069dccd..b63a180811e3 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -891,7 +891,9 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo, 
bool *fatal)
       if (STMT_VINFO_GATHER_SCATTER_P (stmt_vinfo))
        {
          gather_scatter_info gs_info;
-         if (!vect_check_gather_scatter (stmt_vinfo, loop_vinfo, &gs_info))
+         if (!vect_check_gather_scatter (stmt_vinfo,
+                                         STMT_VINFO_VECTYPE (stmt_vinfo),
+                                         loop_vinfo, &gs_info))
            gcc_unreachable ();
          opt_result res
            = process_use (stmt_vinfo, gs_info.offset, loop_vinfo, relevant,
@@ -1738,7 +1740,8 @@ vect_use_strided_gather_scatters_p (stmt_vec_info 
stmt_info, tree vectype,
                                    unsigned int group_size,
                                    bool single_element_p)
 {
-  if (!vect_check_gather_scatter (stmt_info, loop_vinfo, gs_info, elsvals)
+  if (!vect_check_gather_scatter (stmt_info, vectype,
+                                 loop_vinfo, gs_info, elsvals)
       || gs_info->ifn == IFN_LAST)
     {
       if (!vect_truncate_gather_scatter_offset (stmt_info, vectype, loop_vinfo,
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 260cb2ddd3e6..87ffe497008a 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -2622,8 +2622,8 @@ extern opt_result vect_prune_runtime_alias_test_list 
(loop_vec_info);
 extern bool vect_gather_scatter_fn_p (vec_info *, bool, bool, tree, tree,
                                      tree, int, internal_fn *, tree *,
                                      vec<int> * = nullptr);
-extern bool vect_check_gather_scatter (stmt_vec_info, loop_vec_info,
-                                      gather_scatter_info *,
+extern bool vect_check_gather_scatter (stmt_vec_info, tree,
+                                      loop_vec_info, gather_scatter_info *,
                                       vec<int> * = nullptr);
 extern void vect_describe_gather_scatter_call (stmt_vec_info,
                                               gather_scatter_info *);

Reply via email to