Skip to content

Commit e940353

Browse files
committedDec 11, 2024·
Revert "CodeGen: Eliminate dynamic relocations in the register superclass tables. (#119122)"
Reverting due to UBSan failures in X86RegisterInfo::getLargestLegalSuperClass This reverts commit c487381.
1 parent 87659a1 commit e940353

File tree

7 files changed

+40
-40
lines changed

7 files changed

+40
-40
lines changed
 

‎llvm/include/llvm/CodeGen/TargetRegisterInfo.h

+9-6
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,12 @@ class RegScavenger;
4141
class VirtRegMap;
4242
class LiveIntervals;
4343
class LiveInterval;
44+
4445
class TargetRegisterClass {
4546
public:
4647
using iterator = const MCPhysReg *;
4748
using const_iterator = const MCPhysReg *;
49+
using sc_iterator = const TargetRegisterClass* const *;
4850

4951
// Instance variables filled by tablegen, do not use!
5052
const MCRegisterClass *MC;
@@ -65,8 +67,7 @@ class TargetRegisterClass {
6567
/// Whether a combination of subregisters can cover every register in the
6668
/// class. See also the CoveredBySubRegs description in Target.td.
6769
const bool CoveredBySubRegs;
68-
const unsigned *SuperClasses;
69-
const uint16_t SuperClassesSize;
70+
const sc_iterator SuperClasses;
7071
ArrayRef<MCPhysReg> (*OrderFunc)(const MachineFunction&);
7172

7273
/// Return the register class ID number.
@@ -174,16 +175,18 @@ class TargetRegisterClass {
174175
return SuperRegIndices;
175176
}
176177

177-
/// Returns a list of super-classes. The
178+
/// Returns a NULL-terminated list of super-classes. The
178179
/// classes are ordered by ID which is also a topological ordering from large
179180
/// to small classes. The list does NOT include the current class.
180-
ArrayRef<unsigned> superclasses() const {
181-
return ArrayRef(SuperClasses, SuperClassesSize);
181+
sc_iterator getSuperClasses() const {
182+
return SuperClasses;
182183
}
183184

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

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

‎llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp

+8-9
Original file line numberDiff line numberDiff line change
@@ -262,31 +262,30 @@ bool ARMBaseRegisterInfo::isInlineAsmReadOnlyReg(const MachineFunction &MF,
262262
const TargetRegisterClass *
263263
ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
264264
const MachineFunction &MF) const {
265-
unsigned SuperID = RC->getID();
266-
auto I = RC->superclasses().begin();
267-
auto E = RC->superclasses().end();
265+
const TargetRegisterClass *Super = RC;
266+
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
268267
do {
269-
switch (SuperID) {
268+
switch (Super->getID()) {
270269
case ARM::GPRRegClassID:
271270
case ARM::SPRRegClassID:
272271
case ARM::DPRRegClassID:
273272
case ARM::GPRPairRegClassID:
274-
return getRegClass(SuperID);
273+
return Super;
275274
case ARM::QPRRegClassID:
276275
case ARM::QQPRRegClassID:
277276
case ARM::QQQQPRRegClassID:
278277
if (MF.getSubtarget<ARMSubtarget>().hasNEON())
279-
return getRegClass(SuperID);
278+
return Super;
280279
break;
281280
case ARM::MQPRRegClassID:
282281
case ARM::MQQPRRegClassID:
283282
case ARM::MQQQQPRRegClassID:
284283
if (MF.getSubtarget<ARMSubtarget>().hasMVEIntegerOps())
285-
return getRegClass(SuperID);
284+
return Super;
286285
break;
287286
}
288-
SuperID = (I != E) ? *I++ : ~0U;
289-
} while (SuperID != ~0U);
287+
Super = *I++;
288+
} while (Super);
290289
return RC;
291290
}
292291

‎llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp

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

434-
if (!RC.superclasses().empty())
435-
return getHexagonSubRegIndex(*getRegClass(*RC.superclasses().begin()),
436-
GenIdx);
434+
if (const TargetRegisterClass *SuperRC = *RC.getSuperClasses())
435+
return getHexagonSubRegIndex(*SuperRC, GenIdx);
437436

438437
llvm_unreachable("Invalid register class");
439438
}

‎llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -692,23 +692,21 @@ PPCRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
692692
InflateGPRC++;
693693
}
694694

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

699-
switch (SuperID) {
699+
switch ((*I)->getID()) {
700700
case PPC::VSSRCRegClassID:
701-
return Subtarget.hasP8Vector() ? getRegClass(SuperID)
702-
: DefaultSuperclass;
701+
return Subtarget.hasP8Vector() ? *I : DefaultSuperclass;
703702
case PPC::VSFRCRegClassID:
704703
case PPC::VSRCRegClassID:
705-
return getRegClass(SuperID);
704+
return *I;
706705
case PPC::VSRpRCRegClassID:
707-
return Subtarget.pairedVectorMemops() ? getRegClass(SuperID)
708-
: DefaultSuperclass;
706+
return Subtarget.pairedVectorMemops() ? *I : DefaultSuperclass;
709707
case PPC::ACCRCRegClassID:
710708
case PPC::UACCRCRegClassID:
711-
return Subtarget.hasMMA() ? getRegClass(SuperID) : DefaultSuperclass;
709+
return Subtarget.hasMMA() ? *I : DefaultSuperclass;
712710
}
713711
}
714712
}

