[llvm] [NFC][CodeGen] Simplify sub-register verification in MIR (PR #181423)
Rahul Joshi via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 13 13:28:55 PST 2026
https://github.com/jurahul created https://github.com/llvm/llvm-project/pull/181423
None
>From 9acac7afb354a3beb33210dc47eaffc6831774ce Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Fri, 13 Feb 2026 13:26:57 -0800
Subject: [PATCH] [NFC][CodeGen] Simplify sub-register verification in MIR
---
llvm/lib/CodeGen/MachineVerifier.cpp | 43 ++++++-------------
...ported-subreg-index-aligned-vgpr-check.mir | 11 +++++
2 files changed, 24 insertions(+), 30 deletions(-)
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 919d451e25e54..3c7a5ded6ef2d 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -2800,45 +2800,28 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
break;
}
+ const TargetRegisterClass *EffectiveRC = RC;
if (SubIdx) {
- const TargetRegisterClass *SRC =
- TRI->getSubClassWithSubReg(RC, SubIdx);
- if (!SRC) {
+ // If a virtual register is used with a SubRegIndex, compute the
+ // effective register class after applying that SubRegIndex to the
+ // virtual register's class.
+ EffectiveRC = TRI->getSubRegisterClass(RC, SubIdx);
+
+ if (!EffectiveRC) {
report("Invalid subregister index for virtual register", MO, MONum);
OS << "Register class " << TRI->getRegClassName(RC)
<< " does not support subreg index "
<< TRI->getSubRegIndexName(SubIdx) << '\n';
return;
}
- if (RC != SRC) {
- report("Invalid register class for subregister index", MO, MONum);
- OS << "Register class " << TRI->getRegClassName(RC)
- << " does not fully support subreg index "
- << TRI->getSubRegIndexName(SubIdx) << '\n';
- 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 (const TargetRegisterClass *DRC = TII->getRegClass(MCID, MONum);
+ DRC && !EffectiveRC->hasSuperClassEq(DRC)) {
+ report("Illegal virtual register for instruction", MO, MONum);
+ OS << "Expected a " << TRI->getRegClassName(DRC)
+ << " register, but got a " << TRI->getRegClassName(EffectiveRC)
+ << " register\n";
}
}
}
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..7dfa0c03426ff 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: Expected a AV_128_Align2 register, but got a VGPR_32 register
+ %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