diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index 6a3a89371b57a..01dc9b9c3efcb 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -2568,7 +2568,7 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI, Ok = (Imm & (RISCVII::TAIL_AGNOSTIC | RISCVII::MASK_AGNOSTIC)) == Imm; break; case RISCVOp::OPERAND_SEW: - Ok = Imm == 0 || (Imm >= 3 && Imm <= 6); + Ok = Imm == 0 || (isUInt<5>(Imm) && RISCVVType::isValidSEW(1 << Imm)); break; case RISCVOp::OPERAND_VEC_RM: assert(RISCVII::hasRoundModeOp(Desc.TSFlags)); @@ -3188,29 +3188,28 @@ std::string RISCVInstrInfo::createMIROperandComment( if (!Op.isImm()) return std::string(); + const MCInstrDesc &Desc = MI.getDesc(); + if (OpIdx >= Desc.getNumOperands()) + return std::string(); + std::string Comment; raw_string_ostream OS(Comment); - uint64_t TSFlags = MI.getDesc().TSFlags; + const MCOperandInfo &OpInfo = Desc.operands()[OpIdx]; // Print the full VType operand of vsetvli/vsetivli instructions, and the SEW // operand of vector codegen pseudos. - if ((MI.getOpcode() == RISCV::VSETVLI || MI.getOpcode() == RISCV::VSETIVLI || - MI.getOpcode() == RISCV::PseudoVSETVLI || - MI.getOpcode() == RISCV::PseudoVSETIVLI || - MI.getOpcode() == RISCV::PseudoVSETVLIX0) && - OpIdx == 2) { - unsigned Imm = MI.getOperand(OpIdx).getImm(); + if (OpInfo.OperandType == RISCVOp::OPERAND_VTYPEI10 || + OpInfo.OperandType == RISCVOp::OPERAND_VTYPEI11) { + unsigned Imm = Op.getImm(); RISCVVType::printVType(Imm, OS); - } else if (RISCVII::hasSEWOp(TSFlags) && - OpIdx == RISCVII::getSEWOpNum(MI.getDesc())) { - unsigned Log2SEW = MI.getOperand(OpIdx).getImm(); + } else if (OpInfo.OperandType == RISCVOp::OPERAND_SEW) { + unsigned Log2SEW = Op.getImm(); unsigned SEW = Log2SEW ? 1 << Log2SEW : 8; assert(RISCVVType::isValidSEW(SEW) && "Unexpected SEW"); OS << "e" << SEW; - } else if (RISCVII::hasVecPolicyOp(TSFlags) && - OpIdx == RISCVII::getVecPolicyOpNum(MI.getDesc())) { - unsigned Policy = MI.getOperand(OpIdx).getImm(); + } else if (OpInfo.OperandType == RISCVOp::OPERAND_VEC_POLICY) { + unsigned Policy = Op.getImm(); assert(Policy <= (RISCVII::TAIL_AGNOSTIC | RISCVII::MASK_AGNOSTIC) && "Invalid Policy Value"); OS << (Policy & RISCVII::TAIL_AGNOSTIC ? "ta" : "tu") << ", "