Skip to content

Commit

Permalink
TableGen: Fix infinite recursion in RegisterBankEmitter
Browse files Browse the repository at this point in the history
Summary:
AMDGPU has two register classes with the same set of registers, and this
was causing this tablegen backend would get stuck in infinite recursion.

Reviewers: dsanders

Reviewed By: dsanders

Subscribers: tpr, wdng, llvm-commits

Differential Revision: https://reviews.llvm.org/D29049

llvm-svn: 293483
  • Loading branch information
tstellarAMD committed Jan 30, 2017
1 parent 7356498 commit 5b56f2d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
15 changes: 15 additions & 0 deletions llvm/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">;
let Size = 32 in {
def ClassA : RegisterClass<"MyTarget", [i32], 32, (add R0)>;
def ClassB : RegisterClass<"MyTarget", [i1], 32, (add ClassA)>;
}

// CHECK: GPRRegBankCoverageData
// CHECK: MyTarget::ClassARegClassID
// CHECK: MyTarget::ClassBRegClassID
def GPRRegBank : RegisterBank<"GPR", [ClassA]>;
14 changes: 11 additions & 3 deletions llvm/utils/TableGen/RegisterBankEmitter.cpp
Expand Up @@ -168,7 +168,14 @@ void RegisterBankEmitter::emitBaseClassDefinition(
static void visitRegisterBankClasses(
CodeGenRegBank &RegisterClassHierarchy, const CodeGenRegisterClass *RC,
const Twine Kind,
std::function<void(const CodeGenRegisterClass *, StringRef)> VisitFn) {
std::function<void(const CodeGenRegisterClass *, StringRef)> VisitFn,
SmallPtrSetImpl<const CodeGenRegisterClass *> &VisitedRCs) {

// Make sure we only visit each class once to avoid infinite loops.
if (VisitedRCs.count(RC))
return;
VisitedRCs.insert(RC);

// Visit each explicitly named class.
VisitFn(RC, Kind.str());

Expand All @@ -180,7 +187,7 @@ static void visitRegisterBankClasses(
if (RC != &PossibleSubclass && RC->hasSubClass(&PossibleSubclass))
visitRegisterBankClasses(RegisterClassHierarchy, &PossibleSubclass,
TmpKind + " " + RC->getName() + " subclass",
VisitFn);
VisitFn, VisitedRCs);

// Visit each class that contains only subregisters of RC with a common
// subregister-index.
Expand Down Expand Up @@ -273,6 +280,7 @@ void RegisterBankEmitter::run(raw_ostream &OS) {

std::vector<RegisterBank> Banks;
for (const auto &V : Records.getAllDerivedDefinitions("RegisterBank")) {
SmallPtrSet<const CodeGenRegisterClass *, 8> VisitedRCs;
RegisterBank Bank(*V);

for (const CodeGenRegisterClass *RC :
Expand All @@ -282,7 +290,7 @@ void RegisterBankEmitter::run(raw_ostream &OS) {
[&Bank](const CodeGenRegisterClass *RC, StringRef Kind) {
DEBUG(dbgs() << "Added " << RC->getName() << "(" << Kind << ")\n");
Bank.addRegisterClass(RC);
});
}, VisitedRCs);
}

Banks.push_back(Bank);
Expand Down

0 comments on commit 5b56f2d

Please sign in to comment.