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 @@ -72,15 +72,14 @@ ForceTailAgnosticShift = HasDummyMaskOpShift + 1, ForceTailAgnosticMask = 1 << ForceTailAgnosticShift, - // Does this instruction have a merge operand that must be removed when - // converting to MCInst. It will be the first explicit use operand. Used by - // RVV Pseudos. - HasMergeOpShift = ForceTailAgnosticShift + 1, - HasMergeOpMask = 1 << HasMergeOpShift, + // Is this a _TIED vector pseudo instruction. For these instructions we + // shouldn't skip the tied operand when converting to MC instructions. + IsTiedPseudoShift = ForceTailAgnosticShift + 1, + IsTiedPseudoMask = 1 << IsTiedPseudoShift, // Does this instruction have a SEW operand. It will be the last explicit // operand unless there is a vector policy operand. Used by RVV Pseudos. - HasSEWOpShift = HasMergeOpShift + 1, + HasSEWOpShift = IsTiedPseudoShift + 1, HasSEWOpMask = 1 << HasSEWOpShift, // Does this instruction have a VL operand. It will be the second to last @@ -148,9 +147,9 @@ static inline bool doesForceTailAgnostic(uint64_t TSFlags) { return TSFlags & ForceTailAgnosticMask; } -/// \returns true if there is a merge operand for the instruction. -static inline bool hasMergeOp(uint64_t TSFlags) { - return TSFlags & HasMergeOpMask; +/// \returns true if this a _TIED pseudo. +static inline bool isTiedPseudo(uint64_t TSFlags) { + return TSFlags & IsTiedPseudoMask; } /// \returns true if there is a SEW operand for the instruction. static inline bool hasSEWOp(uint64_t TSFlags) { @@ -173,12 +172,6 @@ return TSFlags & UsesMaskPolicyMask; } -static inline unsigned getMergeOpNum(const MCInstrDesc &Desc) { - assert(hasMergeOp(Desc.TSFlags)); - assert(!Desc.isVariadic()); - return Desc.getNumDefs(); -} - static inline unsigned getVLOpNum(const MCInstrDesc &Desc) { const uint64_t TSFlags = Desc.TSFlags; // This method is only called if we expect to have a VL operand, and all @@ -207,9 +200,7 @@ // Is the first def operand tied to the first use operand. This is true for // vector pseudo instructions that have a merge operand for tail/mask // undisturbed. It's also true for vector FMA instructions where one of the -// operands is also the destination register. This is different than -// RISCVII::hasMergeOp which only indicates whether the tied operand from the -// pseudoinstruction also exists on the MC layer instruction. +// operands is also the destination register. static inline bool isFirstDefTiedToFirstUse(const MCInstrDesc &Desc) { return Desc.getNumDefs() < Desc.getNumOperands() && Desc.getOperandConstraint(Desc.getNumDefs(), MCOI::TIED_TO) == 0; diff --git a/llvm/lib/Target/RISCV/RISCVInstrFormats.td b/llvm/lib/Target/RISCV/RISCVInstrFormats.td --- a/llvm/lib/Target/RISCV/RISCVInstrFormats.td +++ b/llvm/lib/Target/RISCV/RISCVInstrFormats.td @@ -193,8 +193,8 @@ bit ForceTailAgnostic = false; let TSFlags{12} = ForceTailAgnostic; - bit HasMergeOp = 0; - let TSFlags{13} = HasMergeOp; + bit IsTiedPseudo = 0; + let TSFlags{13} = IsTiedPseudo; bit HasSEWOp = 0; let TSFlags{14} = HasSEWOp; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -1793,13 +1793,6 @@ } const uint64_t TSFlags = Desc.TSFlags; - if (RISCVII::hasMergeOp(TSFlags)) { - unsigned OpIdx = RISCVII::getMergeOpNum(Desc); - if (MI.findTiedOperandIdx(0) != OpIdx) { - ErrInfo = "Merge op improperly tied"; - return false; - } - } if (RISCVII::hasVLOp(TSFlags)) { const MachineOperand &Op = MI.getOperand(RISCVII::getVLOpNum(Desc)); if (!Op.isImm() && !Op.isReg()) { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -713,7 +713,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -730,7 +729,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -759,7 +757,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -776,7 +773,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -805,7 +801,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -822,7 +817,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -856,7 +850,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = !if(!eq(EarlyClobber, 1), "@earlyclobber $rd, $rd = $dest", "$rd = $dest"); } @@ -874,7 +867,6 @@ let Constraints = !if(!eq(EarlyClobber, 1), "@earlyclobber $rd, $rd = $merge", "$rd = $merge"); let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -952,7 +944,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -979,7 +970,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; } class VPseudoNullaryMask: @@ -992,7 +982,6 @@ let Constraints ="$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let UsesMaskPolicy = 1; let HasVecPolicyOp = 1; } @@ -1038,7 +1027,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; } class VPseudoUnaryMask : @@ -1052,7 +1040,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let UsesMaskPolicy = 1; } @@ -1067,7 +1054,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1082,7 +1068,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; let usesCustomInserter = 1; @@ -1098,7 +1083,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; let usesCustomInserter = 1; @@ -1131,7 +1115,6 @@ let Constraints = "@earlyclobber $rd, $rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoBinaryNoMask LMUL, @@ -1231,7 +1214,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoBinaryMaskPolicy.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1269,7 +1250,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; } @@ -1289,7 +1269,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let UsesMaskPolicy = 1; } @@ -1310,9 +1289,9 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 0; // Merge is also rs2. let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; + let IsTiedPseudo = 1; } class VPseudoBinaryCarryIn.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 0; let VLMul = MInfo.value; } @@ -1375,7 +1352,6 @@ let Constraints = Join<[Constraint, "$rd = $rs3"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasDummyMask = 1; } @@ -1395,7 +1371,6 @@ let HasVecPolicyOp = 1; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasDummyMask = 1; } @@ -1423,7 +1398,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -1439,7 +1413,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1468,7 +1441,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -1484,7 +1456,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1513,7 +1484,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; let Constraints = "$rd = $merge"; } @@ -1530,7 +1500,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1567,7 +1536,6 @@ let HasVLOp = 1; let HasSEWOp = 1; let HasDummyMask = 1; - let HasMergeOp = 1; } class VPseudoISegLoadMask LMUL, @@ -1586,7 +1554,6 @@ let Constraints = "@earlyclobber $rd, $rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } 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,12 +146,13 @@ 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 TargetInstrInfo *TII = Subtarget.getInstrInfo(); + const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo(); assert(TRI && "TargetRegisterInfo expected"); - uint64_t TSFlags = MI->getDesc().TSFlags; + const MCInstrDesc &MCID = MI->getDesc(); + uint64_t TSFlags = MCID.TSFlags; unsigned NumOps = MI->getNumExplicitOperands(); // Skip policy, VL and SEW operands which are the last operands if present. @@ -163,16 +164,22 @@ --NumOps; bool hasVLOutput = RISCV::isFaultFirstLoad(*MI); + for (unsigned OpNo = 0; OpNo != NumOps; ++OpNo) { const MachineOperand &MO = MI->getOperand(OpNo); // Skip vl ouput. It should be the second output. if (hasVLOutput && OpNo == 1) continue; - // Skip merge op. It should be the first operand after the result. - if (RISCVII::hasMergeOp(TSFlags) && OpNo == 1U + hasVLOutput) { - assert(MI->getNumExplicitDefs() == 1U + hasVLOutput); - continue; + // Skip merge op if isn't present in the MCInst. It should be the first + // operand after the result. + if (OpNo == MI->getNumExplicitDefs() && + MCID.getOperandConstraint(OpNo, MCOI::TIED_TO) == 0) { + const MCInstrDesc &OutMCID = TII->get(OutMI.getOpcode()); + if (OutMCID.getOperandConstraint(OutMI.getNumOperands(), MCOI::TIED_TO) < + 0 && + !RISCVII::isTiedPseudo(TSFlags)) + continue; } MCOperand MCOp;