Skip to content

Commit 87babe7

Browse files
committed
CodeGen: Eliminate dynamic relocations in the register superclass tables.
1 parent d31fb26 commit 87babe7

File tree

6 files changed

+27
-27
lines changed

6 files changed

+27
-27
lines changed

llvm/include/llvm/CodeGen/TargetRegisterInfo.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class TargetRegisterClass {
4646
public:
4747
using iterator = const MCPhysReg *;
4848
using const_iterator = const MCPhysReg *;
49-
using sc_iterator = const TargetRegisterClass* const *;
49+
using sc_iterator = const unsigned *;
5050

5151
// Instance variables filled by tablegen, do not use!
5252
const MCRegisterClass *MC;
@@ -184,9 +184,7 @@ class TargetRegisterClass {
184184

185185
/// Return true if this TargetRegisterClass is a subset
186186
/// class of at least one other TargetRegisterClass.
187-
bool isASubClass() const {
188-
return SuperClasses[0] != nullptr;
189-
}
187+
bool isASubClass() const { return SuperClasses[0] != ~0U; }
190188

191189
/// Returns the preferred order for allocating registers from this register
192190
/// class in MF. The raw order comes directly from the .td file and may

llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,30 +262,30 @@ bool ARMBaseRegisterInfo::isInlineAsmReadOnlyReg(const MachineFunction &MF,
262262
const TargetRegisterClass *
263263
ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
264264
const MachineFunction &MF) const {
265-
const TargetRegisterClass *Super = RC;
265+
unsigned SuperID = RC->getID();
266266
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
267267
do {
268-
switch (Super->getID()) {
268+
switch (SuperID) {
269269
case ARM::GPRRegClassID:
270270
case ARM::SPRRegClassID:
271271
case ARM::DPRRegClassID:
272272
case ARM::GPRPairRegClassID:
273-
return Super;
273+
return getRegClass(SuperID);
274274
case ARM::QPRRegClassID:
275275
case ARM::QQPRRegClassID:
276276
case ARM::QQQQPRRegClassID:
277277
if (MF.getSubtarget<ARMSubtarget>().hasNEON())
278-
return Super;
278+
return getRegClass(SuperID);
279279
break;
280280
case ARM::MQPRRegClassID:
281281
case ARM::MQQPRRegClassID:
282282
case ARM::MQQQQPRRegClassID:
283283
if (MF.getSubtarget<ARMSubtarget>().hasMVEIntegerOps())
284-
return Super;
284+
return getRegClass(SuperID);
285285
break;
286286
}
287-
Super = *I++;
288-
} while (Super);
287+
SuperID = *I++;
288+
} while (SuperID != ~0U);
289289
return RC;
290290
}
291291

llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,8 +431,9 @@ unsigned HexagonRegisterInfo::getHexagonSubRegIndex(
431431
return WSub[GenIdx];
432432
}
433433

434-
if (const TargetRegisterClass *SuperRC = *RC.getSuperClasses())
435-
return getHexagonSubRegIndex(*SuperRC, GenIdx);
434+
unsigned SuperID = *RC.getSuperClasses();
435+
if (SuperID != ~0U)
436+
return getHexagonSubRegIndex(*getRegClass(SuperID), GenIdx);
436437

437438
llvm_unreachable("Invalid register class");
438439
}

llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -692,21 +692,22 @@ PPCRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
692692
InflateGPRC++;
693693
}
694694

695-
for (const auto *I = RC->getSuperClasses(); *I; ++I) {
696-
if (getRegSizeInBits(**I) != getRegSizeInBits(*RC))
695+
for (const unsigned *I = RC->getSuperClasses(); *I != ~0U; ++I) {
696+
if (getRegSizeInBits(*getRegClass(*I)) != getRegSizeInBits(*RC))
697697
continue;
698698

699-
switch ((*I)->getID()) {
699+
switch (*I) {
700700
case PPC::VSSRCRegClassID:
701-
return Subtarget.hasP8Vector() ? *I : DefaultSuperclass;
701+
return Subtarget.hasP8Vector() ? getRegClass(*I) : DefaultSuperclass;
702702
case PPC::VSFRCRegClassID:
703703
case PPC::VSRCRegClassID:
704-
return *I;
704+
return getRegClass(*I);
705705
case PPC::VSRpRCRegClassID:
706-
return Subtarget.pairedVectorMemops() ? *I : DefaultSuperclass;
706+
return Subtarget.pairedVectorMemops() ? getRegClass(*I)
707+
: DefaultSuperclass;
707708
case PPC::ACCRCRegClassID:
708709
case PPC::UACCRCRegClassID:
709-
return Subtarget.hasMMA() ? *I : DefaultSuperclass;
710+
return Subtarget.hasMMA() ? getRegClass(*I) : DefaultSuperclass;
710711
}
711712
}
712713
}

llvm/lib/Target/X86/X86RegisterInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
172172
if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
173173
return Super;
174174
}
175-
Super = *I++;
175+
Super = (*I != ~0U) ? getRegClass(*I) : nullptr;
176+
++I;
176177
} while (Super);
177178
return RC;
178179
}

llvm/utils/TableGen/RegisterInfoEmitter.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,8 +1286,8 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
12861286
}
12871287
OS << "};\n";
12881288

1289-
OS << "\nstatic const TargetRegisterClass *const "
1290-
<< "NullRegClasses[] = { nullptr };\n\n";
1289+
OS << "\nstatic const unsigned "
1290+
<< "NullRegClasses[] = { ~0U };\n\n";
12911291

12921292
// Emit register class bit mask tables. The first bit mask emitted for a
12931293
// register class, RC, is the set of sub-classes, including RC itself.
@@ -1348,11 +1348,10 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
13481348
if (Supers.empty())
13491349
continue;
13501350

1351-
OS << "static const TargetRegisterClass *const " << RC.getName()
1352-
<< "Superclasses[] = {\n";
1351+
OS << "static unsigned const " << RC.getName() << "Superclasses[] = {\n";
13531352
for (const auto *Super : Supers)
1354-
OS << " &" << Super->getQualifiedName() << "RegClass,\n";
1355-
OS << " nullptr\n};\n\n";
1353+
OS << " " << Super->getQualifiedIdName() << ",\n";
1354+
OS << " ~0U\n};\n\n";
13561355
}
13571356

13581357
// Emit methods.

0 commit comments

Comments
 (0)