diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2217,14 +2217,21 @@ } if (ConstantSDNode *C = isConstOrConstSplat(V)) { switch (Opcode) { - case ISD::ADD: // X + 0 --> X - case ISD::SUB: // X - 0 --> X - case ISD::SHL: // X << 0 --> X - case ISD::SRA: // X s>> 0 --> X - case ISD::SRL: // X u>> 0 --> X + case ISD::ADD: // X + 0 --> X + case ISD::SUB: // X - 0 --> X + case ISD::SHL: // X << 0 --> X + case ISD::SRA: // X s>> 0 --> X + case ISD::SRL: // X u>> 0 --> X + case ISD::UMAX: // maxu(X, 0) --> X + case ISD::OR: // or(X, 0) --> X return C->isZero(); - case ISD::MUL: // X * 1 --> X + case ISD::MUL: // X * 1 --> X + case ISD::SDIV: // divs(X, 1) --> X + case ISD::UDIV: // divu(X, 1) --> X return C->isOne(); + case ISD::AND: // and(X, -1) --> X + case ISD::UMIN: // minu(X, -1) --> X + return C->isAllOnes(); } } return false; diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.h b/llvm/lib/Target/RISCV/RISCVISelLowering.h --- a/llvm/lib/Target/RISCV/RISCVISelLowering.h +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.h @@ -406,6 +406,9 @@ CallingConv::ID CC, EVT VT) const override; + bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, + EVT VT) const override; + /// Return true if the given shuffle mask can be codegen'd directly, or if it /// should be stack expanded. bool isShuffleMaskLegal(ArrayRef M, EVT VT) const override; diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -1202,6 +1202,21 @@ return C && C->getAPIntValue().ule(10); } +bool RISCVTargetLowering::shouldFoldSelectWithIdentityConstant(unsigned Opcode, + EVT VT) const { + // Only enable for rvv. + if (!VT.isVector() || !Subtarget.hasVInstructions()) + return false; + + if (VT.getScalarSizeInBits() >= Subtarget.getELEN()) + return false; + + if (VT.isFixedLengthVector() && !Subtarget.useRVVForFixedLengthVectors()) + return false; + + return true; +} + bool RISCVTargetLowering::shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const { assert(Ty->isIntegerTy()); diff --git a/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vadd-sdnode.ll @@ -895,9 +895,7 @@ ; CHECK-LABEL: vadd_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = add %va, %vs @@ -908,9 +906,7 @@ ; CHECK-LABEL: vadd_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -923,9 +919,7 @@ ; CHECK-LABEL: vadd_vi_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vadd.vv v8, v8, v12 +; CHECK-NEXT: vadd.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vand-sdnode.ll @@ -1386,9 +1386,7 @@ ; CHECK-LABEL: vand_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, -1 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: vand.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 -1, i32 0 %allones = shufflevector %head, poison, zeroinitializer @@ -1401,9 +1399,7 @@ ; CHECK-LABEL: vand_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, -1 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: vand.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 -1, i32 0 %allones = shufflevector %head1, poison, zeroinitializer @@ -1418,9 +1414,7 @@ ; CHECK-LABEL: vand_vi_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, -1 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vand.vv v8, v8, v12 +; CHECK-NEXT: vand.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 -1, i32 0 %allones = shufflevector %head1, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode.ll @@ -1189,9 +1189,7 @@ ; CHECK-LABEL: vdiv_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 1 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vdiv.vv v8, v8, v12 +; CHECK-NEXT: vdiv.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 1, i32 0 %one = shufflevector %head, poison, zeroinitializer @@ -1204,9 +1202,7 @@ ; CHECK-LABEL: vdiv_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vdiv.vv v8, v8, v12 +; CHECK-NEXT: vdiv.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer @@ -1218,13 +1214,29 @@ } define @vdiv_vi_mask_nxv8i32( %va, %mask) { -; CHECK-LABEL: vdiv_vi_mask_nxv8i32: -; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vdiv.vv v8, v8, v12 -; CHECK-NEXT: ret +; RV32-LABEL: vdiv_vi_mask_nxv8i32: +; RV32: # %bb.0: +; RV32-NEXT: lui a0, 599186 +; RV32-NEXT: addi a0, a0, 1171 +; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; RV32-NEXT: vmulh.vx v12, v8, a0 +; RV32-NEXT: vadd.vv v12, v12, v8 +; RV32-NEXT: vsrl.vi v16, v12, 31 +; RV32-NEXT: vsra.vi v12, v12, 2 +; RV32-NEXT: vadd.vv v8, v12, v16, v0.t +; RV32-NEXT: ret +; +; RV64-LABEL: vdiv_vi_mask_nxv8i32: +; RV64: # %bb.0: +; RV64-NEXT: lui a0, 599186 +; RV64-NEXT: addiw a0, a0, 1171 +; RV64-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; RV64-NEXT: vmulh.vx v12, v8, a0 +; RV64-NEXT: vadd.vv v12, v12, v8 +; RV64-NEXT: vsra.vi v12, v12, 2 +; RV64-NEXT: vsrl.vi v16, v12, 31 +; RV64-NEXT: vadd.vv v8, v12, v16, v0.t +; RV64-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer %head2 = insertelement poison, i32 7, i32 0 diff --git a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode.ll @@ -1202,9 +1202,7 @@ ; CHECK-LABEL: vdivu_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 1 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vdivu.vv v8, v8, v12 +; CHECK-NEXT: vdivu.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 1, i32 0 %one = shufflevector %head, poison, zeroinitializer @@ -1217,9 +1215,7 @@ ; CHECK-LABEL: vdivu_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vdivu.vv v8, v8, v12 +; CHECK-NEXT: vdivu.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer @@ -1231,13 +1227,29 @@ } define @vdivu_vi_mask_nxv8i32( %va, %mask) { -; CHECK-LABEL: vdivu_vi_mask_nxv8i32: -; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vdivu.vv v8, v8, v12 -; CHECK-NEXT: ret +; RV32-LABEL: vdivu_vi_mask_nxv8i32: +; RV32: # %bb.0: +; RV32-NEXT: lui a0, 149797 +; RV32-NEXT: addi a0, a0, -1755 +; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; RV32-NEXT: vmulhu.vx v12, v8, a0 +; RV32-NEXT: vsub.vv v16, v8, v12 +; RV32-NEXT: vsrl.vi v16, v16, 1 +; RV32-NEXT: vadd.vv v12, v16, v12 +; RV32-NEXT: vsrl.vi v8, v12, 2, v0.t +; RV32-NEXT: ret +; +; RV64-LABEL: vdivu_vi_mask_nxv8i32: +; RV64: # %bb.0: +; RV64-NEXT: lui a0, 149797 +; RV64-NEXT: addiw a0, a0, -1755 +; RV64-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; RV64-NEXT: vmulhu.vx v12, v8, a0 +; RV64-NEXT: vsub.vv v16, v8, v12 +; RV64-NEXT: vsrl.vi v16, v16, 1 +; RV64-NEXT: vadd.vv v12, v16, v12 +; RV64-NEXT: vsrl.vi v8, v12, 2, v0.t +; RV64-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer %head2 = insertelement poison, i32 7, i32 0 diff --git a/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vmul-sdnode.ll @@ -964,9 +964,7 @@ ; CHECK-LABEL: vmul_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 1 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: vmul.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 1, i32 0 %one = shufflevector %head, poison, zeroinitializer @@ -979,9 +977,7 @@ ; CHECK-LABEL: vmul_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer @@ -995,10 +991,9 @@ define @vmul_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vmul_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 1 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vmul.vv v8, v8, v12 +; CHECK-NEXT: li a0, 7 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head1 = insertelement poison, i32 1, i32 0 %one = shufflevector %head1, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vor-sdnode.ll @@ -1179,9 +1179,7 @@ ; CHECK-LABEL: vor_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: vor.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = or %va, %vs @@ -1192,9 +1190,7 @@ ; CHECK-LABEL: vor_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: vor.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -1207,9 +1203,7 @@ ; CHECK-LABEL: vor_vi_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vor.vv v8, v8, v12 +; CHECK-NEXT: vor.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vshl-sdnode.ll @@ -634,9 +634,7 @@ ; CHECK-LABEL: vshl_vv_mask_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: vsll.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = shl %va, %vs @@ -647,9 +645,7 @@ ; CHECK-LABEL: vshl_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: vsll.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -662,10 +658,7 @@ ; CHECK-LABEL: vshl_vi_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: li a0, 31 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsll.vv v8, v8, v12 +; CHECK-NEXT: vsll.vi v8, v8, 31, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 31, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsra-sdnode.ll @@ -806,9 +806,7 @@ ; CHECK-LABEL: vsra_vv_mask_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: vsra.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = ashr %va, %vs @@ -819,9 +817,7 @@ ; CHECK-LABEL: vsra_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: vsra.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -834,10 +830,7 @@ ; CHECK-LABEL: vsra_vi_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: li a0, 31 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsra.vv v8, v8, v12 +; CHECK-NEXT: vsra.vi v8, v8, 31, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 31, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsrl-sdnode.ll @@ -586,9 +586,7 @@ ; CHECK-LABEL: vsrl_vv_mask_nxv4i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: vsrl.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = lshr %va, %vs @@ -599,9 +597,7 @@ ; CHECK-LABEL: vsrl_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: vsrl.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -614,10 +610,7 @@ ; CHECK-LABEL: vsrl_vi_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: li a0, 31 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsrl.vv v8, v8, v12 +; CHECK-NEXT: vsrl.vi v8, v8, 31, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 31, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vsub-sdnode.ll @@ -873,9 +873,7 @@ ; CHECK-LABEL: vsub_vv_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v16, 0 -; CHECK-NEXT: vmerge.vvm v12, v16, v12, v0 -; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer @@ -887,9 +885,7 @@ ; CHECK-LABEL: vsub_vx_mask_nxv8i32: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vxm v12, v12, a0, v0 -; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: vsub.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -901,10 +897,9 @@ define @vsub_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vsub_vi_mask_nxv8i32: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu -; CHECK-NEXT: vmv.v.i v12, 0 -; CHECK-NEXT: vmerge.vim v12, v12, 7, v0 -; CHECK-NEXT: vsub.vv v8, v8, v12 +; CHECK-NEXT: li a0, 7 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vsub.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer