[llvm] e87ac29 - [NFC][CodeGen] Refactor subregister index verification for MIR (#181921)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 19 10:25:21 PST 2026
Author: Rahul Joshi
Date: 2026-02-19T10:25:16-08:00
New Revision: e87ac294333dd978b8ef49e8e51ff4e23c65b26b
URL: https://github.com/llvm/llvm-project/commit/e87ac294333dd978b8ef49e8e51ff4e23c65b26b
DIFF: https://github.com/llvm/llvm-project/commit/e87ac294333dd978b8ef49e8e51ff4e23c65b26b.diff
LOG: [NFC][CodeGen] Refactor subregister index verification for MIR (#181921)
Refactor register class/subreg-index verification against the
instruction specified class:
- Avoid inflating the register's class (i.e., no need to call
`getLargestLegalSuperClass`).
- Check validity with `getMatchingSuperRegClass(RC, DRC, SubIdx) == RC`.
- Add some explanatory comments for this check.
- Extended a unit test to exercise this verification failure.
Added:
Modified:
llvm/lib/CodeGen/MachineVerifier.cpp
llvm/test/MachineVerifier/AMDGPU/unsupported-subreg-index-aligned-vgpr-check.mir
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 297ecc4d81fd9..7a3b8f2bb4eb0 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -2818,28 +2818,28 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
return;
}
}
- if (MONum < MCID.getNumOperands()) {
- if (const TargetRegisterClass *DRC = TII->getRegClass(MCID, MONum)) {
- if (SubIdx) {
- const TargetRegisterClass *SuperRC =
- TRI->getLargestLegalSuperClass(RC, *MF);
- if (!SuperRC) {
- report("No largest legal super class exists.", MO, MONum);
- return;
- }
- DRC = TRI->getMatchingSuperRegClass(SuperRC, DRC, SubIdx);
- if (!DRC) {
- report("No matching super-reg register class.", MO, MONum);
- return;
- }
- }
- if (!RC->hasSuperClassEq(DRC)) {
- report("Illegal virtual register for instruction", MO, MONum);
- OS << "Expected a " << TRI->getRegClassName(DRC)
- << " register, but got a " << TRI->getRegClassName(RC)
- << " register\n";
- }
- }
+ if (MONum >= MCID.getNumOperands())
+ break;
+ const TargetRegisterClass *DRC = TII->getRegClass(MCID, MONum);
+ if (!DRC)
+ break;
+
+ // If SubIdx is used, verify that RC with SubIdx can be used for an
+ // operand of class DRC. This is valid if for every register in RC, the
+ // register obtained by applying SubIdx to it is in DRC.
+ if (SubIdx && TRI->getMatchingSuperRegClass(RC, DRC, SubIdx) != RC) {
+ report("Illegal virtual register for instruction", MO, MONum);
+ OS << TRI->getRegClassName(RC) << "." << TRI->getSubRegIndexName(SubIdx)
+ << " cannot be used for " << TRI->getRegClassName(DRC)
+ << " operands.";
+ }
+
+ // If no SubIdx is used, verify that RC is a sub-class of DRC.
+ if (!SubIdx && !RC->hasSuperClassEq(DRC)) {
+ report("Illegal virtual register for instruction", MO, MONum);
+ OS << "Expected a " << TRI->getRegClassName(DRC)
+ << " register, but got a " << TRI->getRegClassName(RC)
+ << " register\n";
}
}
break;
diff --git a/llvm/test/MachineVerifier/AMDGPU/unsupported-subreg-index-aligned-vgpr-check.mir b/llvm/test/MachineVerifier/AMDGPU/unsupported-subreg-index-aligned-vgpr-check.mir
index be1311cb6b217..59d298056e8e8 100644
--- a/llvm/test/MachineVerifier/AMDGPU/unsupported-subreg-index-aligned-vgpr-check.mir
+++ b/llvm/test/MachineVerifier/AMDGPU/unsupported-subreg-index-aligned-vgpr-check.mir
@@ -36,6 +36,17 @@ body: |
; CHECK-NEXT: Register class VReg_512 does not support subreg index sub16_sub17_sub18_sub19
S_NOP 0, implicit-def %2:vreg_512
GLOBAL_STORE_DWORDX4_SADDR %0, %2.sub16_sub17_sub18_sub19, undef $sgpr8_sgpr9, 80, 0, implicit $exec :: (store (s128), addrspace 1)
+
+ ; Test valid subregister index, but invalid effective register class.
+ ; CHECK: *** Bad machine code: Illegal virtual register for instruction ***
+ ; CHECK-NEXT: - function: uses_invalid_subregister_for_regclass
+ ; CHECK-NEXT: - basic block: %bb.0
+ ; CHECK-NEXT: - instruction: GLOBAL_STORE_DWORDX4_SADDR %0:vgpr_32, %2.sub0:vreg_512, undef $sgpr8_sgpr9, 80, 0, implicit $exec :: (store (s128), addrspace 1)
+ ; CHECK-NEXT: - operand 1: %2.sub0:vreg_512
+ ; CHECK-NEXT: VReg_512.sub0 cannot be used for AV_128_Align2 operands.
+ %3:sreg_32 = COPY %0
+ GLOBAL_STORE_DWORDX4_SADDR %0, %2.sub0, undef $sgpr8_sgpr9, 80, 0, implicit $exec :: (store (s128), addrspace 1)
+
S_ENDPGM 0
...
More information about the llvm-commits
mailing list