‎llvm/lib/Target/X86/X86RegisterInfo.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,7 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
123123
const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>();
124124

125125
const TargetRegisterClass *Super = RC;
126-
auto I = RC->superclasses().begin();
127-
auto E = RC->superclasses().end();
126+
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
128127
do {
129128
switch (Super->getID()) {
130129
case X86::FR32RegClassID:
@@ -173,8 +172,7 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
173172
if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
174173
return Super;
175174
}
176-
Super = (I != E) ? getRegClass(*I) : nullptr;
177-
++I;
175+
Super = *I++;
178176
} while (Super);
179177
return RC;
180178
}

‎llvm/unittests/CodeGen/MachineInstrTest.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ TEST(MachineInstrTest, SpliceOperands) {
584584
// test tied operands
585585
MCRegisterClass MRC{
586586
0, 0, 0, 0, 0, 0, 0, 0, /*Allocatable=*/true, /*BaseClass=*/true};
587-
TargetRegisterClass RC{&MRC, 0, 0, {}, 0, 0, 0, 0, 0, 0, 0, 0};
587+
TargetRegisterClass RC{&MRC, 0, 0, {}, 0, 0, 0, 0, 0, 0, 0};
588588
// MachineRegisterInfo will be very upset if these registers aren't
589589
// allocatable.
590590
assert(RC.isAllocatable() && "unusable TargetRegisterClass");

‎llvm/utils/TableGen/RegisterInfoEmitter.cpp

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

1289+
OS << "\nstatic const TargetRegisterClass *const "
1290+
<< "NullRegClasses[] = { nullptr };\n\n";
1291+
12891292
// Emit register class bit mask tables. The first bit mask emitted for a
12901293
// register class, RC, is the set of sub-classes, including RC itself.
12911294
//
@@ -1337,18 +1340,19 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
13371340
SuperRegIdxSeqs.emit(OS, printSubRegIndex);
13381341
OS << "};\n\n";
13391342

1340-
// Emit super-class lists.
1343+
// Emit NULL terminated super-class lists.
13411344
for (const auto &RC : RegisterClasses) {
13421345
ArrayRef<CodeGenRegisterClass *> Supers = RC.getSuperClasses();
13431346

1344-
// Skip classes without supers.
1347+
// Skip classes without supers. We can reuse NullRegClasses.
13451348
if (Supers.empty())
13461349
continue;
13471350

1348-
OS << "static unsigned const " << RC.getName() << "Superclasses[] = {\n";
1351+
OS << "static const TargetRegisterClass *const " << RC.getName()
1352+
<< "Superclasses[] = {\n";
13491353
for (const auto *Super : Supers)
1350-
OS << " " << Super->getQualifiedIdName() << ",\n";
1351-
OS << "};\n\n";
1354+
OS << " &" << Super->getQualifiedName() << "RegClass,\n";
1355+
OS << " nullptr\n};\n\n";
13521356
}
13531357

13541358
// Emit methods.
@@ -1402,10 +1406,9 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
14021406
<< (RC.CoveredBySubRegs ? "true" : "false")
14031407
<< ", /* CoveredBySubRegs */\n ";
14041408
if (RC.getSuperClasses().empty())
1405-
OS << "nullptr, ";
1409+
OS << "NullRegClasses,\n ";
14061410
else
1407-
OS << RC.getName() << "Superclasses, ";
1408-
OS << RC.getSuperClasses().size() << ",\n ";
1411+
OS << RC.getName() << "Superclasses,\n ";
14091412
if (RC.AltOrderSelect.empty())
14101413
OS << "nullptr\n";
14111414
else

0 commit comments

Comments
 (0)
Please sign in to comment.