@@ -701,11 +701,13 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
701
701
Orders.resize (1 + AltOrders->size ());
702
702
703
703
// Default allocation order always contains all registers.
704
+ MemberBV.resize (RegBank.getRegisters ().size ());
704
705
Artificial = true ;
705
706
for (const Record *Element : *Elements) {
706
707
Orders[0 ].push_back (Element);
707
708
const CodeGenRegister *Reg = RegBank.getReg (Element);
708
709
Members.push_back (Reg);
710
+ MemberBV.set (CodeGenRegBank::getRegIndex (Reg));
709
711
Artificial &= Reg->Artificial ;
710
712
if (!Reg->getSuperRegs ().empty ())
711
713
RegsWithSuperRegsTopoSigs.set (Reg->getTopoSig ());
@@ -767,9 +769,11 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
767
769
RegsWithSuperRegsTopoSigs(RegBank.getNumTopoSigs()), EnumValue(-1 ),
768
770
RSI(Props.RSI), CopyCost(0 ), Allocatable(true ), AllocationPriority(0 ),
769
771
GlobalPriority(false ), TSFlags(0 ) {
772
+ MemberBV.resize (RegBank.getRegisters ().size ());
770
773
Artificial = true ;
771
774
GeneratePressureSet = false ;
772
775
for (const auto R : Members) {
776
+ MemberBV.set (CodeGenRegBank::getRegIndex (R));
773
777
if (!R->getSuperRegs ().empty ())
774
778
RegsWithSuperRegsTopoSigs.set (R->getTopoSig ());
775
779
Artificial &= R->Artificial ;
@@ -833,7 +837,7 @@ bool CodeGenRegisterClass::hasType(const ValueTypeByHwMode &VT) const {
833
837
}
834
838
835
839
bool CodeGenRegisterClass::contains (const CodeGenRegister *Reg) const {
836
- return llvm::binary_search (Members, Reg, deref<std::less<>>( ));
840
+ return MemberBV. test ( CodeGenRegBank::getRegIndex (Reg ));
837
841
}
838
842
839
843
unsigned CodeGenRegisterClass::getWeight (const CodeGenRegBank &RegBank) const {
@@ -2329,8 +2333,7 @@ void CodeGenRegBank::inferMatchingSuperRegClass(
2329
2333
CodeGenRegisterClass *RC,
2330
2334
std::list<CodeGenRegisterClass>::iterator FirstSubRegRC) {
2331
2335
DenseSet<const CodeGenSubRegIndex *> ImpliedSubRegIndices;
2332
- std::vector<std::pair<const CodeGenRegister *, const CodeGenRegister *>>
2333
- SubToSuperRegs;
2336
+ std::vector<const CodeGenRegister *> SubRegs;
2334
2337
BitVector TopoSigs (getNumTopoSigs ());
2335
2338
2336
2339
// Iterate subregister indices in topological order to visit larger indices
@@ -2348,15 +2351,14 @@ void CodeGenRegBank::inferMatchingSuperRegClass(
2348
2351
2349
2352
// Build list of (Sub, Super) pairs for this SubIdx, sorted by Sub. Note
2350
2353
// that the list may contain entries with the same Sub but different Supers.
2351
- SubToSuperRegs .clear ();
2354
+ SubRegs .clear ();
2352
2355
TopoSigs.reset ();
2353
2356
for (const CodeGenRegister *Super : RC->getMembers ()) {
2354
2357
const CodeGenRegister *Sub = Super->getSubRegs ().find (SubIdx)->second ;
2355
2358
assert (Sub && " Missing sub-register" );
2356
- SubToSuperRegs. emplace_back (Sub, Super );
2359
+ SubRegs. push_back (Sub);
2357
2360
TopoSigs.set (Sub->getTopoSig ());
2358
2361
}
2359
- sort (SubToSuperRegs, on_first<deref<std::less<>>>());
2360
2362
2361
2363
// Iterate over sub-register class candidates. Ignore classes created by
2362
2364
// this loop. They will never be useful.
@@ -2371,24 +2373,17 @@ void CodeGenRegBank::inferMatchingSuperRegClass(
2371
2373
// Topological shortcut: SubRC members have the wrong shape.
2372
2374
if (!TopoSigs.anyCommon (SubRC.getRegsWithSuperRegsTopoSigs ()))
2373
2375
continue ;
2374
- // Compute the subset of RC that maps into SubRC with a single linear scan
2375
- // through SubToSuperRegs and the members of SubRC.
2376
+ // Compute the subset of RC that maps into SubRC.
2376
2377
CodeGenRegister::Vec SubSetVec;
2377
- auto SubI = SubRC.getMembers ().begin (), SubE = SubRC.getMembers ().end ();
2378
- for (auto &[Sub, Super] : SubToSuperRegs) {
2379
- while (SubI != SubE && **SubI < *Sub)
2380
- ++SubI;
2381
- if (SubI == SubE)
2382
- break ;
2383
- if (**SubI == *Sub)
2378
+ for (const auto &[Sub, Super] : zip_equal (SubRegs, RC->getMembers ())) {
2379
+ if (SubRC.contains (Sub))
2384
2380
SubSetVec.push_back (Super);
2385
2381
}
2386
2382
2387
2383
if (SubSetVec.empty ())
2388
2384
continue ;
2389
2385
2390
2386
// RC injects completely into SubRC.
2391
- sortAndUniqueRegisters (SubSetVec);
2392
2387
if (SubSetVec.size () == RC->getMembers ().size ()) {
2393
2388
SubRC.addSuperRegClass (SubIdx, RC);
2394
2389
0 commit comments