diff options
author | Craig Topper <craig.topper@sifive.com> | 2024-04-01 14:07:42 -0700 |
---|---|---|
committer | Craig Topper <craig.topper@sifive.com> | 2024-04-02 11:49:08 -0700 |
commit | 8c1dc5dd589ce6c056b95e43b72338ddea40789c (patch) | |
tree | e04f478490d5e549a13fdd7116a528532bb76471 /llvm/test/CodeGen/RISCV | |
parent | d595080b48297c6225eedb71d1985786fa9d55bd (diff) | |
download | llvm-8c1dc5dd589ce6c056b95e43b72338ddea40789c.zip llvm-8c1dc5dd589ce6c056b95e43b72338ddea40789c.tar.gz llvm-8c1dc5dd589ce6c056b95e43b72338ddea40789c.tar.bz2 |
[RISCV] Add test for miscompile of vector.interleave when odd vector is literal poison.
The interleave lowering relies on a math trick that requires passing
the odd vector to two math instructions. In order to be correct
these instructions must see the same value.
If the odd vector is provably poison or undef, SelectionDAG will
create a vwadd and vwmaccu where the operand is a copy from IMPLICIT_DEF.
Later this will become just the undef flag on the operand. This
gives the register allocator freedom to pick a different register
for each instruction.
Diffstat (limited to 'llvm/test/CodeGen/RISCV')
-rw-r--r-- | llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll b/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll index 1acc0fe..47cc4f0 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vector-interleave.ll @@ -656,6 +656,31 @@ define <vscale x 16 x double> @vector_interleave_nxv16f64_nxv8f64(<vscale x 8 x ret <vscale x 16 x double> %res } +; FIXME: The last operand to the vwaddu.vv and vwmaccu.vx are both undef. They +; need to be the same register with the same contents. Otherwise, the even +; elements will not contain just the values from %a. +define <vscale x 8 x i32> @vector_interleave_nxv8i32_nxv4i32_poison(<vscale x 4 x i32> %a) { +; CHECK-LABEL: vector_interleave_nxv8i32_nxv4i32_poison: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma +; CHECK-NEXT: vwaddu.vv v12, v8, v10 +; CHECK-NEXT: li a0, -1 +; CHECK-NEXT: vwmaccu.vx v12, a0, v8 +; CHECK-NEXT: vmv4r.v v8, v12 +; CHECK-NEXT: ret +; +; ZVBB-LABEL: vector_interleave_nxv8i32_nxv4i32_poison: +; ZVBB: # %bb.0: +; ZVBB-NEXT: li a0, 32 +; ZVBB-NEXT: vsetvli a1, zero, e32, m2, ta, ma +; ZVBB-NEXT: vwsll.vx v12, v10, a0 +; ZVBB-NEXT: vwaddu.wv v12, v12, v8 +; ZVBB-NEXT: vmv4r.v v8, v12 +; ZVBB-NEXT: ret + %res = call <vscale x 8 x i32> @llvm.experimental.vector.interleave2.nxv8i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> poison) + ret <vscale x 8 x i32> %res +} + declare <vscale x 64 x half> @llvm.experimental.vector.interleave2.nxv64f16(<vscale x 32 x half>, <vscale x 32 x half>) declare <vscale x 32 x float> @llvm.experimental.vector.interleave2.nxv32f32(<vscale x 16 x float>, <vscale x 16 x float>) declare <vscale x 16 x double> @llvm.experimental.vector.interleave2.nxv16f64(<vscale x 8 x double>, <vscale x 8 x double>) |