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 @@ -975,7 +975,9 @@ if (Subtarget.hasVInstructions()) setTargetDAGCombine({ISD::FCOPYSIGN, ISD::MGATHER, ISD::MSCATTER, ISD::VP_GATHER, ISD::VP_SCATTER, ISD::SRA, ISD::SRL, - ISD::SHL, ISD::STORE, ISD::SPLAT_VECTOR}); + ISD::SHL, ISD::STORE, ISD::SPLAT_VECTOR, ISD::MUL, + ISD::UDIV, ISD::SDIV, ISD::UMIN, ISD::UMAX}); + if (Subtarget.useRVVForFixedLengthVectors()) setTargetDAGCombine(ISD::BITCAST); @@ -8266,8 +8268,104 @@ return DAG.getNode(ISD::ADD, DL, VT, New1, DAG.getConstant(CB, DL, VT)); } +// fold op(a, select(mask, b, imm)) -> op_mask(a, b, mask) if op(a, imm) == a. +// TODO: Support FP ops. +static SDValue performVBinMaskCombine(SDNode *N, SelectionDAG &DAG, + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { + if (!DCI.isAfterLegalizeDAG()) + return SDValue(); + + EVT VT = N->getValueType(0); + + if (!VT.isVector()) + return SDValue(); + + // TODO: Support fixed vector. + if (VT.isFixedLengthVector()) + return SDValue(); + + SDValue N0 = N->getOperand(0); + SDValue N1 = N->getOperand(1); + + const TargetLowering &TLI = DAG.getTargetLoweringInfo(); + bool IsCommutable = TLI.isCommutativeBinOp(N->getOpcode()); + + if (N1.getOpcode() != ISD::VSELECT) { + if (!IsCommutable || N0.getOpcode() != ISD::VSELECT) + return SDValue(); + std::swap(N0, N1); + } + + if (!N1.hasOneUse()) + return SDValue(); + + SDValue Mask = N1->getOperand(0); + SDValue TrueVal = N1->getOperand(1); + SDValue FalseVal = N1->getOperand(2); + + unsigned EltSize = VT.getScalarSizeInBits(); + + int64_t SplatImm; + + if (FalseVal.getOpcode() == ISD::SPLAT_VECTOR && + isa(FalseVal.getOperand(0))) + SplatImm = cast(FalseVal.getOperand(0)) + ->getAPIntValue() + .sextOrTrunc(EltSize) + .getSExtValue(); + else if (FalseVal.getOpcode() == RISCVISD::VMV_V_X_VL && + FalseVal.getOperand(0).isUndef() && + isa(FalseVal.getOperand(1))) + SplatImm = cast(FalseVal.getOperand(1)) + ->getAPIntValue() + .sextOrTrunc(EltSize) + .getSExtValue(); + else + return SDValue(); + + unsigned RISCVVLISDOpc; + int64_t IdentityImm; + +#define OP_CASE(OP, IDENTIFY_VALUE) \ + case ISD::OP: \ + RISCVVLISDOpc = RISCVISD::OP##_VL; \ + IdentityImm = IDENTIFY_VALUE; \ + break; + + switch (N->getOpcode()) { + OP_CASE(ADD, 0) + OP_CASE(SUB, 0) + OP_CASE(MUL, 1) + OP_CASE(UDIV, 1) + OP_CASE(SDIV, 1) + OP_CASE(AND, -1) + OP_CASE(OR, 0) + OP_CASE(XOR, 0) + OP_CASE(SHL, 0) + OP_CASE(SRL, 0) + OP_CASE(SRA, 0) + OP_CASE(UMIN, -1) + OP_CASE(UMAX, 0) + default: + return SDValue(); + } + +#undef OP_CASE + + if (SplatImm != IdentityImm) + return SDValue(); + + SDValue VL = DAG.getRegister(RISCV::X0, Subtarget.getXLenVT()); + + return DAG.getNode(RISCVVLISDOpc, SDLoc(N), VT, N0, TrueVal, N0, Mask, VL); +} + static SDValue performADDCombine(SDNode *N, SelectionDAG &DAG, - const RISCVSubtarget &Subtarget) { + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; if (SDValue V = transformAddImmMulImm(N, DAG, Subtarget)) return V; if (SDValue V = transformAddShlImm(N, DAG, Subtarget)) @@ -8279,7 +8377,12 @@ return combineSelectAndUseCommutative(N, DAG, /*AllOnes*/ false); } -static SDValue performSUBCombine(SDNode *N, SelectionDAG &DAG) { +static SDValue performSUBCombine(SDNode *N, SelectionDAG &DAG, + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; + SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); @@ -8310,7 +8413,11 @@ } static SDValue performANDCombine(SDNode *N, SelectionDAG &DAG, - const RISCVSubtarget &Subtarget) { + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; + SDValue N0 = N->getOperand(0); // Pre-promote (i32 (and (srl X, Y), 1)) on RV64 with Zbs without zero // extending X. This is safe since we only need the LSB after the shift and @@ -8339,7 +8446,11 @@ } static SDValue performORCombine(SDNode *N, SelectionDAG &DAG, - const RISCVSubtarget &Subtarget) { + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; + if (Subtarget.hasStdExtZbp()) { if (auto GREV = combineORToGREV(SDValue(N, 0), DAG, Subtarget)) return GREV; @@ -8356,7 +8467,12 @@ return combineSelectAndUseCommutative(N, DAG, /*AllOnes*/ false); } -static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG) { +static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG, + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; + SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); @@ -8866,9 +8982,13 @@ } static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG, - const RISCVSubtarget &Subtarget) { + const RISCVSubtarget &Subtarget, + TargetLowering::DAGCombinerInfo &DCI) { assert(N->getOpcode() == ISD::SRA && "Unexpected opcode"); + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; + if (N->getValueType(0) != MVT::i64 || !Subtarget.is64Bit()) return SDValue(); @@ -9239,18 +9359,25 @@ DAG.getConstant(~SignBit, DL, VT)); } case ISD::ADD: - return performADDCombine(N, DAG, Subtarget); + return performADDCombine(N, DAG, Subtarget, DCI); case ISD::SUB: - return performSUBCombine(N, DAG); + return performSUBCombine(N, DAG, Subtarget, DCI); + case ISD::MUL: + case ISD::UDIV: + case ISD::SDIV: + return performVBinMaskCombine(N, DAG, Subtarget, DCI); case ISD::AND: - return performANDCombine(N, DAG, Subtarget); + return performANDCombine(N, DAG, Subtarget, DCI); case ISD::OR: - return performORCombine(N, DAG, Subtarget); + return performORCombine(N, DAG, Subtarget, DCI); case ISD::XOR: - return performXORCombine(N, DAG); - case ISD::FADD: + return performXORCombine(N, DAG, Subtarget, DCI); case ISD::UMAX: case ISD::UMIN: + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; + [[fallthrough]]; + case ISD::FADD: case ISD::SMAX: case ISD::SMIN: case ISD::FMAXNUM: @@ -9442,11 +9569,13 @@ break; } case ISD::SRA: - if (SDValue V = performSRACombine(N, DAG, Subtarget)) + if (SDValue V = performSRACombine(N, DAG, Subtarget, DCI)) return V; [[fallthrough]]; case ISD::SRL: case ISD::SHL: { + if (SDValue V = performVBinMaskCombine(N, DAG, Subtarget, DCI)) + return V; SDValue ShAmt = N->getOperand(1); if (ShAmt.getOpcode() == RISCVISD::SPLAT_VECTOR_SPLIT_I64_VL) { // We don't need the upper 32 bits of a 64-bit element for a shift amount. 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 @@ -1220,10 +1216,9 @@ 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: li a0, 7 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vdiv.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/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 @@ -1233,10 +1229,9 @@ 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: li a0, 7 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vdivu.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/vmaxu-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vmaxu-sdnode.ll @@ -894,9 +894,7 @@ ; CHECK-LABEL: vmax_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: vmaxu.vv v8, v8, v12 +; CHECK-NEXT: vmaxu.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %cmp = icmp ugt %va, %vs @@ -908,9 +906,7 @@ ; CHECK-LABEL: vmax_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: vmaxu.vv v8, v8, v12 +; CHECK-NEXT: vmaxu.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -923,10 +919,9 @@ define @vmax_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vmax_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, -3, v0 -; CHECK-NEXT: vmaxu.vv v8, v8, v12 +; CHECK-NEXT: li a0, -3 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vmaxu.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 -3, i32 0 %splat = shufflevector %head, poison, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vminu-sdnode.ll @@ -894,9 +894,7 @@ ; CHECK-LABEL: vmin_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: vminu.vv v8, v8, v12 +; CHECK-NEXT: vminu.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 -1, i32 0 %max = shufflevector %head, poison, zeroinitializer @@ -910,9 +908,7 @@ ; CHECK-LABEL: vmin_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: vminu.vv v8, v8, v12 +; CHECK-NEXT: vminu.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head0 = insertelement poison, i32 -1, i32 0 %max = shufflevector %head0, poison, zeroinitializer @@ -927,10 +923,9 @@ define @vmin_vi_mask_nxv8i32( %va, %mask) { ; CHECK-LABEL: vmin_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, -3, v0 -; CHECK-NEXT: vminu.vv v8, v8, v12 +; CHECK-NEXT: li a0, -3 +; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu +; CHECK-NEXT: vminu.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head0 = insertelement poison, i32 -1, i32 0 %max = shufflevector %head0, poison, zeroinitializer 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/vrem-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode.ll @@ -1234,4 +1234,3 @@ %vc = srem %va, %splat ret %vc } - 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 diff --git a/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll --- a/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vxor-sdnode.ll @@ -1386,9 +1386,7 @@ ; CHECK-LABEL: vxor_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: vxor.vv v8, v8, v12 +; CHECK-NEXT: vxor.vv v8, v8, v12, v0.t ; CHECK-NEXT: ret %vs = select %mask, %vb, zeroinitializer %vc = xor %va, %vs @@ -1399,9 +1397,7 @@ ; CHECK-LABEL: vxor_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: vxor.vv v8, v8, v12 +; CHECK-NEXT: vxor.vx v8, v8, a0, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 %b, i32 0 %splat = shufflevector %head, poison, zeroinitializer @@ -1414,9 +1410,7 @@ ; CHECK-LABEL: vxor_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: vxor.vv v8, v8, v12 +; CHECK-NEXT: vxor.vi v8, v8, 7, v0.t ; CHECK-NEXT: ret %head = insertelement poison, i32 7, i32 0 %splat = shufflevector %head, poison, zeroinitializer