[llvm] [NFC][TableGen] Minor code cleanup in RegisterInfoEmitter (PR #181479)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 14 07:49:24 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-tablegen
Author: Rahul Joshi (jurahul)
<details>
<summary>Changes</summary>
Minor cleanup in codegen for `getSubClassWithSubReg` and `getSubRegisterClass`:
- Use `getMinimalTypeForRange` to determine the entry type for table.
- Extract common code for table lookup into a lambda.
---
Full diff: https://github.com/llvm/llvm-project/pull/181479.diff
1 Files Affected:
- (modified) llvm/utils/TableGen/RegisterInfoEmitter.cpp (+24-30)
``````````diff
diff --git a/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
index 3df439d681e8a..6d5dc9df9dfca 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"
@@ -142,7 +143,7 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS, raw_ostream &MainOS,
const auto &RegisterClasses = RegBank.getRegClasses();
if (!RegisterClasses.empty()) {
// RegisterClass enums are stored as uint16_t in the tables.
- assert(RegisterClasses.size() <= 0xffff &&
+ assert(RegisterClasses.size() <= UINT16_MAX &&
"Too many register classes to fit in tables");
OS << "\n// Register classes\n\n";
@@ -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 constexpr {} 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);
``````````
</details>
https://github.com/llvm/llvm-project/pull/181479
More information about the llvm-commits
mailing list