diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index 9855028ead9e2..63864dd0e323d 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -3538,7 +3538,8 @@ bool RISCVDAGToDAGISel::selectVSplat(SDValue N, SDValue &SplatVal) { static bool selectVSplatImmHelper(SDValue N, SDValue &SplatVal, SelectionDAG &DAG, const RISCVSubtarget &Subtarget, - std::function ValidateImm) { + std::function ValidateImm, + bool Decrement = false) { SDValue Splat = findVSplat(N); if (!Splat || !isa(Splat.getOperand(1))) return false; @@ -3561,6 +3562,9 @@ static bool selectVSplatImmHelper(SDValue N, SDValue &SplatVal, if (!ValidateImm(SplatImm)) return false; + if (Decrement) + SplatImm -= 1; + SplatVal = DAG.getSignedTargetConstant(SplatImm, SDLoc(N), Subtarget.getXLenVT()); return true; @@ -3574,15 +3578,18 @@ bool RISCVDAGToDAGISel::selectVSplatSimm5(SDValue N, SDValue &SplatVal) { bool RISCVDAGToDAGISel::selectVSplatSimm5Plus1(SDValue N, SDValue &SplatVal) { return selectVSplatImmHelper( N, SplatVal, *CurDAG, *Subtarget, - [](int64_t Imm) { return (isInt<5>(Imm) && Imm != -16) || Imm == 16; }); + [](int64_t Imm) { return (isInt<5>(Imm) && Imm != -16) || Imm == 16; }, + /*Decrement=*/true); } bool RISCVDAGToDAGISel::selectVSplatSimm5Plus1NonZero(SDValue N, SDValue &SplatVal) { return selectVSplatImmHelper( - N, SplatVal, *CurDAG, *Subtarget, [](int64_t Imm) { + N, SplatVal, *CurDAG, *Subtarget, + [](int64_t Imm) { return Imm != 0 && ((isInt<5>(Imm) && Imm != -16) || Imm == 16); - }); + }, + /*Decrement=*/true); } bool RISCVDAGToDAGISel::selectVSplatUimm(SDValue N, unsigned Bits, diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td index 880ea0ae0a976..8f77b2ce34d1f 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVSDPatterns.td @@ -313,29 +313,10 @@ multiclass VPatIntegerSetCCSDNode_VX_Swappable; multiclass VPatIntegerSetCCSDNode_VI_Swappable + CondCode cc, CondCode invcc, + ComplexPattern splatpat_kind = SplatPat_simm5> : VPatIntegerSetCCSDNode_XI_Swappable; - -multiclass VPatIntegerSetCCSDNode_VIPlus1_Swappable { - foreach vti = AllIntegerVectors in { - defvar instruction = !cast(instruction_name#"_VI_"#vti.LMul.MX); - let Predicates = GetVTypePredicates.Predicates in { - def : Pat<(vti.Mask (setcc (vti.Vector vti.RegClass:$rs1), - (vti.Vector (splatpat_kind simm5:$rs2)), - cc)), - (instruction vti.RegClass:$rs1, (DecImm simm5:$rs2), - vti.AVL, vti.Log2SEW)>; - def : Pat<(vti.Mask (setcc (vti.Vector (splatpat_kind simm5:$rs2)), - (vti.Vector vti.RegClass:$rs1), - invcc)), - (instruction vti.RegClass:$rs1, (DecImm simm5:$rs2), - vti.AVL, vti.Log2SEW)>; - } - } -} + splatpat_kind, simm5>; multiclass VPatFPSetCCSDNode_VV_VF_FV; defm : VPatIntegerSetCCSDNode_VI_Swappable<"PseudoVMSGT", SETGT, SETLT>; defm : VPatIntegerSetCCSDNode_VI_Swappable<"PseudoVMSGTU", SETUGT, SETULT>; -defm : VPatIntegerSetCCSDNode_VIPlus1_Swappable<"PseudoVMSLE", SETLT, SETGT, - SplatPat_simm5_plus1>; -defm : VPatIntegerSetCCSDNode_VIPlus1_Swappable<"PseudoVMSLEU", SETULT, SETUGT, - SplatPat_simm5_plus1_nonzero>; -defm : VPatIntegerSetCCSDNode_VIPlus1_Swappable<"PseudoVMSGT", SETGE, SETLE, - SplatPat_simm5_plus1>; -defm : VPatIntegerSetCCSDNode_VIPlus1_Swappable<"PseudoVMSGTU", SETUGE, SETULE, - SplatPat_simm5_plus1_nonzero>; +defm : VPatIntegerSetCCSDNode_VI_Swappable<"PseudoVMSLE", SETLT, SETGT, + SplatPat_simm5_plus1>; +defm : VPatIntegerSetCCSDNode_VI_Swappable<"PseudoVMSLEU", SETULT, SETUGT, + SplatPat_simm5_plus1_nonzero>; +defm : VPatIntegerSetCCSDNode_VI_Swappable<"PseudoVMSGT", SETGE, SETLE, + SplatPat_simm5_plus1>; +defm : VPatIntegerSetCCSDNode_VI_Swappable<"PseudoVMSGTU", SETUGE, SETULE, + SplatPat_simm5_plus1_nonzero>; // 11.9. Vector Integer Min/Max Instructions defm : VPatBinarySDNode_VV_VX; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td index 2026ba79e623d..f35dc6eb2cb8b 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td @@ -1052,32 +1052,8 @@ multiclass VPatIntegerSetCCVL_VX_Swappable { - defvar instruction_masked = !cast(instruction_name#"_VI_"#vti.LMul.MX#"_MASK"); - def : Pat<(vti.Mask (riscv_setcc_vl (vti.Vector vti.RegClass:$rs1), - (SplatPat_simm5 simm5:$rs2), cc, - VR:$passthru, - (vti.Mask V0), - VLOpFrag)), - (instruction_masked VR:$passthru, vti.RegClass:$rs1, - XLenVT:$rs2, (vti.Mask V0), GPR:$vl, - vti.Log2SEW)>; - - // FIXME: Can do some canonicalization to remove these patterns. - def : Pat<(vti.Mask (riscv_setcc_vl (SplatPat_simm5 simm5:$rs2), - (vti.Vector vti.RegClass:$rs1), invcc, - VR:$passthru, - (vti.Mask V0), - VLOpFrag)), - (instruction_masked VR:$passthru, vti.RegClass:$rs1, - simm5:$rs2, (vti.Mask V0), GPR:$vl, - vti.Log2SEW)>; -} - -multiclass VPatIntegerSetCCVL_VIPlus1_Swappable { + CondCode cc, CondCode invcc, + ComplexPattern splatpat_kind = SplatPat_simm5> { defvar instruction_masked = !cast(instruction_name#"_VI_"#vti.LMul.MX#"_MASK"); def : Pat<(vti.Mask (riscv_setcc_vl (vti.Vector vti.RegClass:$rs1), (splatpat_kind simm5:$rs2), cc, @@ -1085,7 +1061,7 @@ multiclass VPatIntegerSetCCVL_VIPlus1_Swappable; // FIXME: Can do some canonicalization to remove these patterns. @@ -1095,7 +1071,7 @@ multiclass VPatIntegerSetCCVL_VIPlus1_Swappable; } @@ -2173,14 +2149,14 @@ foreach vti = AllIntegerVectors in { defm : VPatIntegerSetCCVL_VI_Swappable; defm : VPatIntegerSetCCVL_VI_Swappable; - defm : VPatIntegerSetCCVL_VIPlus1_Swappable; - defm : VPatIntegerSetCCVL_VIPlus1_Swappable; - defm : VPatIntegerSetCCVL_VIPlus1_Swappable; - defm : VPatIntegerSetCCVL_VIPlus1_Swappable; + defm : VPatIntegerSetCCVL_VI_Swappable; + defm : VPatIntegerSetCCVL_VI_Swappable; + defm : VPatIntegerSetCCVL_VI_Swappable; + defm : VPatIntegerSetCCVL_VI_Swappable; } } // foreach vti = AllIntegerVectors