Skip to content

Commit 01ee922

Browse files
committed
[RISCV] Add coverage for missing vrgather.vi shuffle case
If we have a near identity shuffle with a single element repeated, we manage to match this as a masked vrgather.vi for the two operand forms, but not the single operand form. If the scalar being repeated was a scalar just inserted into the vector, we're also missing a chance to recognize a vmerge.vxm or vmerge.vim in both cases.
1 parent 6a9e8fc commit 01ee922

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-int.ll

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,3 +1415,67 @@ define <8 x i32> @shuffle_v8i32_locally_repeating_neg(<8 x i32> %a) {
14151415
%res = shufflevector <8 x i32> %a, <8 x i32> poison, <8 x i32> <i32 1, i32 0, i32 poison, i32 poison, i32 5, i32 4, i32 6, i32 6>
14161416
ret <8 x i32> %res
14171417
}
1418+
1419+
define <8 x i8> @identity_splat0(<8 x i8> %v) {
1420+
; CHECK-LABEL: identity_splat0:
1421+
; CHECK: # %bb.0:
1422+
; CHECK-NEXT: lui a0, %hi(.LCPI88_0)
1423+
; CHECK-NEXT: addi a0, a0, %lo(.LCPI88_0)
1424+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
1425+
; CHECK-NEXT: vle8.v v10, (a0)
1426+
; CHECK-NEXT: vrgather.vv v9, v8, v10
1427+
; CHECK-NEXT: vmv1r.v v8, v9
1428+
; CHECK-NEXT: ret
1429+
%shuf = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 0, i32 0, i32 5, i32 6, i32 7>
1430+
ret <8 x i8> %shuf
1431+
}
1432+
1433+
define <8 x i8> @identity_splat2(<8 x i8> %v) {
1434+
; CHECK-LABEL: identity_splat2:
1435+
; CHECK: # %bb.0:
1436+
; CHECK-NEXT: lui a0, %hi(.LCPI89_0)
1437+
; CHECK-NEXT: addi a0, a0, %lo(.LCPI89_0)
1438+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
1439+
; CHECK-NEXT: vle8.v v10, (a0)
1440+
; CHECK-NEXT: vrgather.vv v9, v8, v10
1441+
; CHECK-NEXT: vmv1r.v v8, v9
1442+
; CHECK-NEXT: ret
1443+
%shuf = shufflevector <8 x i8> %v, <8 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 2, i32 2, i32 5, i32 6, i32 7>
1444+
ret <8 x i8> %shuf
1445+
}
1446+
1447+
1448+
define <8 x i8> @vmerge_vxm(<8 x i8> %v, i8 %s) {
1449+
; CHECK-LABEL: vmerge_vxm:
1450+
; CHECK: # %bb.0:
1451+
; CHECK-NEXT: lui a1, %hi(.LCPI90_0)
1452+
; CHECK-NEXT: addi a1, a1, %lo(.LCPI90_0)
1453+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
1454+
; CHECK-NEXT: vle8.v v10, (a1)
1455+
; CHECK-NEXT: vsetvli zero, zero, e8, mf2, tu, ma
1456+
; CHECK-NEXT: vmv.s.x v8, a0
1457+
; CHECK-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
1458+
; CHECK-NEXT: vrgather.vv v9, v8, v10
1459+
; CHECK-NEXT: vmv1r.v v8, v9
1460+
; CHECK-NEXT: ret
1461+
%ins = insertelement <8 x i8> %v, i8 %s, i32 0
1462+
%shuf = shufflevector <8 x i8> %ins, <8 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 0, i32 0, i32 5, i32 6, i32 7>
1463+
ret <8 x i8> %shuf
1464+
}
1465+
1466+
define <8 x i8> @vmerge_vxm2(<8 x i8> %v, i8 %s) {
1467+
; CHECK-LABEL: vmerge_vxm2:
1468+
; CHECK: # %bb.0:
1469+
; CHECK-NEXT: li a1, 25
1470+
; CHECK-NEXT: vsetivli zero, 1, e8, m1, tu, ma
1471+
; CHECK-NEXT: vmv.s.x v0, a1
1472+
; CHECK-NEXT: vmv1r.v v9, v8
1473+
; CHECK-NEXT: vmv.s.x v9, a0
1474+
; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu
1475+
; CHECK-NEXT: vrgather.vi v8, v9, 0, v0.t
1476+
; CHECK-NEXT: ret
1477+
%ins = insertelement <8 x i8> %v, i8 %s, i32 0
1478+
%shuf = shufflevector <8 x i8> %v, <8 x i8> %ins, <8 x i32> <i32 8, i32 1, i32 2, i32 8, i32 8, i32 5, i32 6, i32 7>
1479+
ret <8 x i8> %shuf
1480+
}
1481+

0 commit comments

Comments
 (0)