Index: test/TableGen/RegisterBankEmitter.td =================================================================== --- /dev/null +++ test/TableGen/RegisterBankEmitter.td @@ -0,0 +1,15 @@ +// RUN: llvm-tblgen -gen-register-bank -I %p/../../include %s | FileCheck %s + +include "llvm/Target/Target.td" + +def MyTarget : Target; +def R0 : Register<"r0">; +// CHECK: GPRRegBankCoverageData +// CHECK: 1u << (MyTarget::ClassARegClassID +// CHECK: 1u << (MyTarget::ClassBRegClassID +let Size = 32 in { + def ClassA : RegisterClass<"MyTarget", [i32], 32, (add R0)>; + def ClassB : RegisterClass<"MyTarget", [i1], 32, (add ClassA)>; +} +// CHECK: MyTarget::GPRRegBank +def GPRRegBank : RegisterBank<"GPR", [ClassA]>; Index: utils/TableGen/RegisterBankEmitter.cpp =================================================================== --- utils/TableGen/RegisterBankEmitter.cpp +++ utils/TableGen/RegisterBankEmitter.cpp @@ -167,8 +167,14 @@ /// to the class. static void visitRegisterBankClasses( CodeGenRegBank &RegisterClassHierarchy, const CodeGenRegisterClass *RC, - const Twine Kind, + const Twine Kind, BitVector &Visited, std::function VisitFn) { + if (Visited[RC->EnumValue]) { + DEBUG(dbgs() << "Not re-visiting " << RC->getName() << "\n"); + return; + } + Visited[RC->EnumValue] = true; + // Visit each explicitly named class. VisitFn(RC, Kind.str()); @@ -180,7 +186,7 @@ if (RC != &PossibleSubclass && RC->hasSubClass(&PossibleSubclass)) visitRegisterBankClasses(RegisterClassHierarchy, &PossibleSubclass, TmpKind + " " + RC->getName() + " subclass", - VisitFn); + Visited, VisitFn); // Visit each class that contains only subregisters of RC with a common // subregister-index. @@ -277,8 +283,9 @@ for (const CodeGenRegisterClass *RC : Bank.getExplictlySpecifiedRegisterClasses(RegisterClassHierarchy)) { + BitVector Visited(RegisterClassHierarchy.getRegClasses().size()); visitRegisterBankClasses( - RegisterClassHierarchy, RC, "explicit", + RegisterClassHierarchy, RC, "explicit", Visited, [&Bank](const CodeGenRegisterClass *RC, StringRef Kind) { DEBUG(dbgs() << "Added " << RC->getName() << "(" << Kind << ")\n"); Bank.addRegisterClass(RC);