Hi,

in PR118950 we do not zero masked elements in a gather load.
While recognizing a gather/scatter pattern we do not use the original
type of the LHS.  This matters because the type can differ with bool
patterns (e.g. _Bool vs unsigned char) and we don't notice the need
for zeroing out the padding bytes.

This patch just uses the original LHS's type.

Bootstrapped and regtested on x86, aarch64, and power10.
Regtested on rv64gcv_zvl512b.


        PR middle-end/118950

gcc/ChangeLog:

        * tree-vect-patterns.cc (vect_recog_gather_scatter_pattern): Use
        original LHS's type.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/pr118950.c: New test.
---
 .../gcc.target/riscv/rvv/autovec/pr118950.c   | 29 +++++++++++++++++++
 gcc/tree-vect-patterns.cc                     |  3 +-
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c

diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c
new file mode 100644
index 00000000000..604d4264eac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-require-effective-target riscv_v_ok } */
+/* { dg-add-options riscv_v } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+unsigned char a;
+long long r;
+_Bool h = 1;
+short j[23];
+_Bool k[3][23];
+
+void b(_Bool h, short j[], _Bool k[][23]) {
+  for (int m = 0; m < 23; m += 3)
+    for (short n = 0; n < 22; n += 4)
+      a = ({
+        unsigned char o = a;
+        unsigned char p = j[n] ? h : k[m][n];
+        o > p ? o : p;
+      });
+}
+
+int main() {
+  for (int m = 0; m < 23; ++m)
+    j[m] = 10;
+  b(h, j, k);
+  r = a;
+  if (r != 1)
+    __builtin_abort ();
+}
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index 6fc97d1b6ef..4f0a7ea162b 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6022,7 +6022,8 @@ vect_recog_gather_scatter_pattern (vec_info *vinfo,
       else
        pattern_stmt = gimple_build_call_internal (gs_info.ifn, 4, base,
                                                   offset, scale, zero);
-      tree load_lhs = vect_recog_temp_ssa_var (gs_info.element_type, NULL);
+      tree lhs = gimple_get_lhs (stmt_info->stmt);
+      tree load_lhs = vect_recog_temp_ssa_var (TREE_TYPE (lhs), NULL);
       gimple_call_set_lhs (pattern_stmt, load_lhs);
     }
   else
-- 
2.48.1


-- 
Regards
 Robin

Reply via email to