diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h index 8b407a9fd2550..056b6da34ac70 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h @@ -347,8 +347,10 @@ enum OperandType : unsigned { OPERAND_COND_CODE, // Vector policy operand. OPERAND_VEC_POLICY, - // Vector SEW operand. + // Vector SEW operand. Stores in log2(SEW). OPERAND_SEW, + // Special SEW for mask only instructions. Always 0. + OPERAND_SEW_MASK, // Vector rounding mode for VXRM or FRM. OPERAND_VEC_RM, OPERAND_LAST_RISCV_IMM = OPERAND_VEC_RM, diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index 91f8a2f47e21c..0944e7d461f8e 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -430,7 +430,9 @@ void RISCVInstrInfo::copyPhysRegVector( if (UseVMV) { const MCInstrDesc &Desc = DefMBBI->getDesc(); MIB.add(DefMBBI->getOperand(RISCVII::getVLOpNum(Desc))); // AVL - MIB.add(DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc))); // SEW + unsigned Log2SEW = + DefMBBI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm(); + MIB.addImm(Log2SEW ? Log2SEW : 3); // SEW MIB.addImm(0); // tu, mu MIB.addReg(RISCV::VL, RegState::Implicit); MIB.addReg(RISCV::VTYPE, RegState::Implicit); @@ -2568,7 +2570,10 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI, Ok = (Imm & (RISCVII::TAIL_AGNOSTIC | RISCVII::MASK_AGNOSTIC)) == Imm; break; case RISCVOp::OPERAND_SEW: - Ok = Imm == 0 || (isUInt<5>(Imm) && RISCVVType::isValidSEW(1 << Imm)); + Ok = (isUInt<5>(Imm) && RISCVVType::isValidSEW(1 << Imm)); + break; + case RISCVOp::OPERAND_SEW_MASK: + Ok = Imm == 0; break; case RISCVOp::OPERAND_VEC_RM: assert(RISCVII::hasRoundModeOp(Desc.TSFlags)); @@ -3206,7 +3211,8 @@ std::string RISCVInstrInfo::createMIROperandComment( RISCVVType::printVType(Imm, OS); break; } - case RISCVOp::OPERAND_SEW: { + case RISCVOp::OPERAND_SEW: + case RISCVOp::OPERAND_SEW_MASK: { unsigned Log2SEW = Op.getImm(); unsigned SEW = Log2SEW ? 1 << Log2SEW : 8; assert(RISCVVType::isValidSEW(SEW) && "Unexpected SEW"); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td index 81b93ade92576..21eedbb626846 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -92,6 +92,11 @@ def sew : RISCVOp { let OperandType = "OPERAND_SEW"; } +// SEW for mask only instructions like vmand and vmsbf. Should always be 0. +def sew_mask : RISCVOp { + let OperandType = "OPERAND_SEW_MASK"; +} + def vec_rm : RISCVOp { let OperandType = "OPERAND_VEC_RM"; } @@ -781,9 +786,10 @@ class GetVTypePredicates { } class VPseudoUSLoadNoMask : + int EEW, + DAGOperand sewop = sew> : Pseudo<(outs RetClass:$rd), - (ins RetClass:$dest, GPRMem:$rs1, AVL:$vl, sew:$sew, + (ins RetClass:$dest, GPRMem:$rs1, AVL:$vl, sewop:$sew, vec_policy:$policy), []>, RISCVVPseudo, RISCVVLE { @@ -929,9 +935,10 @@ class VPseudoILoadMask : + int EEW, + DAGOperand sewop = sew> : Pseudo<(outs), - (ins StClass:$rd, GPRMem:$rs1, AVL:$vl, sew:$sew), []>, + (ins StClass:$rd, GPRMem:$rs1, AVL:$vl, sewop:$sew), []>, RISCVVPseudo, RISCVVSE { let mayLoad = 0; @@ -1015,7 +1022,7 @@ class VPseudoNullaryMask : // Nullary for pseudo instructions. They are expanded in // RISCVExpandPseudoInsts pass. class VPseudoNullaryPseudoM : - Pseudo<(outs VR:$rd), (ins AVL:$vl, sew:$sew), []>, + Pseudo<(outs VR:$rd), (ins AVL:$vl, sew_mask:$sew), []>, RISCVVPseudo { let mayLoad = 0; let mayStore = 0; @@ -1052,7 +1059,7 @@ class VPseudoUnaryNoMaskNoPolicy TargetConstraintType = 1> : Pseudo<(outs RetClass:$rd), - (ins OpClass:$rs2, AVL:$vl, sew:$sew), []>, + (ins OpClass:$rs2, AVL:$vl, sew_mask:$sew), []>, RISCVVPseudo { let mayLoad = 0; let mayStore = 0; @@ -1087,10 +1094,11 @@ class VPseudoUnaryNoMaskRoundingMode TargetConstraintType = 1> : + bits<2> TargetConstraintType = 1, + DAGOperand sewop = sew> : Pseudo<(outs GetVRegNoV0.R:$rd), (ins GetVRegNoV0.R:$passthru, OpClass:$rs2, - VMaskOp:$vm, AVL:$vl, sew:$sew, vec_policy:$policy), []>, + VMaskOp:$vm, AVL:$vl, sewop:$sew, vec_policy:$policy), []>, RISCVVPseudo { let mayLoad = 0; let mayStore = 0; @@ -1145,7 +1153,7 @@ class VPseudoUnaryMask_NoExcept, + (ins VR:$rs2, AVL:$vl, sew_mask:$sew), []>, RISCVVPseudo { let mayLoad = 0; let mayStore = 0; @@ -1156,7 +1164,7 @@ class VPseudoUnaryNoMaskGPROut : class VPseudoUnaryMaskGPROut : Pseudo<(outs GPR:$rd), - (ins VR:$rs1, VMaskOp:$vm, AVL:$vl, sew:$sew), []>, + (ins VR:$rs1, VMaskOp:$vm, AVL:$vl, sew_mask:$sew), []>, RISCVVPseudo { let mayLoad = 0; let mayStore = 0; @@ -1184,9 +1192,10 @@ class VPseudoBinaryNoMask TargetConstraintType = 1> : + bits<2> TargetConstraintType = 1, + DAGOperand sewop = sew> : Pseudo<(outs RetClass:$rd), - (ins Op1Class:$rs2, Op2Class:$rs1, AVL:$vl, sew:$sew), []>, + (ins Op1Class:$rs2, Op2Class:$rs1, AVL:$vl, sewop:$sew), []>, RISCVVPseudo { let mayLoad = 0; let mayStore = 0; @@ -1859,7 +1868,7 @@ multiclass VPseudoLoadMask { defvar mx = mti.LMul.MX; defvar WriteVLDM_MX = !cast("WriteVLDM_" # mx); let VLMul = mti.LMul.value in { - def "_V_" # mti.BX : VPseudoUSLoadNoMask, + def "_V_" # mti.BX : VPseudoUSLoadNoMask, Sched<[WriteVLDM_MX, ReadVLDX]>; } } @@ -1934,7 +1943,7 @@ multiclass VPseudoStoreMask { defvar mx = mti.LMul.MX; defvar WriteVSTM_MX = !cast("WriteVSTM_" # mx); let VLMul = mti.LMul.value in { - def "_V_" # mti.BX : VPseudoUSStoreNoMask, + def "_V_" # mti.BX : VPseudoUSStoreNoMask, Sched<[WriteVSTM_MX, ReadVSTX]>; } } @@ -2018,7 +2027,8 @@ multiclass VPseudoVSFS_M { SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx, forcePassthruRead=true>; let ForceTailAgnostic = true in - def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMask, + def "_M_" # mti.BX # "_MASK" : VPseudoUnaryMask, SchedUnary<"WriteVMSFSV", "ReadVMSFSV", mx, forcePassthruRead=true>; } @@ -2275,7 +2285,7 @@ multiclass VPseudoBinaryV_VI_RM { foreach mti = AllMasks in { let VLMul = mti.LMul.value, isCommutable = Commutable in { - def "_MM_" # mti.BX : VPseudoBinaryNoMask, + def "_MM_" # mti.BX : VPseudoBinaryNoMask, SchedBinary<"WriteVMALUV", "ReadVMALUV", "ReadVMALUV", mti.LMul.MX>; } } diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir index a5622fd466217..936fa21763eba 100644 --- a/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir +++ b/llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-to-vmv.mir @@ -13,12 +13,12 @@ body: | ; CHECK-NEXT: %false:vr = COPY $v8 ; CHECK-NEXT: %true:vr = COPY $v9 ; CHECK-NEXT: %avl:gprnox0 = COPY $x1 - ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */ + ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 0 /* e8 */ ; CHECK-NEXT: $v0 = COPY %mask %false:vr = COPY $v8 %true:vr = COPY $v9 %avl:gprnox0 = COPY $x1 - %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 + %mask:vmv0 = PseudoVMSET_M_B8 %avl, 0 $v0 = COPY %mask %x:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, %false, %true, $v0, %avl, 5 ... @@ -34,14 +34,14 @@ body: | ; CHECK-NEXT: %false:vr = COPY $noreg ; CHECK-NEXT: %true:vr = COPY $v9 ; CHECK-NEXT: %avl:gprnox0 = COPY $x1 - ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */ + ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 0 /* e8 */ ; CHECK-NEXT: $v0 = COPY %mask ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %pt, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ %pt:vrnov0 = COPY $v8 %false:vr = COPY $noreg %true:vr = COPY $v9 %avl:gprnox0 = COPY $x1 - %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 + %mask:vmv0 = PseudoVMSET_M_B8 %avl, 0 $v0 = COPY %mask %x:vrnov0 = PseudoVMERGE_VVM_M1 %pt, %false, %true, $v0, %avl, 5 ... @@ -57,14 +57,14 @@ body: | ; CHECK-NEXT: %pt:vr = COPY $v8 ; CHECK-NEXT: %true:vr = COPY $v9 ; CHECK-NEXT: %avl:gprnox0 = COPY $x1 - ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 /* e32 */ + ; CHECK-NEXT: %mask:vmv0 = PseudoVMSET_M_B8 %avl, 0 /* e8 */ ; CHECK-NEXT: $v0 = COPY %mask ; CHECK-NEXT: %x:vr = PseudoVMV_V_V_M1 %pt, %true, %avl, 5 /* e32 */, 0 /* tu, mu */ %false:vr = COPY $v8 %pt:vrnov0 = COPY $v8 %true:vr = COPY $v9 %avl:gprnox0 = COPY $x1 - %mask:vmv0 = PseudoVMSET_M_B8 %avl, 5 + %mask:vmv0 = PseudoVMSET_M_B8 %avl, 0 $v0 = COPY %mask %x:vrnov0 = PseudoVMERGE_VVM_M1 %pt, %false, %true, $v0, %avl, 5 ...