diff options
author | Robin Dapp <rdapp@ventanamicro.com> | 2025-02-21 07:19:40 +0100 |
---|---|---|
committer | Robin Dapp <rdapp@ventanamicro.com> | 2025-02-24 13:11:15 +0100 |
commit | f3d4208e798afafcba5246334004e9646e390681 (patch) | |
tree | 123f8fd9075160df42d18183bd47b5039da55ba6 | |
parent | 5806279610783805286ebcd0af3b455602a3a8f9 (diff) | |
download | gcc-f3d4208e798afafcba5246334004e9646e390681.zip gcc-f3d4208e798afafcba5246334004e9646e390681.tar.gz gcc-f3d4208e798afafcba5246334004e9646e390681.tar.bz2 |
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.
-rw-r--r-- | gcc/testsuite/gcc.target/riscv/rvv/autovec/pr118950.c | 29 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.cc | 3 |
2 files changed, 31 insertions, 1 deletions
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 0000000..604d426 --- /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 6fc97d1..4f0a7ea 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 |