From f98db5e62a507f08019afc47bb1d2b733e32805d Mon Sep 17 00:00:00 2001 From: Devang Patel <dpatel@apple.com> Date: Tue, 21 Aug 2007 19:47:46 +0000 Subject: [PATCH] Preserve LCSSA. llvm-svn: 41246 --- llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp b/llvm/lib/Transforms/Scalar/LoopIndexSplit.cpp index f748892826fd..3d8429744a45 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; }