Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions llvm/include/llvm/CodeGen/TargetRegisterInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,10 @@ class RegScavenger;
class VirtRegMap;
class LiveIntervals;
class LiveInterval;

class TargetRegisterClass {
public:
using iterator = const MCPhysReg *;
using const_iterator = const MCPhysReg *;
using sc_iterator = const TargetRegisterClass* const *;

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

/// Return the register class ID number.
Expand Down Expand Up @@ -175,18 +174,16 @@ class TargetRegisterClass {
return SuperRegIndices;
}

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

/// Return true if this TargetRegisterClass is a subset
/// class of at least one other TargetRegisterClass.
bool isASubClass() const {
return SuperClasses[0] != nullptr;
}
bool isASubClass() const { return SuperClasses != nullptr; }

/// Returns the preferred order for allocating registers from this register
/// class in MF. The raw order comes directly from the .td file and may
Expand Down
17 changes: 9 additions & 8 deletions llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,30 +262,31 @@ bool ARMBaseRegisterInfo::isInlineAsmReadOnlyReg(const MachineFunction &MF,
const TargetRegisterClass *
ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
const MachineFunction &MF) const {
const TargetRegisterClass *Super = RC;
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
unsigned SuperID = RC->getID();
auto I = RC->superclasses().begin();
auto E = RC->superclasses().end();
do {
switch (Super->getID()) {
switch (SuperID) {
case ARM::GPRRegClassID:
case ARM::SPRRegClassID:
case ARM::DPRRegClassID:
case ARM::GPRPairRegClassID:
return Super;
return getRegClass(SuperID);
case ARM::QPRRegClassID:
case ARM::QQPRRegClassID:
case ARM::QQQQPRRegClassID:
if (MF.getSubtarget<ARMSubtarget>().hasNEON())
return Super;
return getRegClass(SuperID);
break;
case ARM::MQPRRegClassID:
case ARM::MQQPRRegClassID:
case ARM::MQQQQPRRegClassID:
if (MF.getSubtarget<ARMSubtarget>().hasMVEIntegerOps())
return Super;
return getRegClass(SuperID);
break;
}
Super = *I++;
} while (Super);
SuperID = (I != E) ? *I++ : ~0U;
} while (SuperID != ~0U);
return RC;
}

Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -431,8 +431,9 @@ unsigned HexagonRegisterInfo::getHexagonSubRegIndex(
return WSub[GenIdx];
}

if (const TargetRegisterClass *SuperRC = *RC.getSuperClasses())
return getHexagonSubRegIndex(*SuperRC, GenIdx);
if (!RC.superclasses().empty())
return getHexagonSubRegIndex(*getRegClass(*RC.superclasses().begin()),
GenIdx);

llvm_unreachable("Invalid register class");
}
Expand Down
16 changes: 9 additions & 7 deletions llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -692,21 +692,23 @@ PPCRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
InflateGPRC++;
}

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

switch ((*I)->getID()) {
switch (SuperID) {
case PPC::VSSRCRegClassID:
return Subtarget.hasP8Vector() ? *I : DefaultSuperclass;
return Subtarget.hasP8Vector() ? getRegClass(SuperID)
: DefaultSuperclass;
case PPC::VSFRCRegClassID:
case PPC::VSRCRegClassID:
return *I;
return getRegClass(SuperID);
case PPC::VSRpRCRegClassID:
return Subtarget.pairedVectorMemops() ? *I : DefaultSuperclass;
return Subtarget.pairedVectorMemops() ? getRegClass(SuperID)
: DefaultSuperclass;
case PPC::ACCRCRegClassID:
case PPC::UACCRCRegClassID:
return Subtarget.hasMMA() ? *I : DefaultSuperclass;
return Subtarget.hasMMA() ? getRegClass(SuperID) : DefaultSuperclass;
}
}
}
Expand Down
10 changes: 8 additions & 2 deletions llvm/lib/Target/X86/X86RegisterInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>();

const TargetRegisterClass *Super = RC;
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
auto I = RC->superclasses().begin();
auto E = RC->superclasses().end();
do {
switch (Super->getID()) {
case X86::FR32RegClassID:
Expand Down Expand Up @@ -172,7 +173,12 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
return Super;
}
Super = *I++;
if (I != E) {
Super = getRegClass(*I);
++I;
} else {
Super = nullptr;
}
} while (Super);
return RC;
}
Expand Down
2 changes: 1 addition & 1 deletion llvm/unittests/CodeGen/MachineInstrTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,7 @@ TEST(MachineInstrTest, SpliceOperands) {
// test tied operands
MCRegisterClass MRC{
0, 0, 0, 0, 0, 0, 0, 0, /*Allocatable=*/true, /*BaseClass=*/true};
TargetRegisterClass RC{&MRC, 0, 0, {}, 0, 0, 0, 0, 0, 0, 0};
TargetRegisterClass RC{&MRC, 0, 0, {}, 0, 0, 0, 0, 0, 0, 0, 0};
// MachineRegisterInfo will be very upset if these registers aren't
// allocatable.
assert(RC.isAllocatable() && "unusable TargetRegisterClass");
Expand Down
19 changes: 8 additions & 11 deletions llvm/utils/TableGen/RegisterInfoEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1286,9 +1286,6 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
}
OS << "};\n";

OS << "\nstatic const TargetRegisterClass *const "
<< "NullRegClasses[] = { nullptr };\n\n";

// Emit register class bit mask tables. The first bit mask emitted for a
// register class, RC, is the set of sub-classes, including RC itself.
//
Expand Down Expand Up @@ -1340,19 +1337,18 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
SuperRegIdxSeqs.emit(OS, printSubRegIndex);
OS << "};\n\n";

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

// Skip classes without supers. We can reuse NullRegClasses.
// Skip classes without supers.
if (Supers.empty())
continue;

OS << "static const TargetRegisterClass *const " << RC.getName()
<< "Superclasses[] = {\n";
OS << "static unsigned const " << RC.getName() << "Superclasses[] = {\n";
for (const auto *Super : Supers)
OS << " &" << Super->getQualifiedName() << "RegClass,\n";
OS << " nullptr\n};\n\n";
OS << " " << Super->getQualifiedIdName() << ",\n";
OS << "};\n\n";
}

// Emit methods.
Expand Down Expand Up @@ -1406,9 +1402,10 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
<< (RC.CoveredBySubRegs ? "true" : "false")
<< ", /* CoveredBySubRegs */\n ";
if (RC.getSuperClasses().empty())
OS << "NullRegClasses,\n ";
OS << "nullptr, ";
else
OS << RC.getName() << "Superclasses,\n ";
OS << RC.getName() << "Superclasses, ";
OS << RC.getSuperClasses().size() << ",\n ";
if (RC.AltOrderSelect.empty())
OS << "nullptr\n";
else
Expand Down
Loading