[llvm] [RISCV] Use a switch in RISCVInstrInfo::verifyInstruction. NFC (PR #170961)

via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 5 18:08:35 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-risc-v

Author: Craig Topper (topperc)

<details>
<summary>Changes</summary>

The immediate only operands handled with a range check and a switch nested under the default case.

---
Full diff: https://github.com/llvm/llvm-project/pull/170961.diff


1 Files Affected:

- (modified) llvm/lib/Target/RISCV/RISCVInstrInfo.cpp (+191-183) 


``````````diff
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index 9fb7ac0573824..a3bacfbfe5214 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -2858,19 +2858,21 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
   for (const auto &[Index, Operand] : enumerate(Desc.operands())) {
     const MachineOperand &MO = MI.getOperand(Index);
     unsigned OpType = Operand.OperandType;
-    if (OpType >= RISCVOp::OPERAND_FIRST_RISCV_IMM &&
-        OpType <= RISCVOp::OPERAND_LAST_RISCV_IMM) {
-      if (!MO.isImm()) {
-        ErrInfo = "Expected an immediate operand.";
-        return false;
-      }
-      int64_t Imm = MO.getImm();
-      bool Ok;
-      switch (OpType) {
-      default:
-        llvm_unreachable("Unexpected operand type");
+    switch (OpType) {
+    default:
+      if (OpType >= RISCVOp::OPERAND_FIRST_RISCV_IMM &&
+          OpType <= RISCVOp::OPERAND_LAST_RISCV_IMM) {
+        if (!MO.isImm()) {
+          ErrInfo = "Expected an immediate operand.";
+          return false;
+        }
+        int64_t Imm = MO.getImm();
+        bool Ok;
+        switch (OpType) {
+        default:
+          llvm_unreachable("Unexpected operand type");
 
-        // clang-format off
+          // clang-format off
 #define CASE_OPERAND_UIMM(NUM)                                                 \
   case RISCVOp::OPERAND_UIMM##NUM:                                             \
     Ok = isUInt<NUM>(Imm);                                                     \
@@ -2879,176 +2881,178 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
   case RISCVOp::OPERAND_SIMM##NUM:                                             \
     Ok = isInt<NUM>(Imm);                                                      \
     break;
-      CASE_OPERAND_UIMM(1)
-      CASE_OPERAND_UIMM(2)
-      CASE_OPERAND_UIMM(3)
-      CASE_OPERAND_UIMM(4)
-      CASE_OPERAND_UIMM(5)
-      CASE_OPERAND_UIMM(6)
-      CASE_OPERAND_UIMM(7)
-      CASE_OPERAND_UIMM(8)
-      CASE_OPERAND_UIMM(9)
-      CASE_OPERAND_UIMM(10)
-      CASE_OPERAND_UIMM(12)
-      CASE_OPERAND_UIMM(16)
-      CASE_OPERAND_UIMM(32)
-      CASE_OPERAND_UIMM(48)
-      CASE_OPERAND_UIMM(64)
+        CASE_OPERAND_UIMM(1)
+        CASE_OPERAND_UIMM(2)
+        CASE_OPERAND_UIMM(3)
+        CASE_OPERAND_UIMM(4)
+        CASE_OPERAND_UIMM(5)
+        CASE_OPERAND_UIMM(6)
+        CASE_OPERAND_UIMM(7)
+        CASE_OPERAND_UIMM(8)
+        CASE_OPERAND_UIMM(9)
+        CASE_OPERAND_UIMM(10)
+        CASE_OPERAND_UIMM(12)
+        CASE_OPERAND_UIMM(16)
+        CASE_OPERAND_UIMM(32)
+        CASE_OPERAND_UIMM(48)
+        CASE_OPERAND_UIMM(64)
+          // clang-format on
+        case RISCVOp::OPERAND_UIMM2_LSB0:
+          Ok = isShiftedUInt<1, 1>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM5_LSB0:
+          Ok = isShiftedUInt<4, 1>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM5_NONZERO:
+          Ok = isUInt<5>(Imm) && (Imm != 0);
+          break;
+        case RISCVOp::OPERAND_UIMM5_GT3:
+          Ok = isUInt<5>(Imm) && (Imm > 3);
+          break;
+        case RISCVOp::OPERAND_UIMM5_PLUS1:
+          Ok = Imm >= 1 && Imm <= 32;
+          break;
+        case RISCVOp::OPERAND_UIMM6_LSB0:
+          Ok = isShiftedUInt<5, 1>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM7_LSB00:
+          Ok = isShiftedUInt<5, 2>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM7_LSB000:
+          Ok = isShiftedUInt<4, 3>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM8_LSB00:
+          Ok = isShiftedUInt<6, 2>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM8_LSB000:
+          Ok = isShiftedUInt<5, 3>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMM8_GE32:
+          Ok = isUInt<8>(Imm) && Imm >= 32;
+          break;
+        case RISCVOp::OPERAND_UIMM9_LSB000:
+          Ok = isShiftedUInt<6, 3>(Imm);
+          break;
+        case RISCVOp::OPERAND_SIMM8_UNSIGNED:
+          Ok = isInt<8>(Imm);
+          break;
+        case RISCVOp::OPERAND_SIMM10_LSB0000_NONZERO:
+          Ok = isShiftedInt<6, 4>(Imm) && (Imm != 0);
+          break;
+        case RISCVOp::OPERAND_UIMM10_LSB00_NONZERO:
+          Ok = isShiftedUInt<8, 2>(Imm) && (Imm != 0);
+          break;
+        case RISCVOp::OPERAND_UIMM16_NONZERO:
+          Ok = isUInt<16>(Imm) && (Imm != 0);
+          break;
+        case RISCVOp::OPERAND_THREE:
+          Ok = Imm == 3;
+          break;
+        case RISCVOp::OPERAND_FOUR:
+          Ok = Imm == 4;
+          break;
+        case RISCVOp::OPERAND_IMM5_ZIBI:
+          Ok = (isUInt<5>(Imm) && Imm != 0) || Imm == -1;
+          break;
+          // clang-format off
+        CASE_OPERAND_SIMM(5)
+        CASE_OPERAND_SIMM(6)
+        CASE_OPERAND_SIMM(10)
+        CASE_OPERAND_SIMM(11)
+        CASE_OPERAND_SIMM(26)
         // clang-format on
-      case RISCVOp::OPERAND_UIMM2_LSB0:
-        Ok = isShiftedUInt<1, 1>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM5_LSB0:
-        Ok = isShiftedUInt<4, 1>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM5_NONZERO:
-        Ok = isUInt<5>(Imm) && (Imm != 0);
-        break;
-      case RISCVOp::OPERAND_UIMM5_GT3:
-        Ok = isUInt<5>(Imm) && (Imm > 3);
-        break;
-      case RISCVOp::OPERAND_UIMM5_PLUS1:
-        Ok = Imm >= 1 && Imm <= 32;
-        break;
-      case RISCVOp::OPERAND_UIMM6_LSB0:
-        Ok = isShiftedUInt<5, 1>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM7_LSB00:
-        Ok = isShiftedUInt<5, 2>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM7_LSB000:
-        Ok = isShiftedUInt<4, 3>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM8_LSB00:
-        Ok = isShiftedUInt<6, 2>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM8_LSB000:
-        Ok = isShiftedUInt<5, 3>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMM8_GE32:
-        Ok = isUInt<8>(Imm) && Imm >= 32;
-        break;
-      case RISCVOp::OPERAND_UIMM9_LSB000:
-        Ok = isShiftedUInt<6, 3>(Imm);
-        break;
-      case RISCVOp::OPERAND_SIMM8_UNSIGNED:
-        Ok = isInt<8>(Imm);
-        break;
-      case RISCVOp::OPERAND_SIMM10_LSB0000_NONZERO:
-        Ok = isShiftedInt<6, 4>(Imm) && (Imm != 0);
-        break;
-      case RISCVOp::OPERAND_UIMM10_LSB00_NONZERO:
-        Ok = isShiftedUInt<8, 2>(Imm) && (Imm != 0);
-        break;
-      case RISCVOp::OPERAND_UIMM16_NONZERO:
-        Ok = isUInt<16>(Imm) && (Imm != 0);
-        break;
-      case RISCVOp::OPERAND_THREE:
-        Ok = Imm == 3;
-        break;
-      case RISCVOp::OPERAND_FOUR:
-        Ok = Imm == 4;
-        break;
-      case RISCVOp::OPERAND_IMM5_ZIBI:
-        Ok = (isUInt<5>(Imm) && Imm != 0) || Imm == -1;
-        break;
-        // clang-format off
-      CASE_OPERAND_SIMM(5)
-      CASE_OPERAND_SIMM(6)
-      CASE_OPERAND_SIMM(10)
-      CASE_OPERAND_SIMM(11)
-      CASE_OPERAND_SIMM(26)
-      // clang-format on
-      case RISCVOp::OPERAND_SIMM5_PLUS1:
-        Ok = Imm >= -15 && Imm <= 16;
-        break;
-      case RISCVOp::OPERAND_SIMM5_NONZERO:
-        Ok = isInt<5>(Imm) && (Imm != 0);
-        break;
-      case RISCVOp::OPERAND_SIMM6_NONZERO:
-        Ok = Imm != 0 && isInt<6>(Imm);
-        break;
-      case RISCVOp::OPERAND_VTYPEI10:
-        Ok = isUInt<10>(Imm);
-        break;
-      case RISCVOp::OPERAND_VTYPEI11:
-        Ok = isUInt<11>(Imm);
-        break;
-      case RISCVOp::OPERAND_SIMM12_LSB00000:
-        Ok = isShiftedInt<7, 5>(Imm);
-        break;
-      case RISCVOp::OPERAND_SIMM16_NONZERO:
-        Ok = isInt<16>(Imm) && (Imm != 0);
-        break;
-      case RISCVOp::OPERAND_SIMM20_LI:
-        Ok = isInt<20>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMMLOG2XLEN:
-        Ok = STI.is64Bit() ? isUInt<6>(Imm) : isUInt<5>(Imm);
-        break;
-      case RISCVOp::OPERAND_UIMMLOG2XLEN_NONZERO:
-        Ok = STI.is64Bit() ? isUInt<6>(Imm) : isUInt<5>(Imm);
-        Ok = Ok && Imm != 0;
-        break;
-      case RISCVOp::OPERAND_CLUI_IMM:
-        Ok = (isUInt<5>(Imm) && Imm != 0) || (Imm >= 0xfffe0 && Imm <= 0xfffff);
-        break;
-      case RISCVOp::OPERAND_RVKRNUM:
-        Ok = Imm >= 0 && Imm <= 10;
-        break;
-      case RISCVOp::OPERAND_RVKRNUM_0_7:
-        Ok = Imm >= 0 && Imm <= 7;
-        break;
-      case RISCVOp::OPERAND_RVKRNUM_1_10:
-        Ok = Imm >= 1 && Imm <= 10;
-        break;
-      case RISCVOp::OPERAND_RVKRNUM_2_14:
-        Ok = Imm >= 2 && Imm <= 14;
-        break;
-      case RISCVOp::OPERAND_RLIST:
-        Ok = Imm >= RISCVZC::RA && Imm <= RISCVZC::RA_S0_S11;
-        break;
-      case RISCVOp::OPERAND_RLIST_S0:
-        Ok = Imm >= RISCVZC::RA_S0 && Imm <= RISCVZC::RA_S0_S11;
-        break;
-      case RISCVOp::OPERAND_STACKADJ:
-        Ok = Imm >= 0 && Imm <= 48 && Imm % 16 == 0;
-        break;
-      case RISCVOp::OPERAND_FRMARG:
-        Ok = RISCVFPRndMode::isValidRoundingMode(Imm);
-        break;
-      case RISCVOp::OPERAND_RTZARG:
-        Ok = Imm == RISCVFPRndMode::RTZ;
-        break;
-      case RISCVOp::OPERAND_COND_CODE:
-        Ok = Imm >= 0 && Imm < RISCVCC::COND_INVALID;
-        break;
-      case RISCVOp::OPERAND_VEC_POLICY:
-        Ok = (Imm & (RISCVVType::TAIL_AGNOSTIC | RISCVVType::MASK_AGNOSTIC)) ==
-             Imm;
-        break;
-      case RISCVOp::OPERAND_SEW:
-        Ok = (isUInt<5>(Imm) && RISCVVType::isValidSEW(1 << Imm));
-        break;
-      case RISCVOp::OPERAND_SEW_MASK:
-        Ok = Imm == 0;
-        break;
-      case RISCVOp::OPERAND_VEC_RM:
-        assert(RISCVII::hasRoundModeOp(Desc.TSFlags));
-        if (RISCVII::usesVXRM(Desc.TSFlags))
-          Ok = isUInt<2>(Imm);
-        else
+        case RISCVOp::OPERAND_SIMM5_PLUS1:
+          Ok = Imm >= -15 && Imm <= 16;
+          break;
+        case RISCVOp::OPERAND_SIMM5_NONZERO:
+          Ok = isInt<5>(Imm) && (Imm != 0);
+          break;
+        case RISCVOp::OPERAND_SIMM6_NONZERO:
+          Ok = Imm != 0 && isInt<6>(Imm);
+          break;
+        case RISCVOp::OPERAND_VTYPEI10:
+          Ok = isUInt<10>(Imm);
+          break;
+        case RISCVOp::OPERAND_VTYPEI11:
+          Ok = isUInt<11>(Imm);
+          break;
+        case RISCVOp::OPERAND_SIMM12_LSB00000:
+          Ok = isShiftedInt<7, 5>(Imm);
+          break;
+        case RISCVOp::OPERAND_SIMM16_NONZERO:
+          Ok = isInt<16>(Imm) && (Imm != 0);
+          break;
+        case RISCVOp::OPERAND_SIMM20_LI:
+          Ok = isInt<20>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMMLOG2XLEN:
+          Ok = STI.is64Bit() ? isUInt<6>(Imm) : isUInt<5>(Imm);
+          break;
+        case RISCVOp::OPERAND_UIMMLOG2XLEN_NONZERO:
+          Ok = STI.is64Bit() ? isUInt<6>(Imm) : isUInt<5>(Imm);
+          Ok = Ok && Imm != 0;
+          break;
+        case RISCVOp::OPERAND_CLUI_IMM:
+          Ok = (isUInt<5>(Imm) && Imm != 0) || (Imm >= 0xfffe0 && Imm <= 0xfffff);
+          break;
+        case RISCVOp::OPERAND_RVKRNUM:
+          Ok = Imm >= 0 && Imm <= 10;
+          break;
+        case RISCVOp::OPERAND_RVKRNUM_0_7:
+          Ok = Imm >= 0 && Imm <= 7;
+          break;
+        case RISCVOp::OPERAND_RVKRNUM_1_10:
+          Ok = Imm >= 1 && Imm <= 10;
+          break;
+        case RISCVOp::OPERAND_RVKRNUM_2_14:
+          Ok = Imm >= 2 && Imm <= 14;
+          break;
+        case RISCVOp::OPERAND_RLIST:
+          Ok = Imm >= RISCVZC::RA && Imm <= RISCVZC::RA_S0_S11;
+          break;
+        case RISCVOp::OPERAND_RLIST_S0:
+          Ok = Imm >= RISCVZC::RA_S0 && Imm <= RISCVZC::RA_S0_S11;
+          break;
+        case RISCVOp::OPERAND_STACKADJ:
+          Ok = Imm >= 0 && Imm <= 48 && Imm % 16 == 0;
+          break;
+        case RISCVOp::OPERAND_FRMARG:
           Ok = RISCVFPRndMode::isValidRoundingMode(Imm);
-        break;
-      case RISCVOp::OPERAND_XSFMM_VTYPE:
-        Ok = RISCVVType::isValidXSfmmVType(Imm);
-        break;
-      }
-      if (!Ok) {
-        ErrInfo = "Invalid immediate";
-        return false;
+          break;
+        case RISCVOp::OPERAND_RTZARG:
+          Ok = Imm == RISCVFPRndMode::RTZ;
+          break;
+        case RISCVOp::OPERAND_COND_CODE:
+          Ok = Imm >= 0 && Imm < RISCVCC::COND_INVALID;
+          break;
+        case RISCVOp::OPERAND_VEC_POLICY:
+          Ok = (Imm & (RISCVVType::TAIL_AGNOSTIC | RISCVVType::MASK_AGNOSTIC)) ==
+               Imm;
+          break;
+        case RISCVOp::OPERAND_SEW:
+          Ok = (isUInt<5>(Imm) && RISCVVType::isValidSEW(1 << Imm));
+          break;
+        case RISCVOp::OPERAND_SEW_MASK:
+          Ok = Imm == 0;
+          break;
+        case RISCVOp::OPERAND_VEC_RM:
+          assert(RISCVII::hasRoundModeOp(Desc.TSFlags));
+          if (RISCVII::usesVXRM(Desc.TSFlags))
+            Ok = isUInt<2>(Imm);
+          else
+            Ok = RISCVFPRndMode::isValidRoundingMode(Imm);
+          break;
+        case RISCVOp::OPERAND_XSFMM_VTYPE:
+          Ok = RISCVVType::isValidXSfmmVType(Imm);
+          break;
+        }
+        if (!Ok) {
+          ErrInfo = "Invalid immediate";
+          return false;
+        }
       }
-    } else if (OpType == RISCVOp::OPERAND_SIMM12_LO) {
+      break;
+    case RISCVOp::OPERAND_SIMM12_LO:
       // TODO: We could be stricter about what non-register operands are
       // allowed.
       if (MO.isReg()) {
@@ -3059,8 +3063,9 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
         ErrInfo = "Invalid immediate";
         return false;
       }
-    } else if (OpType == RISCVOp::OPERAND_UIMM20_LUI ||
-               OpType == RISCVOp::OPERAND_UIMM20_AUIPC) {
+      break;
+    case RISCVOp::OPERAND_UIMM20_LUI:
+    case RISCVOp::OPERAND_UIMM20_AUIPC:
       // TODO: We could be stricter about what non-register operands are
       // allowed.
       if (MO.isReg()) {
@@ -3071,7 +3076,8 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
         ErrInfo = "Invalid immediate";
         return false;
       }
-    } else if (OpType == RISCVOp::OPERAND_BARE_SIMM32) {
+      break;
+    case RISCVOp::OPERAND_BARE_SIMM32:
       // TODO: We could be stricter about what non-register operands are
       // allowed.
       if (MO.isReg()) {
@@ -3082,7 +3088,8 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
         ErrInfo = "Invalid immediate";
         return false;
       }
-    } else if (OpType == RISCVOp::OPERAND_AVL) {
+      break;
+    case RISCVOp::OPERAND_AVL:
       if (MO.isImm()) {
         int64_t Imm = MO.getImm();
         // VLMAX is represented as -1.
@@ -3094,6 +3101,7 @@ bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
         ErrInfo = "Expected a register or immediate operand.";
         return false;
       }
+      break;
     }
   }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/170961


More information about the llvm-commits mailing list