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 @@ -168,6 +168,12 @@ 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 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 @@ -1216,6 +1216,13 @@ } 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()) {