Skip to content

Commit 946ac97

Browse files
committed
[RISCV] Allow undef elements in isDeinterleaveShuffle
This allows us to form vnsrl deinterleaves from non-power-of-two shuffles after they've been legalized to a power of two.
1 parent faa385a commit 946ac97

File tree

3 files changed

+10
-39
lines changed

3 files changed

+10
-39
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4475,10 +4475,10 @@ static bool isDeinterleaveShuffle(MVT VT, MVT ContainerVT, SDValue V1,
44754475
if (Mask[0] != 0 && Mask[0] != 1)
44764476
return false;
44774477

4478-
// The others must increase by 2 each time.
4479-
// TODO: Support undef elements?
4478+
// The others must increase by 2 each time (or be undef).
44804479
for (unsigned i = 1; i != Mask.size(); ++i)
4481-
if (Mask[i] != Mask[i - 1] + 2)
4480+
if (Mask[i] != Mask[i - 1] + 2 &&
4481+
Mask[i] != -1)
44824482
return false;
44834483

44844484
return true;

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-interleaved-access.ll

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,46 +12,20 @@ define {<3 x i32>, <3 x i32>} @load_factor2_v3(ptr %ptr) {
1212
; RV32: # %bb.0:
1313
; RV32-NEXT: vsetivli zero, 6, e32, m2, ta, ma
1414
; RV32-NEXT: vle32.v v10, (a0)
15-
; RV32-NEXT: vsetivli zero, 2, e32, m1, ta, ma
16-
; RV32-NEXT: vslidedown.vi v9, v10, 2
17-
; RV32-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
18-
; RV32-NEXT: vwaddu.vv v8, v10, v9
19-
; RV32-NEXT: li a0, -1
20-
; RV32-NEXT: vwmaccu.vx v8, a0, v9
21-
; RV32-NEXT: vmv.v.i v0, 4
22-
; RV32-NEXT: vsetivli zero, 4, e32, m2, ta, ma
23-
; RV32-NEXT: vslidedown.vi v12, v10, 4
24-
; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu
25-
; RV32-NEXT: vrgather.vi v8, v12, 0, v0.t
26-
; RV32-NEXT: vid.v v9
27-
; RV32-NEXT: vadd.vv v9, v9, v9
28-
; RV32-NEXT: vadd.vi v11, v9, 1
29-
; RV32-NEXT: vrgather.vv v9, v10, v11
30-
; RV32-NEXT: vrgather.vi v9, v12, 1, v0.t
15+
; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma
16+
; RV32-NEXT: vnsrl.wi v8, v10, 0
17+
; RV32-NEXT: li a0, 32
18+
; RV32-NEXT: vnsrl.wx v9, v10, a0
3119
; RV32-NEXT: ret
3220
;
3321
; RV64-LABEL: load_factor2_v3:
3422
; RV64: # %bb.0:
3523
; RV64-NEXT: vsetivli zero, 6, e32, m2, ta, ma
3624
; RV64-NEXT: vle32.v v10, (a0)
25+
; RV64-NEXT: li a0, 32
3726
; RV64-NEXT: vsetivli zero, 4, e32, m1, ta, ma
38-
; RV64-NEXT: vid.v v8
39-
; RV64-NEXT: vadd.vv v8, v8, v8
40-
; RV64-NEXT: vadd.vi v8, v8, 1
41-
; RV64-NEXT: vrgather.vv v9, v10, v8
42-
; RV64-NEXT: vmv.v.i v0, 4
43-
; RV64-NEXT: vsetivli zero, 4, e32, m2, ta, ma
44-
; RV64-NEXT: vslidedown.vi v12, v10, 4
45-
; RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu
46-
; RV64-NEXT: vrgather.vi v9, v12, 1, v0.t
47-
; RV64-NEXT: vsetivli zero, 2, e32, m1, ta, ma
48-
; RV64-NEXT: vslidedown.vi v11, v10, 2
49-
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
50-
; RV64-NEXT: vwaddu.vv v8, v10, v11
51-
; RV64-NEXT: li a0, -1
52-
; RV64-NEXT: vwmaccu.vx v8, a0, v11
53-
; RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu
54-
; RV64-NEXT: vrgather.vi v8, v12, 0, v0.t
27+
; RV64-NEXT: vnsrl.wx v9, v10, a0
28+
; RV64-NEXT: vnsrl.wi v8, v10, 0
5529
; RV64-NEXT: ret
5630
%interleaved.vec = load <6 x i32>, ptr %ptr
5731
%v0 = shufflevector <6 x i32> %interleaved.vec, <6 x i32> poison, <3 x i32> <i32 0, i32 2, i32 4>

llvm/test/CodeGen/RISCV/rvv/vector-deinterleave-fixed.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,3 @@ declare {<2 x float>, <2 x float>} @llvm.vector.deinterleave2.v4f32(<4 x float>)
269269
declare {<8 x half>, <8 x half>} @llvm.vector.deinterleave2.v16f16(<16 x half>)
270270
declare {<4 x float>, <4 x float>} @llvm.vector.deinterleave2.v8f32(<8 x float>)
271271
declare {<2 x double>, <2 x double>} @llvm.vector.deinterleave2.v4f64(<4 x double>)
272-
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
273-
; RV32: {{.*}}
274-
; RV64: {{.*}}

0 commit comments

Comments
 (0)