@@ -701,11 +701,13 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
701701 Orders.resize (1 + AltOrders->size ());
702702
703703 // Default allocation order always contains all registers.
704+ MemberBV.resize (RegBank.getRegisters ().size ());
704705 Artificial = true ;
705706 for (const Record *Element : *Elements) {
706707 Orders[0 ].push_back (Element);
707708 const CodeGenRegister *Reg = RegBank.getReg (Element);
708709 Members.push_back (Reg);
710+ MemberBV.set (CodeGenRegBank::getRegIndex (Reg));
709711 Artificial &= Reg->Artificial ;
710712 if (!Reg->getSuperRegs ().empty ())
711713 RegsWithSuperRegsTopoSigs.set (Reg->getTopoSig ());
@@ -767,9 +769,11 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
767769 RegsWithSuperRegsTopoSigs(RegBank.getNumTopoSigs()), EnumValue(-1 ),
768770 RSI(Props.RSI), CopyCost(0 ), Allocatable(true ), AllocationPriority(0 ),
769771 GlobalPriority(false ), TSFlags(0 ) {
772+ MemberBV.resize (RegBank.getRegisters ().size ());
770773 Artificial = true ;
771774 GeneratePressureSet = false ;
772775 for (const auto R : Members) {
776+ MemberBV.set (CodeGenRegBank::getRegIndex (R));
773777 if (!R->getSuperRegs ().empty ())
774778 RegsWithSuperRegsTopoSigs.set (R->getTopoSig ());
775779 Artificial &= R->Artificial ;
@@ -833,7 +837,7 @@ bool CodeGenRegisterClass::hasType(const ValueTypeByHwMode &VT) const {
833837}
834838
835839bool CodeGenRegisterClass::contains (const CodeGenRegister *Reg) const {
836- return llvm::binary_search (Members, Reg, deref<std::less<>>( ));
840+ return MemberBV. test ( CodeGenRegBank::getRegIndex (Reg ));
837841}
838842
839843unsigned CodeGenRegisterClass::getWeight (const CodeGenRegBank &RegBank) const {
@@ -2332,8 +2336,7 @@ void CodeGenRegBank::inferMatchingSuperRegClass(
23322336 CodeGenRegisterClass *RC,
23332337 std::list<CodeGenRegisterClass>::iterator FirstSubRegRC) {
23342338 DenseSet<const CodeGenSubRegIndex *> ImpliedSubRegIndices;
2335- std::vector<std::pair<const CodeGenRegister *, const CodeGenRegister *>>
2336- SubToSuperRegs;
2339+ std::vector<const CodeGenRegister *> SubRegs;
23372340 BitVector TopoSigs (getNumTopoSigs ());
23382341
23392342 // Iterate subregister indices in topological order to visit larger indices
@@ -2351,15 +2354,14 @@ void CodeGenRegBank::inferMatchingSuperRegClass(
23512354
23522355 // Build list of (Sub, Super) pairs for this SubIdx, sorted by Sub. Note
23532356 // that the list may contain entries with the same Sub but different Supers.
2354- SubToSuperRegs .clear ();
2357+ SubRegs .clear ();
23552358 TopoSigs.reset ();
23562359 for (const CodeGenRegister *Super : RC->getMembers ()) {
23572360 const CodeGenRegister *Sub = Super->getSubRegs ().find (SubIdx)->second ;
23582361 assert (Sub && " Missing sub-register" );
2359- SubToSuperRegs. emplace_back (Sub, Super );
2362+ SubRegs. push_back (Sub);
23602363 TopoSigs.set (Sub->getTopoSig ());
23612364 }
2362- sort (SubToSuperRegs, on_first<deref<std::less<>>>());
23632365
23642366 // Iterate over sub-register class candidates. Ignore classes created by
23652367 // this loop. They will never be useful.
@@ -2374,24 +2376,17 @@ void CodeGenRegBank::inferMatchingSuperRegClass(
23742376 // Topological shortcut: SubRC members have the wrong shape.
23752377 if (!TopoSigs.anyCommon (SubRC.getRegsWithSuperRegsTopoSigs ()))
23762378 continue ;
2377- // Compute the subset of RC that maps into SubRC with a single linear scan
2378- // through SubToSuperRegs and the members of SubRC.
2379+ // Compute the subset of RC that maps into SubRC.
23792380 CodeGenRegister::Vec SubSetVec;
2380- auto SubI = SubRC.getMembers ().begin (), SubE = SubRC.getMembers ().end ();
2381- for (auto &[Sub, Super] : SubToSuperRegs) {
2382- while (SubI != SubE && **SubI < *Sub)
2383- ++SubI;
2384- if (SubI == SubE)
2385- break ;
2386- if (**SubI == *Sub)
2381+ for (const auto &[Sub, Super] : zip_equal (SubRegs, RC->getMembers ())) {
2382+ if (SubRC.contains (Sub))
23872383 SubSetVec.push_back (Super);
23882384 }
23892385
23902386 if (SubSetVec.empty ())
23912387 continue ;
23922388
23932389 // RC injects completely into SubRC.
2394- sortAndUniqueRegisters (SubSetVec);
23952390 if (SubSetVec.size () == RC->getMembers ().size ()) {
23962391 SubRC.addSuperRegClass (SubIdx, RC);
23972392
0 commit comments