Skip to content

Commit bb2bc91

Browse files
committed
Simplify iterator by storing the superclass list size
1 parent cdcf4bd commit bb2bc91

File tree

2 files changed

+9
-19
lines changed

2 files changed

+9
-19
lines changed

llvm/include/llvm/CodeGen/TargetRegisterInfo.h

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,19 @@ class VirtRegMap;
4242
class LiveIntervals;
4343
class LiveInterval;
4444

45-
/// TargetSuperClassIterator enumerates all super-registers of RegClass.
45+
/// TargetSuperClassIterator enumerates all super-classes of RegClass.
4646
class TargetSuperClassIterator
4747
: public iterator_adaptor_base<TargetSuperClassIterator, const unsigned *> {
4848
public:
4949
/// Constructs an end iterator.
50-
TargetSuperClassIterator() = default;
51-
5250
TargetSuperClassIterator(const unsigned *V) { I = V; }
5351

5452
const unsigned &operator*() const { return *I; }
5553

5654
using iterator_adaptor_base::operator++;
5755

58-
bool operator==(const TargetSuperClassIterator &Other) const {
59-
// End can be represented either with a nullptr or with a ptr to
60-
// a sentinel value of ~0U. They must compare equal.
61-
bool SelfIsEnd = !I || *I == ~0U;
62-
bool OtherIsEnd = !Other.I || *Other.I == ~0U;
63-
if (SelfIsEnd && OtherIsEnd)
64-
return true;
65-
66-
return I == Other.I;
67-
}
68-
6956
/// Returns true if this iterator is not yet at the end.
70-
bool isValid() const { return I && *I != ~0U; }
57+
bool isValid() const { return *I != ~0U; }
7158
};
7259

7360
class TargetRegisterClass {
@@ -95,6 +82,7 @@ class TargetRegisterClass {
9582
/// class. See also the CoveredBySubRegs description in Target.td.
9683
const bool CoveredBySubRegs;
9784
const unsigned *SuperClasses;
85+
const uint16_t SuperClassesSize;
9886
ArrayRef<MCPhysReg> (*OrderFunc)(const MachineFunction&);
9987

10088
/// Return the register class ID number.
@@ -202,11 +190,12 @@ class TargetRegisterClass {
202190
return SuperRegIndices;
203191
}
204192

205-
/// Returns a NULL-terminated list of super-classes. The
193+
/// Returns a ~0U-terminated list of super-classes. The
206194
/// classes are ordered by ID which is also a topological ordering from large
207195
/// to small classes. The list does NOT include the current class.
208196
iterator_range<TargetSuperClassIterator> superclasses() const {
209-
return make_range({SuperClasses}, TargetSuperClassIterator());
197+
return make_range(TargetSuperClassIterator(SuperClasses),
198+
{SuperClasses + SuperClassesSize});
210199
}
211200

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

llvm/utils/TableGen/RegisterInfoEmitter.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,9 +1405,10 @@ void RegisterInfoEmitter::runTargetDesc(raw_ostream &OS) {
14051405
<< (RC.CoveredBySubRegs ? "true" : "false")
14061406
<< ", /* CoveredBySubRegs */\n ";
14071407
if (RC.getSuperClasses().empty())
1408-
OS << "NullRegClasses,\n ";
1408+
OS << "NullRegClasses, ";
14091409
else
1410-
OS << RC.getName() << "Superclasses,\n ";
1410+
OS << RC.getName() << "Superclasses, ";
1411+
OS << RC.getSuperClasses().size() << ",\n ";
14111412
if (RC.AltOrderSelect.empty())
14121413
OS << "nullptr\n";
14131414
else

0 commit comments

Comments
 (0)