Skip to content

Commit 524b5c9

Browse files
roman1741941github-actions[bot]
authored andcommitted
Automerge: [TableGen] Optimize register bank and info emission. (#208297)
Don't go via a BitVector just to a read a single value out of it.
2 parents 2917b1e + dab4c91 commit 524b5c9

3 files changed

Lines changed: 28 additions & 15 deletions

File tree

llvm/utils/TableGen/Common/CodeGenRegisters.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,18 +1024,12 @@ CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
10241024
"Biggest class wasn't first");
10251025

10261026
// Find all the subreg classes and order them by size too.
1027-
std::vector<std::pair<CodeGenRegisterClass *, BitVector>> SuperRegClasses;
1027+
std::vector<CodeGenRegisterClass *> SuperRegClasses;
10281028
for (auto &RC : RegClasses) {
1029-
BitVector SuperRegClassesBV(RegClasses.size());
1030-
RC.getSuperRegClasses(SubIdx, SuperRegClassesBV);
1031-
if (SuperRegClassesBV.any())
1032-
SuperRegClasses.emplace_back(&RC, SuperRegClassesBV);
1029+
if (RC.hasAnySuperRegClasses(SubIdx))
1030+
SuperRegClasses.push_back(&RC);
10331031
}
1034-
llvm::stable_sort(SuperRegClasses,
1035-
[&](const std::pair<CodeGenRegisterClass *, BitVector> &A,
1036-
const std::pair<CodeGenRegisterClass *, BitVector> &B) {
1037-
return WeakSizeOrder(A.first, B.first);
1038-
});
1032+
llvm::stable_sort(SuperRegClasses, WeakSizeOrder);
10391033

10401034
// Find the biggest subclass and subreg class such that R:subidx is in the
10411035
// subreg class for all R in subclass.
@@ -1049,8 +1043,8 @@ CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
10491043
CodeGenRegisterClass *ChosenSuperRegClass = nullptr;
10501044
CodeGenRegisterClass *SubRegRC = nullptr;
10511045
for (CodeGenRegisterClass *SuperRegRC : SuperRegRCs) {
1052-
for (const auto &[SuperRegClass, SuperRegClassBV] : SuperRegClasses) {
1053-
if (SuperRegClassBV[SuperRegRC->EnumValue]) {
1046+
for (CodeGenRegisterClass *SuperRegClass : SuperRegClasses) {
1047+
if (SuperRegClass->hasSuperRegClass(SubIdx, SuperRegRC)) {
10541048
SubRegRC = SuperRegClass;
10551049
ChosenSuperRegClass = SuperRegRC;
10561050

@@ -1077,6 +1071,18 @@ CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
10771071
return std::nullopt;
10781072
}
10791073

1074+
bool CodeGenRegisterClass::hasAnySuperRegClasses(
1075+
const CodeGenSubRegIndex *SubIdx) const {
1076+
return SuperRegClasses.contains(SubIdx);
1077+
}
1078+
1079+
bool CodeGenRegisterClass::hasSuperRegClass(
1080+
const CodeGenSubRegIndex *SubIdx, const CodeGenRegisterClass *RC) const {
1081+
auto FindI = SuperRegClasses.find(SubIdx);
1082+
1083+
return FindI != SuperRegClasses.end() && FindI->second.contains(RC);
1084+
}
1085+
10801086
void CodeGenRegisterClass::getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,
10811087
BitVector &Out) const {
10821088
auto FindI = SuperRegClasses.find(SubIdx);

llvm/utils/TableGen/Common/CodeGenRegisters.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,15 @@ class CodeGenRegisterClass {
447447
SubClassWithSubReg[SubIdx] = SubRC;
448448
}
449449

450+
/// Checks if there are any super-register classes for this SubIdx of this
451+
/// class.
452+
bool hasAnySuperRegClasses(const CodeGenSubRegIndex *SubIdx) const;
453+
454+
/// Checks if there is a super-register class for this SubIdx of this
455+
/// class containing RC register class.
456+
bool hasSuperRegClass(const CodeGenSubRegIndex *SubIdx,
457+
const CodeGenRegisterClass *RC) const;
458+
450459
// getSuperRegClasses - Returns a bit vector of all register classes
451460
// containing only SubIdx super-registers of this class.
452461
void getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,

llvm/utils/TableGen/RegisterBankEmitter.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,7 @@ static void visitRegisterBankClasses(
206206
// PossibleSubclass for all registers Reg from RC using any
207207
// subregister-index SubReg
208208
for (const auto &SubIdx : RegisterClassHierarchy.getSubRegIndices()) {
209-
BitVector BV(RegisterClassHierarchy.getRegClasses().size());
210-
PossibleSubclass.getSuperRegClasses(&SubIdx, BV);
211-
if (BV.test(RC->EnumValue)) {
209+
if (PossibleSubclass.hasSuperRegClass(&SubIdx, RC)) {
212210
std::string TmpKind2 = (Twine(TmpKind) + " " + RC->getName() +
213211
" class-with-subregs: " + RC->getName())
214212
.str();

0 commit comments

Comments
 (0)