Hi,

In the process of refactoring the gather/scatter rework this likely got
lost.  In the "third pass" that we look for a configuration with a
smaller scale and a larger offset type with the same signedness.
We want to be able to multiply the offset by the new
scale but not change the offset sign.  What we actually checked is
whether a converted offset type was supported without setting
*supported_offset_vectype.

This patch removes the check for the offset type change and replaces it
with a TYPE_SIGN match.

Bootstrapped and regtested on x86 and power10.  Regtested on riscv64 and 
aarch64.

Regards
 Robin

        PR tree-optimization/123118

gcc/ChangeLog:

        * tree-vect-data-refs.cc (vect_gather_scatter_fn_p): Check that
        the type sign is equal.

gcc/testsuite/ChangeLog:

        * g++.target/riscv/rvv/autovec/pr123118.C: New test.
---
 .../g++.target/riscv/rvv/autovec/pr123118.C   | 19 +++++++++++++++++++
 gcc/tree-vect-data-refs.cc                    | 10 +++-------
 2 files changed, 22 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/g++.target/riscv/rvv/autovec/pr123118.C

diff --git a/gcc/testsuite/g++.target/riscv/rvv/autovec/pr123118.C 
b/gcc/testsuite/g++.target/riscv/rvv/autovec/pr123118.C
new file mode 100644
index 00000000000..8cef5a7fe91
--- /dev/null
+++ b/gcc/testsuite/g++.target/riscv/rvv/autovec/pr123118.C
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d" } */
+
+long long a;
+short c, d;
+extern int e[][1][1][1];
+extern bool f[][1][4][2];
+#include <vector>
+
+void
+g ()
+{
+  for (bool b;;)
+    for (signed char h (c); h < 4; h += -4487 - 119)
+      {
+       e[b][b][b][b] = std::max (std::min ((long long) 3, a), (long long) d);
+       f[0][0][h][1] = h;
+      }
+}
diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
index b35ba05fd08..f12e1f6af5b 100644
--- a/gcc/tree-vect-data-refs.cc
+++ b/gcc/tree-vect-data-refs.cc
@@ -4709,13 +4709,9 @@ vect_gather_scatter_fn_p (vec_info *vinfo, bool read_p, 
bool masked_p,
       unsigned int precision
        = TYPE_PRECISION (TREE_TYPE (configs[i].offset_vectype));
       if (configs[i].scale < scale
-         && precision >= needed_precision
-         && (supportable_convert_operation (CONVERT_EXPR,
-                                           configs[i].offset_vectype,
-                                           offset_vectype, &tmp)
-             || (needed_precision == offset_precision
-                 && tree_nop_conversion_p (configs[i].offset_vectype,
-                                           offset_vectype))))
+         && TYPE_SIGN (configs[i].offset_vectype)
+            == TYPE_SIGN (offset_vectype)
+         && precision >= needed_precision)
        {
          *ifn_out = configs[i].ifn;
          *offset_vectype_out = configs[i].offset_vectype;
-- 
2.51.1

Reply via email to