Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h =================================================================== --- llvm/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h +++ 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 Index: llvm/lib/Target/RISCV/RISCVInstrInfo.cpp =================================================================== --- llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -1220,6 +1220,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::hasSEWOp(TSFlags)) { unsigned OpIdx = RISCVII::getSEWOpNum(Desc); uint64_t Log2SEW = MI.getOperand(OpIdx).getImm();