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;
 }