@@ -1024,18 +1024,12 @@ CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
10241024 " Biggest class wasn't first" );
10251025
10261026 // Find all the subreg classes and order them by size too.
1027- std::vector<std::pair< CodeGenRegisterClass *, BitVector> > SuperRegClasses;
1027+ std::vector<CodeGenRegisterClass *> SuperRegClasses;
10281028 for (auto &RC : RegClasses) {
1029- BitVector SuperRegClassesBV (RegClasses.size ());
1030- RC .getSuperRegClasses (SubIdx, SuperRegClassesBV);
1031- if (SuperRegClassesBV.any ())
1032- SuperRegClasses.emplace_back (&RC , SuperRegClassesBV);
1029+ if (RC .hasAnySuperRegClasses (SubIdx))
1030+ SuperRegClasses.push_back (&RC );
10331031 }
1034- llvm::stable_sort (SuperRegClasses,
1035- [&](const std::pair<CodeGenRegisterClass *, BitVector> &A,
1036- const std::pair<CodeGenRegisterClass *, BitVector> &B) {
1037- return WeakSizeOrder (A.first , B.first );
1038- });
1032+ llvm::stable_sort (SuperRegClasses, WeakSizeOrder);
10391033
10401034 // Find the biggest subclass and subreg class such that R:subidx is in the
10411035 // subreg class for all R in subclass.
@@ -1049,8 +1043,8 @@ CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
10491043 CodeGenRegisterClass *ChosenSuperRegClass = nullptr ;
10501044 CodeGenRegisterClass *SubRegRC = nullptr ;
10511045 for (CodeGenRegisterClass *SuperRegRC : SuperRegRCs) {
1052- for (const auto &[ SuperRegClass, SuperRegClassBV] : SuperRegClasses) {
1053- if (SuperRegClassBV[SuperRegRC-> EnumValue ] ) {
1046+ for (CodeGenRegisterClass * SuperRegClass : SuperRegClasses) {
1047+ if (SuperRegClass-> hasSuperRegClass (SubIdx, SuperRegRC) ) {
10541048 SubRegRC = SuperRegClass;
10551049 ChosenSuperRegClass = SuperRegRC;
10561050
@@ -1077,6 +1071,18 @@ CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
10771071 return std::nullopt ;
10781072}
10791073
1074+ bool CodeGenRegisterClass::hasAnySuperRegClasses (
1075+ const CodeGenSubRegIndex *SubIdx) const {
1076+ return SuperRegClasses.contains (SubIdx);
1077+ }
1078+
1079+ bool CodeGenRegisterClass::hasSuperRegClass (
1080+ const CodeGenSubRegIndex *SubIdx, const CodeGenRegisterClass *RC ) const {
1081+ auto FindI = SuperRegClasses.find (SubIdx);
1082+
1083+ return FindI != SuperRegClasses.end () && FindI->second .contains (RC );
1084+ }
1085+
10801086void CodeGenRegisterClass::getSuperRegClasses (const CodeGenSubRegIndex *SubIdx,
10811087 BitVector &Out) const {
10821088 auto FindI = SuperRegClasses.find (SubIdx);
0 commit comments