diff options
author | Christian König <deathsimple@vodafone.de> | 2013-01-10 14:02:37 +0100 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2013-01-17 18:45:45 +0000 |
commit | 920c1831ae0787193f5f6dcca17deb9281d10117 (patch) | |
tree | d8e2c139a3f56c32f92138a744b9c092bd1895c2 | |
parent | 2b0f21ec8a7ea3dc5cfee44cf2e1a956de8f4a00 (diff) |
R600: handle loops to self in the structurizer
Signed-off-by: Christian König <deathsimple@vodafone.de>
-rw-r--r-- | lib/Target/R600/AMDGPUStructurizeCFG.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/Target/R600/AMDGPUStructurizeCFG.cpp b/lib/Target/R600/AMDGPUStructurizeCFG.cpp index 22338b5bf78..f973dd7fc8b 100644 --- a/lib/Target/R600/AMDGPUStructurizeCFG.cpp +++ b/lib/Target/R600/AMDGPUStructurizeCFG.cpp @@ -252,6 +252,11 @@ void AMDGPUStructurizeCFG::analyzeBlock(BasicBlock *BB) { BBPredicates &Pred = Predicates[BB]; for (; PI != PE; ++PI) { + + // Ignore self loops + if (*PI == BB) + continue; + BranchInst *Term = cast<BranchInst>((*PI)->getTerminator()); for (unsigned i = 0, e = Term->getNumSuccessors(); i != e; ++i) { @@ -296,7 +301,9 @@ void AMDGPUStructurizeCFG::collectInfos() { LoopPred.clear(); RNVector::reverse_iterator OI = Order.rbegin(), OE = Order.rend(); - for (Visited.clear(); OI != OE; Visited[(*OI++)->getEntry()] = ++Number) { + for (Visited.clear(); OI != OE; ++OI) { + + Visited[(*OI)->getEntry()] = ++Number; // Analyze all the conditions leading to a node analyzeBlock((*OI)->getEntry()); @@ -567,7 +574,8 @@ void AMDGPUStructurizeCFG::createFlow() { ParentRegion->getRegionInfo()->setRegionFor(Split, ParentRegion); Predicates[Split] = Predicates[Prev]; Order.push_back(ParentRegion->getBBNode(Split)); - LoopPred[Prev] = BoolTrue; + if (LoopEnd == Prev) + LoopEnd = Split; } else if (LoopStart == Order.back()->getEntry()) { // Loop starts behind entry, split entry so that we can jump to it |