Index: utils/TableGen/RegisterBankEmitter.cpp =================================================================== --- utils/TableGen/RegisterBankEmitter.cpp +++ utils/TableGen/RegisterBankEmitter.cpp @@ -180,30 +180,43 @@ VisitFn(RC, Kind.str()); for (const auto &PossibleSubclass : RegisterClassHierarchy.getRegClasses()) { + if (RC == &PossibleSubclass) + continue; + std::string TmpKind = - (Twine(Kind) + " (" + PossibleSubclass.getName() + ")").str(); + (Twine(Kind) + " (then, while considering possible-subclass=" + + PossibleSubclass.getName()) + .str(); // Visit each subclass of an explicitly named class. - if (RC != &PossibleSubclass && RC->hasSubClass(&PossibleSubclass)) + if (RC->hasSubClass(&PossibleSubclass)) visitRegisterBankClasses(RegisterClassHierarchy, &PossibleSubclass, - TmpKind + " " + RC->getName() + " subclass", + TmpKind + ") and " + RC->getName() + + " is a subclass", VisitFn, VisitedRCs); - // Visit each class that contains only subregisters of RC with a common - // subregister-index. - // - // More precisely, PossibleSubclass is a subreg-class iff Reg:SubIdx is in - // PossibleSubclass for all registers Reg from RC using any - // subregister-index SubReg - for (const auto &SubIdx : RegisterClassHierarchy.getSubRegIndices()) { - BitVector BV(RegisterClassHierarchy.getRegClasses().size()); - PossibleSubclass.getSuperRegClasses(&SubIdx, BV); - if (BV.test(RC->EnumValue)) { - std::string TmpKind2 = (Twine(TmpKind) + " " + RC->getName() + - " class-with-subregs: " + RC->getName()) - .str(); - VisitFn(&PossibleSubclass, TmpKind2); - } + // Visit each class that contains only subregisters of RC. The + // subregister-index can vary between them such. + SmallPtrSet SubRegs = { + PossibleSubclass.getMembers().begin(), + PossibleSubclass.getMembers().end()}; + for (const auto &SuperReg : RC->getMembers()) { + SubRegs.erase(SuperReg); + for (const auto &SubRegAndIdxOfSuperReg : SuperReg->getSubRegs()) + SubRegs.erase(SubRegAndIdxOfSuperReg.second); + } + + if (SubRegs.empty()) { + std::string TmpKind2 = (Twine(TmpKind) + " " + + " every register is covered by " + RC->getName()) + .str(); + VisitFn(&PossibleSubclass, TmpKind2); + } else { + DEBUG(dbgs() << "Rejected " << PossibleSubclass.getName() + << ", these registers are not covered by " << RC->getName() + << ":\n"); + for (const auto &Reg : SubRegs) + DEBUG(dbgs() << " " << Reg->getName() << "\n"); } } } @@ -286,11 +299,13 @@ for (const CodeGenRegisterClass *RC : Bank.getExplictlySpecifiedRegisterClasses(RegisterClassHierarchy)) { visitRegisterBankClasses( - RegisterClassHierarchy, RC, "explicit", + RegisterClassHierarchy, RC, + "because " + RC->getName() + " was explicitly-added", [&Bank](const CodeGenRegisterClass *RC, StringRef Kind) { - DEBUG(dbgs() << "Added " << RC->getName() << "(" << Kind << ")\n"); + DEBUG(dbgs() << "Added " << RC->getName() << " (" << Kind << ")\n"); Bank.addRegisterClass(RC); - }, VisitedRCs); + }, + VisitedRCs); } Banks.push_back(Bank);