[llvm-commits] [llvm] r41093 - /llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
Devang Patel
dpatel at apple.com
Tue Aug 14 19:14:56 PDT 2007
Author: dpatel
Date: Tue Aug 14 21:14:55 2007
New Revision: 41093
URL: http://llvm.org/viewvc/llvm-project?rev=41093&view=rev
Log:
Avoid triangle loops.
Modified:
llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41093&r1=41092&r2=41093&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Tue Aug 14 21:14:55 2007
@@ -154,7 +154,7 @@
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 @@
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 @@
if (!DT->dominates(LiveBB, DFMember))
LiveDF->second.insert(DFMember);
}
- DF->removeFromFrontier(LiveDF, SuccBB);
+ DF->removeFromFrontier(LiveDF, SuccBB);
}
}
}
@@ -669,6 +669,19 @@
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 @@
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));
More information about the llvm-commits
mailing list