Skip to content

Commit 5775db2

Browse files
committed
[TableGen][RegisterInfoEmitter] Make entries of base register class tables human-readable.
Helps tracking changes in the tables on adding new register classes and updating BaseClassOrder values. Also eliminates tables translating base register class indexes into TargetRegisterClass pointers. Reviewed By: critson Differential Revision: https://reviews.llvm.org/D156097
1 parent 7d2fa9e commit 5775db2

File tree

2 files changed

+36
-29
lines changed

2 files changed

+36
-29
lines changed

llvm/test/TableGen/RegisterInfoEmitter-BaseClassOrder.td

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ def BaseC : RegisterClass<"MyTarget", [i32], 32, (sequence "R%u", 2, 3)> {
2828

2929
def MyTarget : Target;
3030

31-
// CHECK: static const TargetRegisterClass *BaseClasses[4] = {
32-
// CHECK-NEXT: nullptr,
33-
// CHECK-NEXT: &MyTarget::BaseCRegClass,
34-
// CHECK-NEXT: &MyTarget::BaseARegClass,
35-
// CHECK-NEXT: &MyTarget::BaseBRegClass,
36-
// CHECK-NEXT: }
37-
// CHECK-NEXT: static const uint8_t Mapping[8] = {
38-
// CHECK-NEXT: 0,2,2,1,1,3,3,0, };
31+
// CHECK: static const uint16_t Mapping[8] = {
32+
// CHECK-NEXT: InvalidRegClassID, // NoRegister
33+
// CHECK-NEXT: MyTarget::BaseARegClassID, // R0
34+
// CHECK-NEXT: MyTarget::BaseARegClassID, // R1
35+
// CHECK-NEXT: MyTarget::BaseCRegClassID, // R2
36+
// CHECK-NEXT: MyTarget::BaseCRegClassID, // R3
37+
// CHECK-NEXT: MyTarget::BaseBRegClassID, // R4
38+
// CHECK-NEXT: MyTarget::BaseBRegClassID, // R5
39+
// CHECK-NEXT: InvalidRegClassID, // R6
40+
// CHECK-NEXT: };

llvm/utils/TableGen/RegisterInfoEmitter.cpp

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,8 +1591,8 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
15911591
BaseClasses.push_back(&RC);
15921592
}
15931593
if (!BaseClasses.empty()) {
1594-
// Represent class indexes with uint8_t and allocate one index for nullptr
1595-
assert(BaseClasses.size() <= UINT8_MAX && "Too many base register classes");
1594+
assert(BaseClasses.size() < UINT16_MAX &&
1595+
"Too many base register classes");
15961596

15971597
// Apply order
15981598
struct BaseClassOrdering {
@@ -1603,30 +1603,35 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
16031603
};
16041604
llvm::stable_sort(BaseClasses, BaseClassOrdering());
16051605

1606-
// Build mapping for Regs (+1 for NoRegister)
1607-
std::vector<uint8_t> Mapping(Regs.size() + 1, 0);
1608-
for (int RCIdx = BaseClasses.size() - 1; RCIdx >= 0; --RCIdx) {
1609-
for (const auto Reg : BaseClasses[RCIdx]->getMembers())
1610-
Mapping[Reg->EnumValue] = RCIdx + 1;
1611-
}
1612-
16131606
OS << "\n// Register to base register class mapping\n\n";
16141607
OS << "\n";
16151608
OS << "const TargetRegisterClass *" << ClassName
16161609
<< "::getPhysRegBaseClass(MCRegister Reg)"
16171610
<< " const {\n";
1618-
OS << " static const TargetRegisterClass *BaseClasses[" << (BaseClasses.size() + 1) << "] = {\n";
1619-
OS << " nullptr,\n";
1620-
for (const auto RC : BaseClasses)
1621-
OS << " &" << RC->getQualifiedName() << "RegClass,\n";
1622-
OS << " };\n";
1623-
OS << " static const uint8_t Mapping[" << Mapping.size() << "] = {\n ";
1624-
for (const uint8_t Value : Mapping)
1625-
OS << (unsigned)Value << ",";
1626-
OS << " };\n\n";
1627-
OS << " assert(Reg < sizeof(Mapping));\n";
1628-
OS << " return BaseClasses[Mapping[Reg]];\n";
1629-
OS << "}\n";
1611+
OS << " static const uint16_t InvalidRegClassID = UINT16_MAX;\n\n";
1612+
OS << " static const uint16_t Mapping[" << Regs.size() + 1 << "] = {\n";
1613+
OS << " InvalidRegClassID, // NoRegister\n";
1614+
for (const CodeGenRegister &Reg : Regs) {
1615+
const CodeGenRegisterClass *BaseRC = nullptr;
1616+
for (const CodeGenRegisterClass *RC : BaseClasses) {
1617+
if (is_contained(RC->getMembers(), &Reg)) {
1618+
BaseRC = RC;
1619+
break;
1620+
}
1621+
}
1622+
1623+
OS << " "
1624+
<< (BaseRC ? BaseRC->getQualifiedName() + "RegClassID"
1625+
: "InvalidRegClassID")
1626+
<< ", // " << Reg.getName() << "\n";
1627+
}
1628+
OS << " };\n\n"
1629+
" assert(Reg < ArrayRef(Mapping).size());\n"
1630+
" unsigned RCID = Mapping[Reg];\n"
1631+
" if (RCID == InvalidRegClassID)\n"
1632+
" return nullptr;\n"
1633+
" return RegisterClasses[RCID];\n"
1634+
"}\n";
16301635
}
16311636
}
16321637

0 commit comments

Comments
 (0)