aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-08-21 19:47:46 +0000
committerDevang Patel <dpatel@apple.com>2007-08-21 19:47:46 +0000
commit7ef89b89540884309443878ad72d9f825593a36c (patch)
tree12b1c2bf377a5aa8966a08f5c79387dccabfd5fa /lib/Transforms
parent33a5e124e20c136da2e23014dcf1edc9324a565c (diff)
downloadexternal_llvm-7ef89b89540884309443878ad72d9f825593a36c.zip
external_llvm-7ef89b89540884309443878ad72d9f825593a36c.tar.gz
external_llvm-7ef89b89540884309443878ad72d9f825593a36c.tar.bz2
Preserve LCSSA.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41246 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/LoopIndexSplit.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/LoopIndexSplit.cpp b/lib/Transforms/Scalar/LoopIndexSplit.cpp
index f748892..3d84297 100644
--- a/lib/Transforms/Scalar/LoopIndexSplit.cpp
+++ b/lib/Transforms/Scalar/LoopIndexSplit.cpp
@@ -835,7 +835,7 @@ bool LoopIndexSplit::splitLoop(SplitInfo &SD) {
assert (!L->contains(ExitDest) && " Unable to find exit edge destination");
//[*] Split Exit Edge.
- SplitEdge(ExitingBlock, FalseHeader, this);
+ BasicBlock *TL_ExitBlock = SplitEdge(ExitingBlock, FalseHeader, this);
//[*] Eliminate split condition's false branch from True loop.
BranchInst *BR = cast<BranchInst>(SplitBlock->getTerminator());
@@ -853,6 +853,20 @@ bool LoopIndexSplit::splitLoop(SplitInfo &SD) {
FBR->setUnconditionalDest(FBR->getSuccessor(1));
removeBlocks(TBB, FalseLoop, cast<BasicBlock>(FBR->getSuccessor(0)));
+ //[*] Preserve LCSSA
+ for(BasicBlock::iterator BI = FalseHeader->begin(), BE = FalseHeader->end();
+ BI != BE; ++BI) {
+ if (PHINode *PN = dyn_cast<PHINode>(BI)) {
+ Value *V1 = PN->getIncomingValueForBlock(TL_ExitBlock);
+ PHINode *newPHI = new PHINode(PN->getType(), PN->getName());
+ newPHI->addIncoming(V1, ExitingBlock);
+ TL_ExitBlock->getInstList().push_front(newPHI);
+ PN->removeIncomingValue(TL_ExitBlock);
+ PN->addIncoming(newPHI, TL_ExitBlock);
+ } else
+ break;
+ }
+
return true;
}