summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2013-01-10 14:02:37 +0100
committerTom Stellard <thomas.stellard@amd.com>2013-01-17 18:45:45 +0000
commit920c1831ae0787193f5f6dcca17deb9281d10117 (patch)
treed8e2c139a3f56c32f92138a744b9c092bd1895c2
parent2b0f21ec8a7ea3dc5cfee44cf2e1a956de8f4a00 (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.cpp12
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