[llvm-branch-commits] [llvm] TableGen: Skip classes without matching super-register classes in RegisterBankEmitter (PR #232817)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Oct 17 01:30:00 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/232817
>From a2af6eea2f5aa4e9839838670e4c0809a055d149 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 16 Oct 2026 05:34:41 -0700
Subject: [PATCH] TableGen: Skip classes without matching super-register
classes in RegisterBankEmitter
visitRegisterBankClasses checks every sub-register index for every pair
of register classes. Skip the per-index loop if RC is not in any of the
class's super-register class sets.
AMDGPU tablegen run for AMDGPUGenRegisterBank.inc:
Gigacycles CPU seconds
Before 51.7 16.0
After 48.4 (-6.4%) 14.9 (-6.9%)
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
---
llvm/utils/TableGen/Common/CodeGenRegisters.cpp | 6 ++++++
llvm/utils/TableGen/Common/CodeGenRegisters.h | 3 +++
llvm/utils/TableGen/RegisterBankEmitter.cpp | 3 +++
3 files changed, 12 insertions(+)
diff --git a/llvm/utils/TableGen/Common/CodeGenRegisters.cpp b/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
index 117a4de93923ac..52b70259aa8d79 100644
--- a/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
@@ -1174,6 +1174,12 @@ bool CodeGenRegisterClass::hasSuperRegClass(
return FindI != SuperRegClasses.end() && FindI->second.contains(RC);
}
+bool CodeGenRegisterClass::hasSuperRegClass(
+ const CodeGenRegisterClass *RC) const {
+ return any_of(SuperRegClasses,
+ [RC](const auto &Entry) { return Entry.second.contains(RC); });
+}
+
void CodeGenRegisterClass::getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,
BitVector &Out) const {
auto FindI = SuperRegClasses.find(SubIdx);
diff --git a/llvm/utils/TableGen/Common/CodeGenRegisters.h b/llvm/utils/TableGen/Common/CodeGenRegisters.h
index 439d05aca13981..333bc4aa073147 100644
--- a/llvm/utils/TableGen/Common/CodeGenRegisters.h
+++ b/llvm/utils/TableGen/Common/CodeGenRegisters.h
@@ -494,6 +494,9 @@ class CodeGenRegisterClass {
bool hasSuperRegClass(const CodeGenSubRegIndex *SubIdx,
const CodeGenRegisterClass *RC) const;
+ /// Checks if RC is a super-register class of this class for any SubIdx.
+ bool hasSuperRegClass(const CodeGenRegisterClass *RC) const;
+
// getSuperRegClasses - Returns a bit vector of all register classes
// containing only SubIdx super-registers of this class.
void getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,
diff --git a/llvm/utils/TableGen/RegisterBankEmitter.cpp b/llvm/utils/TableGen/RegisterBankEmitter.cpp
index c53aca44440575..a0a33815509fe8 100644
--- a/llvm/utils/TableGen/RegisterBankEmitter.cpp
+++ b/llvm/utils/TableGen/RegisterBankEmitter.cpp
@@ -205,6 +205,9 @@ static void visitRegisterBankClasses(
// More precisely, PossibleSubclass is a subreg-class iff Reg:SubIdx is in
// PossibleSubclass for all registers Reg from RC using any
// subregister-index SubReg
+ if (!PossibleSubclass.hasSuperRegClass(RC))
+ continue;
+
for (const auto &SubIdx : RegisterClassHierarchy.getSubRegIndices()) {
if (PossibleSubclass.hasSuperRegClass(&SubIdx, RC)) {
std::string TmpKind2 = (Twine(TmpKind) + " " + RC->getName() +
More information about the llvm-branch-commits
mailing list