https://gcc.gnu.org/g:4470b9d14e0a2435fb44fef0c45891eea14dedc2

commit r17-1591-g4470b9d14e0a2435fb44fef0c45891eea14dedc2
Author: Robin Dapp <[email protected]>
Date:   Tue Jun 16 07:47:13 2026 -0600

    [PATCH] vect: Fix gather supported vectype [PR125516].Hi,
    
    This patch fixes a mistake in gather/scatter discovery.  In the third
    "phase" we check for a larger offset type for the needed scaling but
    fail to let the vectorizer know it.  The patch just sets
    supported_offset_vectype and also skips costing an instruction in case
    the necessary conversion is a nop.
    
    Bootstrapped and regtested on x86, power10, and aarch64.
    Regtested on riscv64.
    
    Regards
     Robin
    
            PR tree-optimization/125516
    
    gcc/ChangeLog:
    
            * tree-vect-data-refs.cc (vect_gather_scatter_fn_p): Set
            supported_offset_vectype.
            * tree-vect-stmts.cc (vectorizable_store): Skip nop conversions
            when costing scatters.
            (vectorizable_load): Ditto for gathers.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/riscv/rvv/autovec/pr125516.c: New test.

Diff:
---
 .../gcc.target/riscv/rvv/autovec/pr125516.c        | 24 ++++++++++++++++++++++
 gcc/tree-vect-data-refs.cc                         |  5 +++++
 gcc/tree-vect-stmts.cc                             |  8 ++++++--
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c
new file mode 100644
index 000000000000..d9215a773209
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr125516.c
@@ -0,0 +1,24 @@
+/* { dg-do run { target riscv_v } } */
+/* { dg-additional-options "-fdump-tree-optimized" } */
+
+char a;
+long long b;
+short d[18][18][18][18];
+short (*e)[18][18][18] = d;
+
+int main ()
+{
+  for (long h = 0; h < 4; ++h)
+    for (long i = 0; i < 18; ++i)
+      for (long j = 0; j < 18; ++j)
+       for (long k = 0; k < 18; ++k)
+         d[h][i][j][k] = j;
+
+  for (short i = 0; i < 8; i++)
+    for (unsigned char j = 0; j < 18; j++)
+      a = e[3][i][i][j] ? e[j][i][i][3] : 0;
+
+  b = (int) a;
+  if (b != 0)
+    __builtin_abort ();
+}
diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
index f46627799764..3b27beb9c5b6 100644
--- a/gcc/tree-vect-data-refs.cc
+++ b/gcc/tree-vect-data-refs.cc
@@ -4752,6 +4752,11 @@ vect_gather_scatter_fn_p (vec_info *vinfo, bool read_p, 
bool masked_p,
          *ifn_out = configs[i].ifn;
          *offset_vectype_out = configs[i].offset_vectype;
          *supported_scale = configs[i].scale;
+         /* Only set SUPPORTED_OFFSET_VECTYPE if this is a real
+            conversion.  */
+         if (!useless_type_conversion_p (offset_vectype,
+                                         configs[i].offset_vectype))
+           *supported_offset_vectype = configs[i].offset_vectype;
          if (elsvals)
            *elsvals = configs[i].elsvals;
          return true;
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 7687c107a6af..87ce20677284 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -8981,7 +8981,9 @@ vectorizable_store (vec_info *vinfo,
            {
              if (costing_p)
                {
-                 if (ls.supported_offset_vectype)
+                 if (ls.supported_offset_vectype
+                     && !tree_nop_conversion_p (ls.supported_offset_vectype,
+                                                vec_offset))
                    inside_cost
                      += record_stmt_cost (cost_vec, 1, vector_stmt,
                                           slp_node, 0, vect_body);
@@ -10953,7 +10955,9 @@ vectorizable_load (vec_info *vinfo,
            {
              if (costing_p)
                {
-                 if (ls.supported_offset_vectype)
+                 if (ls.supported_offset_vectype
+                     && !tree_nop_conversion_p (ls.supported_offset_vectype,
+                                                vec_offset))
                    inside_cost
                      += record_stmt_cost (cost_vec, 1, vector_stmt,
                                           slp_node, 0, vect_body);

Reply via email to