Skip to content

Commit 092dd0a

Browse files
committed
[RISCV] Try to optimize vp.splice to vslide1up.
Fold (vp.splice (insert_elt poison, scalar, 0), vec, 0, mask, 1, vl) to (vslide1up vec, scalar, mask. vl). Fold (vp.splice (splat_vector scalar), vec, 0, mask, 1, vl) to (vslide1up vec, scalar, mask. vl).
1 parent 9ea5841 commit 092dd0a

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13237,6 +13237,8 @@ SDValue RISCVTargetLowering::lowerVPMergeMask(SDValue Op,
1323713237
SDValue
1323813238
RISCVTargetLowering::lowerVPSpliceExperimental(SDValue Op,
1323913239
SelectionDAG &DAG) const {
13240+
using namespace SDPatternMatch;
13241+
1324013242
SDLoc DL(Op);
1324113243

1324213244
SDValue Op1 = Op.getOperand(0);
@@ -13281,6 +13283,20 @@ RISCVTargetLowering::lowerVPSpliceExperimental(SDValue Op,
1328113283
SplatZeroOp2, DAG.getUNDEF(ContainerVT), EVL2);
1328213284
}
1328313285

13286+
SDValue FirstEle;
13287+
if (!IsMaskVector && isNullConstant(Offset) && isOneConstant(EVL1) &&
13288+
sd_match(Op1,
13289+
m_AnyOf(m_InsertElt(m_Poison(), m_Value(FirstEle), m_Zero()),
13290+
m_Node(ISD::SPLAT_VECTOR, m_Value(FirstEle))))) {
13291+
SDValue Result = DAG.getNode(
13292+
ContainerVT.isFloatingPoint() ? RISCVISD::VFSLIDE1UP_VL
13293+
: RISCVISD::VSLIDE1UP_VL,
13294+
DL, ContainerVT, DAG.getUNDEF(ContainerVT), Op2, FirstEle, Mask, EVL2);
13295+
return VT.isFixedLengthVector()
13296+
? convertFromScalableVector(VT, Result, DAG, Subtarget)
13297+
: Result;
13298+
}
13299+
1328413300
int64_t ImmValue = cast<ConstantSDNode>(Offset)->getSExtValue();
1328513301
SDValue DownOffset, UpOffset;
1328613302
if (ImmValue >= 0) {

llvm/test/CodeGen/RISCV/rvv/vp-splice.ll

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,8 @@ define <vscale x 2 x float> @test_vp_splice_nxv2f32_masked(<vscale x 2 x float>
290290
define <vscale x 2 x i32> @test_vp_splice_nxv2i32_with_firstelt(i32 %first, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %mask, i32 zeroext %evl) {
291291
; CHECK-LABEL: test_vp_splice_nxv2i32_with_firstelt:
292292
; CHECK: # %bb.0:
293-
; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma
294-
; CHECK-NEXT: vmv.s.x v9, a0
295-
; CHECK-NEXT: vslidedown.vi v9, v9, 0, v0.t
296-
; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu
297-
; CHECK-NEXT: vslideup.vi v9, v8, 1, v0.t
293+
; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
294+
; CHECK-NEXT: vslide1up.vx v9, v8, a0, v0.t
298295
; CHECK-NEXT: vmv.v.v v8, v9
299296
; CHECK-NEXT: ret
300297
%va = insertelement <vscale x 2 x i32> poison, i32 %first, i32 0
@@ -305,11 +302,8 @@ define <vscale x 2 x i32> @test_vp_splice_nxv2i32_with_firstelt(i32 %first, <vsc
305302
define <vscale x 2 x i32> @test_vp_splice_nxv2i32_with_splat_firstelt(i32 %first, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %mask, i32 zeroext %evl) {
306303
; CHECK-LABEL: test_vp_splice_nxv2i32_with_splat_firstelt:
307304
; CHECK: # %bb.0:
308-
; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma
309-
; CHECK-NEXT: vmv.v.x v9, a0
310-
; CHECK-NEXT: vslidedown.vi v9, v9, 0, v0.t
311-
; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu
312-
; CHECK-NEXT: vslideup.vi v9, v8, 1, v0.t
305+
; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma
306+
; CHECK-NEXT: vslide1up.vx v9, v8, a0, v0.t
313307
; CHECK-NEXT: vmv.v.v v8, v9
314308
; CHECK-NEXT: ret
315309
%ins = insertelement <vscale x 2 x i32> poison, i32 %first, i32 0
@@ -321,11 +315,8 @@ define <vscale x 2 x i32> @test_vp_splice_nxv2i32_with_splat_firstelt(i32 %first
321315
define <vscale x 2 x float> @test_vp_splice_nxv2f32_with_firstelt(float %first, <vscale x 2 x float> %vb, <vscale x 2 x i1> %mask, i32 zeroext %evl) {
322316
; CHECK-LABEL: test_vp_splice_nxv2f32_with_firstelt:
323317
; CHECK: # %bb.0:
324-
; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
325-
; CHECK-NEXT: vfmv.s.f v9, fa0
326-
; CHECK-NEXT: vslidedown.vi v9, v9, 0, v0.t
327-
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu
328-
; CHECK-NEXT: vslideup.vi v9, v8, 1, v0.t
318+
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
319+
; CHECK-NEXT: vfslide1up.vf v9, v8, fa0, v0.t
329320
; CHECK-NEXT: vmv.v.v v8, v9
330321
; CHECK-NEXT: ret
331322
%va = insertelement <vscale x 2 x float> poison, float %first, i32 0

0 commit comments

Comments
 (0)