diff options
author | Devang Patel <dpatel@apple.com> | 2007-08-21 19:47:46 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-08-21 19:47:46 +0000 |
commit | 60cbab425263c3dd30f757cd75be4d42c83af15f (patch) | |
tree | 12b1c2bf377a5aa8966a08f5c79387dccabfd5fa /lib/Transforms/Scalar/LoopIndexSplit.cpp | |
parent | e79bad66e0b265cdac2dc90e5e6727a5fa2cbcae (diff) |
Preserve LCSSA.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41246 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopIndexSplit.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopIndexSplit.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/LoopIndexSplit.cpp b/lib/Transforms/Scalar/LoopIndexSplit.cpp index f748892826..3d8429744a 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; } |