Skip to content

Commit cd16029

Browse files
committed
Use iterator wrappers for superclasses
1 parent 87babe7 commit cd16029

File tree

5 files changed

+32
-15
lines changed

5 files changed

+32
-15
lines changed

llvm/include/llvm/CodeGen/TargetRegisterInfo.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,27 @@ class VirtRegMap;
4242
class LiveIntervals;
4343
class LiveInterval;
4444

45+
/// TargetSuperClassIterator enumerates all super-registers of RegClass.
46+
class TargetSuperClassIterator
47+
: public iterator_adaptor_base<TargetSuperClassIterator, const unsigned *> {
48+
public:
49+
/// Constructs an end iterator.
50+
TargetSuperClassIterator() = default;
51+
52+
TargetSuperClassIterator(const unsigned *V) { I = V; }
53+
54+
const unsigned &operator*() const { return *I; }
55+
56+
using iterator_adaptor_base::operator++;
57+
58+
/// Returns true if this iterator is not yet at the end.
59+
bool isValid() const { return I && *I != ~0U; }
60+
};
61+
4562
class TargetRegisterClass {
4663
public:
4764
using iterator = const MCPhysReg *;
4865
using const_iterator = const MCPhysReg *;
49-
using sc_iterator = const unsigned *;
5066

5167
// Instance variables filled by tablegen, do not use!
5268
const MCRegisterClass *MC;
@@ -67,7 +83,7 @@ class TargetRegisterClass {
6783
/// Whether a combination of subregisters can cover every register in the
6884
/// class. See also the CoveredBySubRegs description in Target.td.
6985
const bool CoveredBySubRegs;
70-
const sc_iterator SuperClasses;
86+
const unsigned *SuperClasses;
7187
ArrayRef<MCPhysReg> (*OrderFunc)(const MachineFunction&);
7288

7389
/// Return the register class ID number.
@@ -178,8 +194,8 @@ class TargetRegisterClass {
178194
/// Returns a NULL-terminated list of super-classes. The
179195
/// classes are ordered by ID which is also a topological ordering from large
180196
/// to small classes. The list does NOT include the current class.
181-
sc_iterator getSuperClasses() const {
182-
return SuperClasses;
197+
iterator_range<TargetSuperClassIterator> superclasses() const {
198+
return make_range({SuperClasses}, TargetSuperClassIterator());
183199
}
184200

185201
/// Return true if this TargetRegisterClass is a subset

llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ const TargetRegisterClass *
263263
ARMBaseRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
264264
const MachineFunction &MF) const {
265265
unsigned SuperID = RC->getID();
266-
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
266+
auto I = RC->superclasses().begin();
267267
do {
268268
switch (SuperID) {
269269
case ARM::GPRRegClassID:

llvm/lib/Target/Hexagon/HexagonRegisterInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ unsigned HexagonRegisterInfo::getHexagonSubRegIndex(
431431
return WSub[GenIdx];
432432
}
433433

434-
unsigned SuperID = *RC.getSuperClasses();
434+
unsigned SuperID = *RC.superclasses().begin();
435435
if (SuperID != ~0U)
436436
return getHexagonSubRegIndex(*getRegClass(SuperID), GenIdx);
437437

llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp

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

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

699-
switch (*I) {
699+
switch (SuperID) {
700700
case PPC::VSSRCRegClassID:
701-
return Subtarget.hasP8Vector() ? getRegClass(*I) : DefaultSuperclass;
701+
return Subtarget.hasP8Vector() ? getRegClass(SuperID)
702+
: DefaultSuperclass;
702703
case PPC::VSFRCRegClassID:
703704
case PPC::VSRCRegClassID:
704-
return getRegClass(*I);
705+
return getRegClass(SuperID);
705706
case PPC::VSRpRCRegClassID:
706-
return Subtarget.pairedVectorMemops() ? getRegClass(*I)
707+
return Subtarget.pairedVectorMemops() ? getRegClass(SuperID)
707708
: DefaultSuperclass;
708709
case PPC::ACCRCRegClassID:
709710
case PPC::UACCRCRegClassID:
710-
return Subtarget.hasMMA() ? getRegClass(*I) : DefaultSuperclass;
711+
return Subtarget.hasMMA() ? getRegClass(SuperID) : DefaultSuperclass;
711712
}
712713
}
713714
}

llvm/lib/Target/X86/X86RegisterInfo.cpp

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

125125
const TargetRegisterClass *Super = RC;
126-
TargetRegisterClass::sc_iterator I = RC->getSuperClasses();
126+
auto I = RC->superclasses().begin();
127127
do {
128128
switch (Super->getID()) {
129129
case X86::FR32RegClassID:
@@ -172,7 +172,7 @@ X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC,
172172
if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC))
173173
return Super;
174174
}
175-
Super = (*I != ~0U) ? getRegClass(*I) : nullptr;
175+
Super = I.isValid() ? getRegClass(*I) : nullptr;
176176
++I;
177177
} while (Super);
178178
return RC;

0 commit comments

Comments
 (0)