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 | f98db5e62a507f08019afc47bb1d2b733e32805d (patch) | |
| tree | b11a5ea5daf7b93169e3cb31763a30b5b8232f34 /llvm | |
| parent | 77621351ddab3fdec34518aab21bf34bb2c1ce74 (diff) | |
| download | bcm5719-llvm-f98db5e62a507f08019afc47bb1d2b733e32805d.tar.gz bcm5719-llvm-f98db5e62a507f08019afc47bb1d2b733e32805d.zip | |
Preserve LCSSA.
llvm-svn: 41246
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp b/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp index f748892826f..3d8429744a4 100644 --- a/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp +++ b/llvm/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; } |

