Skip to content

Commit 1b16845

Browse files
committed
[RISCV] Combine (vp.splice (insert_elt poison, scalar, 0), vec, 0, mask, 1, vl) to vslide1up.
1 parent ef2d94d commit 1b16845

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 15 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,19 @@ RISCVTargetLowering::lowerVPSpliceExperimental(SDValue Op,
1328113283
SplatZeroOp2, DAG.getUNDEF(ContainerVT), EVL2);
1328213284
}
1328313285

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

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

Lines changed: 4 additions & 10 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 float> @test_vp_splice_nxv2f32_with_firstelt(float %first, <vscale x 2 x float> %vb, <vscale x 2 x i1> %mask, i32 zeroext %evl) {
306303
; CHECK-LABEL: test_vp_splice_nxv2f32_with_firstelt:
307304
; CHECK: # %bb.0:
308-
; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
309-
; CHECK-NEXT: vfmv.s.f v9, fa0
310-
; CHECK-NEXT: vslidedown.vi v9, v9, 0, v0.t
311-
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu
312-
; CHECK-NEXT: vslideup.vi v9, v8, 1, v0.t
305+
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma
306+
; CHECK-NEXT: vfslide1up.vf v9, v8, fa0, v0.t
313307
; CHECK-NEXT: vmv.v.v v8, v9
314308
; CHECK-NEXT: ret
315309
%va = insertelement <vscale x 2 x float> poison, float %first, i32 0

0 commit comments

Comments
 (0)