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

commit r14-11747-gbed0053a28e238cb9c079a3ec89341541390f933
Author: Robin Dapp <rd...@ventanamicro.com>
Date:   Fri Feb 21 07:19:40 2025 +0100

    vect: Use original LHS type for gather pattern [PR118950].
    
    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.
    
            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.
    
    (cherry picked from commit f3d4208e798afafcba5246334004e9646e390681)

Diff:
---
 .../gcc.target/riscv/rvv/autovec/pr118950.c        | 29 ++++++++++++++++++++++
 gcc/tree-vect-patterns.cc                          |  3 ++-
 2 files changed, 31 insertions(+), 1 deletion(-)

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 000000000000..604d4264eac1
--- /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 87c2acff386d..ed6cac77d2a1 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6264,7 +6264,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

Reply via email to