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 @@ -58,7 +58,7 @@ ConstraintShift = InstFormatShift + 5, VS2Constraint = 0b001 << ConstraintShift, VS1Constraint = 0b010 << ConstraintShift, - VMConstraint = 0b100 << ConstraintShift, + VMConstraint = 0b100 << ConstraintShift, ConstraintMask = 0b111 << ConstraintShift, VLMulShift = ConstraintShift + 3, @@ -68,15 +68,14 @@ ForceTailAgnosticShift = VLMulShift + 3, 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 @@ -140,9 +139,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) { @@ -165,12 +164,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 @@ -199,9 +192,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/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -631,10 +631,12 @@ assert(MF && "MBB expected to be in a machine function"); 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. @@ -652,10 +654,17 @@ 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. It should be the first operand after the defs. + if (OpNo == MI->getNumExplicitDefs() && MO.isReg() && MO.isTied()) { + assert(MCID.getOperandConstraint(OpNo, MCOI::TIED_TO) == 0 && + "Expected tied to first def."); + const MCInstrDesc &OutMCID = TII->get(OutMI.getOpcode()); + // Skip if the next operand in OutMI is not supposed to be tied. Unless it + // is a _TIED instruction. + if (OutMCID.getOperandConstraint(OutMI.getNumOperands(), MCOI::TIED_TO) < + 0 && + !RISCVII::isTiedPseudo(TSFlags)) + continue; } MCOperand MCOp; @@ -704,7 +713,6 @@ // Unmasked pseudo instructions need to append dummy mask operand to // V instructions. All V instructions are modeled as the masked version. - const TargetInstrInfo *TII = Subtarget.getInstrInfo(); const MCInstrDesc &OutMCID = TII->get(OutMI.getOpcode()); if (OutMI.getNumOperands() < OutMCID.getNumOperands()) { assert(OutMCID.operands()[OutMI.getNumOperands()].RegClass == 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 @@ -190,8 +190,8 @@ bit ForceTailAgnostic = false; let TSFlags{11} = ForceTailAgnostic; - bit HasMergeOp = 0; - let TSFlags{12} = HasMergeOp; + bit IsTiedPseudo = 0; + let TSFlags{12} = IsTiedPseudo; bit HasSEWOp = 0; let TSFlags{13} = 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 @@ -707,7 +707,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -724,7 +723,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -751,7 +749,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -768,7 +765,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -795,7 +791,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -812,7 +807,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -844,7 +838,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = !if(!eq(EarlyClobber, 1), "@earlyclobber $rd, $rd = $dest", "$rd = $dest"); } @@ -862,7 +855,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; } @@ -936,7 +928,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoNullaryMask: @@ -949,7 +940,6 @@ let Constraints ="$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let UsesMaskPolicy = 1; let HasVecPolicyOp = 1; } @@ -995,7 +985,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoUnaryMask : @@ -1009,7 +998,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let UsesMaskPolicy = 1; } @@ -1024,7 +1012,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1039,7 +1026,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; @@ -1055,7 +1041,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; @@ -1088,7 +1073,6 @@ let Constraints = "@earlyclobber $rd, $rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoBinaryNoMask.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } // Special version of VPseudoBinaryNoMask where we pretend the first source is @@ -1140,6 +1123,7 @@ let HasSEWOp = 1; let HasVecPolicyOp = 1; let isConvertibleToThreeAddress = 1; + let IsTiedPseudo = 1; } class VPseudoIStoreNoMask LMUL, @@ -1183,7 +1167,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; } @@ -1221,7 +1203,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; } @@ -1241,7 +1222,6 @@ let Constraints = Join<[Constraint, "$rd = $merge"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let UsesMaskPolicy = 1; } @@ -1262,9 +1242,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; } @@ -1327,7 +1305,6 @@ let Constraints = Join<[Constraint, "$rd = $rs3"], ",">.ret; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoTernaryNoMaskWithPolicy NF>: @@ -1371,7 +1347,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -1387,7 +1362,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1414,7 +1388,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $dest"; } @@ -1430,7 +1403,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1457,7 +1429,6 @@ let hasSideEffects = 0; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let Constraints = "$rd = $merge"; } @@ -1474,7 +1445,6 @@ let Constraints = "$rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; } @@ -1509,7 +1479,6 @@ let Constraints = "@earlyclobber $rd, $rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; } class VPseudoISegLoadMask LMUL, @@ -1528,7 +1497,6 @@ let Constraints = "@earlyclobber $rd, $rd = $merge"; let HasVLOp = 1; let HasSEWOp = 1; - let HasMergeOp = 1; let HasVecPolicyOp = 1; let UsesMaskPolicy = 1; }