diff options
author | Juzhe-Zhong <juzhe.zhong@rivai.ai> | 2023-06-13 17:30:55 +0800 |
---|---|---|
committer | Pan Li <pan2.li@intel.com> | 2023-06-13 21:53:47 +0800 |
commit | cbe7f069e6a1a5c4f17019f4449da35a182775fc (patch) | |
tree | 2117a3239e5114cfdba65bb89e1ddec16f264851 /gcc/tree-ssa-loop-prefetch.cc | |
parent | 2270f4fdaa0331b5c7fa53baeb7fd0038639a73f (diff) | |
download | gcc-cbe7f069e6a1a5c4f17019f4449da35a182775fc.zip gcc-cbe7f069e6a1a5c4f17019f4449da35a182775fc.tar.gz gcc-cbe7f069e6a1a5c4f17019f4449da35a182775fc.tar.bz2 |
RISC-V: Fix bug of VLA SLP auto-vectorization
Sorry for producing bugs in the previous VLA SLP patch.
Consider this following permutation:
_85 = VEC_PERM_EXPR <{ 99, 17, ... }, { 11, 80, ... }, { 0, POLY_INT_CST [4, 4], 1, POLY_INT_CST [5, 4], 2, POLY_INT_CST [6, 4], ... }>;
The correct result should be:
_85 = { 99, 11, 17, 80, ... }
However, I did wrong in the previous patch.
Code sequence before this patch:
set mask = { 0, 1, 0, 1, ... }
set v0 = { 99, 17, 99, 17, ... }
set v1 = { 11, 80, 11, 80, ... }
set index = viota (mask) = { 0, 0, 1, 1, 2, 2, ... }
set result = vrgather_mu (v0, v1, index, mask) = { 99, 11, 99, 80 }
The result is incorrect.
After this patch:
set mask = { 0, 1, 0, 1, ... }
set index = viota (mask) = { 0, 0, 1, 1, 2, 2, ... }
set v0 = vrgather ({ 99, 17, 99, 17, ... }, index) = { 99, 99, 17, 17, ... }
set v1 = { 11, 80, 11, 80, ... }
set result = vrgather_mu (v0, v1, index, mask) = { 99, 11, 17, 80 }
The result is what we expected.
This issue was discovered in the test I appended in this patch with --param=riscv-autovec-lmul=2.
gcc/ChangeLog:
* config/riscv/riscv-v.cc (emit_vlmax_decompress_insn): Fix bug.
(shuffle_decompress_patterns): Ditto.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/partial/slp-12.c: New test.
* gcc.target/riscv/rvv/autovec/partial/slp_run-12.c: New test.
Diffstat (limited to 'gcc/tree-ssa-loop-prefetch.cc')
0 files changed, 0 insertions, 0 deletions