aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/LoopIndexSplit.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-08-15 02:14:55 +0000
committerDevang Patel <dpatel@apple.com>2007-08-15 02:14:55 +0000
commit3fe4f2135a951477b9e2a32401bfea09beed3d71 (patch)
tree5b40154cceb528ca4358cb7603d56ac9a98aeacb /lib/Transforms/Scalar/LoopIndexSplit.cpp
parent4f5d78e9c1d3baba122affbf68e9ee45ca9e0477 (diff)
Avoid triangle loops.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41093 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopIndexSplit.cpp')
-rw-r--r--lib/Transforms/Scalar/LoopIndexSplit.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/LoopIndexSplit.cpp b/lib/Transforms/Scalar/LoopIndexSplit.cpp
index dfe33ffe16..6e04e9f480 100644
--- a/lib/Transforms/Scalar/LoopIndexSplit.cpp
+++ b/lib/Transforms/Scalar/LoopIndexSplit.cpp
@@ -154,7 +154,7 @@ bool LoopIndexSplit::runOnLoop(Loop *IncomingLoop, LPPassManager &LPM_Ref) {
L = IncomingLoop;
LPM = &LPM_Ref;
- // FIXME - Nested loops makes dominator info updates tricky.
+ // FIXME - Nested loops make dominator info updates tricky.
if (!L->getSubLoops().empty())
return false;
@@ -605,7 +605,7 @@ void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP,
WorkList.push_back(std::make_pair(DeadBB, succ_begin(DeadBB)));
while (!WorkList.empty()) {
BasicBlock *BB = WorkList.back(). first;
- succ_iterator SIter =WorkList.back().second;
+ succ_iterator SIter = WorkList.back().second;
// If all successor's are processed then remove this block.
if (SIter == succ_end(BB)) {
@@ -659,8 +659,8 @@ void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP,
if (!DT->dominates(LiveBB, DFMember))
LiveDF->second.insert(DFMember);
}
- DF->removeFromFrontier(LiveDF, SuccBB);
+ DF->removeFromFrontier(LiveDF, SuccBB);
}
}
}
@@ -669,6 +669,19 @@ void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP,
bool LoopIndexSplit::splitLoop(SplitInfo &SD) {
BasicBlock *Preheader = L->getLoopPreheader();
+ BasicBlock *SplitBlock = SD.SplitCondition->getParent();
+ BasicBlock *Latch = L->getLoopLatch();
+ BasicBlock *Header = L->getHeader();
+ BranchInst *SplitTerminator = cast<BranchInst>(SplitBlock->getTerminator());
+
+ // FIXME - Unable to handle triange loops at the moment.
+ // In triangle loop, split condition is in header and one of the
+ // the split destination is loop latch. If split condition is EQ
+ // then such loops are already handle in processOneIterationLoop().
+ if (Header == SplitBlock
+ && (Latch == SplitTerminator->getSuccessor(0)
+ || Latch == SplitTerminator->getSuccessor(1)))
+ return false;
// True loop is original loop. False loop is cloned loop.
@@ -770,7 +783,6 @@ bool LoopIndexSplit::splitLoop(SplitInfo &SD) {
SplitEdge(ExitBlock, FalseHeader, this);
//[*] Eliminate split condition's false branch from True loop.
- BasicBlock *SplitBlock = SD.SplitCondition->getParent();
BranchInst *BR = cast<BranchInst>(SplitBlock->getTerminator());
BasicBlock *FBB = BR->getSuccessor(1);
BR->setUnconditionalDest(BR->getSuccessor(0));