https://gcc.gnu.org/g:46194b912780452e80c1ef9867cbcff1050231a2
commit r15-6362-g46194b912780452e80c1ef9867cbcff1050231a2 Author: Pan Li <pan2...@intel.com> Date: Thu Dec 19 08:58:20 2024 +0800 RISC-V: Make vector strided store alias all other memories Almost the same as the RVV strided load, the vector strided store doesn't involve the (mem:BLK (scratch)) to alias all other memories. It will make the alias analysis only consider the base address of strided store. PR target/118075 gcc/ChangeLog: * config/riscv/vector.md: Add the (mem:BLK (scratch)) as the lhs of strided store define insn. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/base/pr118075-run-1.c: New test. Signed-off-by: Pan Li <pan2...@intel.com> Diff: --- gcc/config/riscv/vector.md | 19 ++++++++--------- .../gcc.target/riscv/rvv/base/pr118075-run-1.c | 24 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md index 58406f3d17cd..ff8f552b802b 100644 --- a/gcc/config/riscv/vector.md +++ b/gcc/config/riscv/vector.md @@ -2396,18 +2396,17 @@ (set_attr "mode" "<MODE>")]) (define_insn "@pred_strided_store<mode>" - [(set (match_operand:V_VLS 0 "memory_operand" "+m, m") - (if_then_else:V_VLS - (unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1, vmWc1") - (match_operand 4 "vector_length_operand" " rK, rK") - (match_operand 5 "const_int_operand" " i, i") + [(set (mem:BLK (scratch)) + (unspec:BLK + [(match_operand:V_VLS 0 "memory_operand" " +m, m") + (unspec:<VM> + [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1, vmWc1") + (match_operand 4 "vector_length_operand" " rK, rK") + (match_operand 5 "const_int_operand" " i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (unspec:V_VLS - [(match_operand 2 "<V_VLS:stride_predicate>" "<V_VLS:stride_store_constraint>") - (match_operand:V_VLS 3 "register_operand" " vr, vr")] UNSPEC_STRIDED) - (match_dup 0)))] + (match_operand 2 "<V_VLS:stride_predicate>" "<V_VLS:stride_store_constraint>") + (match_operand:V_VLS 3 "register_operand" " vr, vr")] UNSPEC_STRIDED))] "TARGET_VECTOR" "@ vsse<sew>.v\t%3,%0,%z2%p1 diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr118075-run-1.c b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118075-run-1.c new file mode 100644 index 000000000000..120573a1e8c0 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr118075-run-1.c @@ -0,0 +1,24 @@ +/* { dg-do run { target { riscv_v && rv64 } } } */ +/* { dg-additional-options "-std=c99 -O3 -march=rv64gcv_zvl256b -mrvv-vector-bits=zvl" } */ + +int a; +int b[14]; +char c[14][14]; + +int main() { + for (long f = 0; f < 14; ++f) + for (long g = 0; g < 4; ++g) + c[f][g] = 1; + + for (short f = 0; f < 12; f += 1) + c[f][f] = b[f]; + + for (long f = 0; f < 4; ++f) + for (long g = 0; g < 14; ++g) + a ^= c[f][g]; + + if (a != 0) + __builtin_abort (); + + return 0; +}