@@ -42,11 +42,27 @@ class VirtRegMap;
4242class LiveIntervals ;
4343class 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+
4562class TargetRegisterClass {
4663public:
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
0 commit comments