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