[llvm] [NFC][TableGen] Minor code cleanup in RegisterInfoEmitter (PR #181479)
Rahul Joshi via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 14 06:17:00 PST 2026
https://github.com/jurahul updated https://github.com/llvm/llvm-project/pull/181479
>From 1aed8ba115afaae2e2c09b1672c7f078b1ce6921 Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Sat, 14 Feb 2026 06:10:04 -0800
Subject: [PATCH] [NFC][TableGen] Minor code cleanup in RegisterInfoEmitter
Minor cleanup in codegen for `getSubClassWithSubReg` and
`getSubRegisterClass`:
- Cache `RegisterClasses.size()`. Its a list, so calling
`RegisterClasses.size()` multiple times can be expensive.
- Use `getMinimalTypeForRange` to determine the entry type for table.
- Extract common code for table lookup into a lambda.
---
llvm/utils/TableGen/RegisterInfoEmitter.cpp | 52 +++++++++------------
1 file changed, 23 insertions(+), 29 deletions(-)
diff --git a/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
index 3df439d681e8a..0e82e538829f1 100644
--- a/llvm/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
@@ -29,6 +29,7 @@
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Format.h"
+#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/CodeGenHelpers.h"
#include "llvm/TableGen/Error.h"
@@ -1534,13 +1535,23 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, raw_ostream &MainOS,
<< " const {\n";
// Use the smallest type that can hold a regclass ID with room for a
// sentinel.
- if (RegisterClasses.size() <= UINT8_MAX)
- OS << " static const uint8_t Table[";
- else if (RegisterClasses.size() <= UINT16_MAX)
- OS << " static const uint16_t Table[";
- else
- PrintFatalError("Too many register classes.");
- OS << RegisterClasses.size() << "][" << SubRegIndicesSize << "] = {\n";
+ const size_t NumRegClasses = RegisterClasses.size();
+ const char *RegClassTy = getMinimalTypeForRange(NumRegClasses + 1);
+ auto emitTableLookup = [&]() {
+ OS << formatv(R"(
+ };
+ assert(RC && \"Missing regclass\");
+ if (!Idx) return RC;
+ --Idx;
+ assert(Idx < {} && \"Bad subreg\");
+ unsigned TV = Table[RC->getID()][Idx];
+ return TV ? getRegClass(TV - 1) : nullptr;
+})",
+ SubRegIndicesSize);
+ };
+
+ OS << formatv(" static constexpr {} Table[{}][{}] = {{\n", RegClassTy,
+ NumRegClasses, SubRegIndicesSize);
for (const auto &RC : RegisterClasses) {
OS << " {\t// " << RC.getName() << "\n";
for (auto &Idx : SubRegIndices) {
@@ -1552,28 +1563,15 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, raw_ostream &MainOS,
}
OS << " },\n";
}
- OS << " };\n assert(RC && \"Missing regclass\");\n"
- << " if (!Idx) return RC;\n --Idx;\n"
- << " assert(Idx < " << SubRegIndicesSize << " && \"Bad subreg\");\n"
- << " unsigned TV = Table[RC->getID()][Idx];\n"
- << " return TV ? getRegClass(TV - 1) : nullptr;\n}\n\n";
+ emitTableLookup();
- // Emit getSubRegisterClass
+ // Emit getSubRegisterClass.
OS << "const TargetRegisterClass *" << ClassName
<< "::getSubRegisterClass(const TargetRegisterClass *RC, unsigned Idx)"
<< " const {\n";
- // Use the smallest type that can hold a regclass ID with room for a
- // sentinel.
- if (RegisterClasses.size() <= UINT8_MAX)
- OS << " static const uint8_t Table[";
- else if (RegisterClasses.size() <= UINT16_MAX)
- OS << " static const uint16_t Table[";
- else
- PrintFatalError("Too many register classes.");
-
- OS << RegisterClasses.size() << "][" << SubRegIndicesSize << "] = {\n";
-
+ OS << formatv(" static constxpr {} Table[{}][{}] = {{\n", RegClassTy,
+ NumRegClasses, SubRegIndicesSize);
for (const auto &RC : RegisterClasses) {
OS << " {\t// " << RC.getName() << '\n';
for (auto &Idx : SubRegIndices) {
@@ -1599,11 +1597,7 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, raw_ostream &MainOS,
OS << " },\n";
}
- OS << " };\n assert(RC && \"Missing regclass\");\n"
- << " if (!Idx) return RC;\n --Idx;\n"
- << " assert(Idx < " << SubRegIndicesSize << " && \"Bad subreg\");\n"
- << " unsigned TV = Table[RC->getID()][Idx];\n"
- << " return TV ? getRegClass(TV - 1) : nullptr;\n}\n\n";
+ emitTableLookup();
}
EmitRegUnitPressure(OS, ClassName);
More information about the llvm-commits
mailing list