diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h @@ -140,10 +140,6 @@ static inline VLMUL getLMul(uint64_t TSFlags) { return static_cast((TSFlags & VLMulMask) >> VLMulShift); } -/// \returns true if there is a dummy mask operand for the instruction. -static inline bool hasDummyMaskOp(uint64_t TSFlags) { - return TSFlags & HasDummyMaskOpMask; -} /// \returns true if tail agnostic is enforced for the instruction. static inline bool doesForceTailAgnostic(uint64_t TSFlags) { return TSFlags & ForceTailAgnosticMask; diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -3182,13 +3182,10 @@ unsigned Opc = UseTUPseudo ? I->UnmaskedTUPseudo : I->UnmaskedPseudo; - // Check that we're dropping the mask operand and any policy operand - // when we transform to this unmasked pseudo. Additionally, if this - // instruction is tail agnostic, the unmasked instruction should not have a - // merge op. + // If this instruction is tail agnostic, the unmasked instruction should not + // have a // merge op. uint64_t TSFlags = TII.get(Opc).TSFlags; assert((UseTUPseudo == RISCVII::hasMergeOp(TSFlags)) && - RISCVII::hasDummyMaskOp(TSFlags) && "Unexpected pseudo to transform to"); (void)TSFlags; diff --git a/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp b/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp --- a/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp +++ b/llvm/lib/Target/RISCV/RISCVMCInstLower.cpp @@ -146,9 +146,8 @@ const MachineFunction *MF = MBB->getParent(); assert(MF && "MBB expected to be in a machine function"); - const TargetRegisterInfo *TRI = - MF->getSubtarget().getRegisterInfo(); - + const RISCVSubtarget &Subtarget = MF->getSubtarget(); + const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo(); assert(TRI && "TargetRegisterInfo expected"); uint64_t TSFlags = MI->getDesc().TSFlags; @@ -220,8 +219,14 @@ // Unmasked pseudo instructions need to append dummy mask operand to // V instructions. All V instructions are modeled as the masked version. - if (RISCVII::hasDummyMaskOp(TSFlags)) - OutMI.addOperand(MCOperand::createReg(RISCV::NoRegister)); + const TargetInstrInfo *TII = Subtarget.getInstrInfo(); + const MCInstrDesc &OutMCID = TII->get(OutMI.getOpcode()); + unsigned OutNumOperands = OutMI.getNumOperands(); + if (OutNumOperands != OutMCID.getNumOperands()) { + if (OutMCID.operands()[OutNumOperands].RegClass == RISCV::VMV0RegClassID) + OutMI.addOperand(MCOperand::createReg(RISCV::NoRegister)); + assert(OutMI.getNumOperands() == OutMCID.getNumOperands()); + } return true; }