Remove attribution from file headers, per discussion on llvmdev.
[oota-llvm.git] / lib / Transforms / Scalar / LoopUnswitch.cpp
index f57c0450083d31cb4f843b4aafefcad36ad19f90..8d39a4dece31e4374d8727bb897376e6ca3a0441 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -41,7 +41,6 @@
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/PostOrderIterator.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Debug.h"
@@ -70,12 +69,26 @@ namespace {
     SmallPtrSet<Value *,8> UnswitchedVals;
     
     bool OptimizeForSize;
+    bool redoLoop;
+
+    DominanceFrontier *DF;
+    DominatorTree *DT;
+    
+    /// LoopDF - Loop's dominance frontier. This set is a collection of 
+    /// loop exiting blocks' DF member blocks. However this does set does not
+    /// includes basic blocks that are inside loop.
+    SmallPtrSet<BasicBlock *, 8> LoopDF;
+
+    /// OrigLoopExitMap - This is used to map loop exiting block with 
+    /// corresponding loop exit block, before updating CFG.
+    DenseMap<BasicBlock *, BasicBlock *> OrigLoopExitMap;
   public:
     static char ID; // Pass ID, replacement for typeid
-    LoopUnswitch(bool Os = false) : 
-      LoopPass((intptr_t)&ID), OptimizeForSize(Os) {}
+    explicit LoopUnswitch(bool Os = false) : 
+      LoopPass((intptr_t)&ID), OptimizeForSize(Os), redoLoop(false) {}
 
     bool runOnLoop(Loop *L, LPPassManager &LPM);
+    bool processLoop(Loop *L);
 
     /// This transformation requires natural loop information & requires that
     /// loop preheaders be inserted into the CFG...
@@ -83,15 +96,16 @@ namespace {
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.addRequiredID(LoopSimplifyID);
       AU.addPreservedID(LoopSimplifyID);
-      AU.addPreserved<DominatorTree>();
-      AU.addPreserved<DominanceFrontier>();
       AU.addRequired<LoopInfo>();
       AU.addPreserved<LoopInfo>();
       AU.addRequiredID(LCSSAID);
       AU.addPreservedID(LCSSAID);
+      AU.addPreserved<DominatorTree>();
+      AU.addPreserved<DominanceFrontier>();
     }
 
   private:
+
     /// RemoveLoopFromWorklist - If the specified loop is on the loop worklist,
     /// remove it.
     void RemoveLoopFromWorklist(Loop *L) {
@@ -100,6 +114,16 @@ namespace {
       if (I != LoopProcessWorklist.end())
         LoopProcessWorklist.erase(I);
     }
+
+    /// Split all of the edges from inside the loop to their exit blocks.  Update
+    /// the appropriate Phi nodes as we do so.
+    void SplitExitEdges(Loop *L, const SmallVector<BasicBlock *, 8> &ExitBlocks,
+                        SmallVector<BasicBlock *, 8> &MiddleBlocks);
+
+    /// If BB's dominance frontier  has a member that is not part of loop L then 
+    /// remove it. Add NewDFMember in BB's dominance frontier.
+    void ReplaceLoopExternalDFMember(Loop *L, BasicBlock *BB,
+                                     BasicBlock *NewDFMember);
       
     bool UnswitchIfProfitable(Value *LoopCond, Constant *Val,Loop *L);
     unsigned getLoopUnswitchCost(Loop *L, Value *LIC);
@@ -115,9 +139,9 @@ namespace {
                                         BasicBlock *FalseDest,
                                         Instruction *InsertPt);
 
-    void SimplifyCode(std::vector<Instruction*> &Worklist);
+    void SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L);
     void RemoveBlockIfDead(BasicBlock *BB,
-                           std::vector<Instruction*> &Worklist);
+                           std::vector<Instruction*> &Worklist, Loop *l);
     void RemoveLoopFromHierarchy(Loop *L);
   };
   char LoopUnswitch::ID = 0;
@@ -150,16 +174,31 @@ static Value *FindLIVLoopCondition(Value *Cond, Loop *L, bool &Changed) {
       if (Value *RHS = FindLIVLoopCondition(BO->getOperand(1), L, Changed))
         return RHS;
     }
-      
-      return 0;
+  
+  return 0;
 }
 
 bool LoopUnswitch::runOnLoop(Loop *L, LPPassManager &LPM_Ref) {
-  assert(L->isLCSSAForm());
   LI = &getAnalysis<LoopInfo>();
   LPM = &LPM_Ref;
+  DF = getAnalysisToUpdate<DominanceFrontier>();
+  DT = getAnalysisToUpdate<DominatorTree>();
+
   bool Changed = false;
-  
+
+  do {
+    redoLoop = false;
+    Changed |= processLoop(L);
+  } while(redoLoop);
+
+  return Changed;
+}
+
+/// processLoop - Do actual work and unswitch loop if possible and profitable.
+bool LoopUnswitch::processLoop(Loop *L) {
+  assert(L->isLCSSAForm());
+  bool Changed = false;
+
   // Loop over all of the basic blocks in the loop.  If we find an interior
   // block that is branching on a loop-invariant condition, we can unswitch this
   // loop.
@@ -410,29 +449,68 @@ static inline void RemapInstruction(Instruction *I,
   }
 }
 
-// CloneDomInfo - NewBB is cloned from Orig basic block. Now clone Dominator Info.
-// If Orig is in Loop then find and use Orig dominator's cloned block as NewBB 
-// dominator.
-void CloneDomInfo(BasicBlock *NewBB, BasicBlock *Orig, Loop *L, 
+// CloneDomInfo - NewBB is cloned from Orig basic block. Now clone Dominator
+// Info.
+//
+// If Orig block's immediate dominator is mapped in VM then use corresponding
+// immediate dominator from the map. Otherwise Orig block's dominator is also
+// NewBB's dominator.
+//
+// OrigPreheader is loop pre-header before this pass started
+// updating CFG. NewPrehader is loops new pre-header. However, after CFG
+// manipulation, loop L may not exist. So rely on input parameter NewPreheader.
+void CloneDomInfo(BasicBlock *NewBB, BasicBlock *Orig, 
+                  BasicBlock *NewPreheader, BasicBlock *OrigPreheader, 
+                  BasicBlock *OrigHeader,
                   DominatorTree *DT, DominanceFrontier *DF,
                   DenseMap<const Value*, Value*> &VM) {
 
+  // If NewBB alreay has found its place in domiantor tree then no need to do
+  // anything.
+  if (DT->getNode(NewBB))
+    return;
+
+  // If Orig does not have any immediate domiantor then its clone, NewBB, does 
+  // not need any immediate dominator.
   DomTreeNode *OrigNode = DT->getNode(Orig);
   if (!OrigNode)
     return;
-  BasicBlock *OrigIDom = OrigNode->getBlock();
+  DomTreeNode *OrigIDomNode = OrigNode->getIDom();
+  if (!OrigIDomNode)
+    return;
+
+  BasicBlock *OrigIDom = NULL; 
+
+  // If Orig is original loop header then its immediate dominator is
+  // NewPreheader.
+  if (Orig == OrigHeader)
+    OrigIDom = NewPreheader;
+
+  // If Orig is new pre-header then its immediate dominator is
+  // original pre-header.
+  else if (Orig == NewPreheader)
+    OrigIDom = OrigPreheader;
+
+  // Other as DT to find Orig's immediate dominator.
+  else
+     OrigIDom = OrigIDomNode->getBlock();
+
+  // Initially use Orig's immediate dominator as NewBB's immediate dominator.
   BasicBlock *NewIDom = OrigIDom;
-  if (L->contains(OrigIDom)) {
-    if (!DT->getNode(OrigIDom))
-      CloneDomInfo(NewIDom, OrigIDom, L, DT, DF, VM);
-    NewIDom = cast<BasicBlock>(VM[OrigIDom]);
+  DenseMap<const Value*, Value*>::iterator I = VM.find(OrigIDom);
+  if (I != VM.end()) {
+    NewIDom = cast<BasicBlock>(I->second);
+    
+    // If NewIDom does not have corresponding dominatore tree node then
+    // get one.
+    if (!DT->getNode(NewIDom))
+      CloneDomInfo(NewIDom, OrigIDom, NewPreheader, OrigPreheader, 
+                   OrigHeader, DT, DF, VM);
   }
-  if (NewBB == NewIDom) {
-    DT->addNewBlock(NewBB, OrigIDom);
-    DT->changeImmediateDominator(NewBB, NewIDom);
-  } else
-    DT->addNewBlock(NewBB, NewIDom);
-
+  
+  DT->addNewBlock(NewBB, NewIDom);
+  
+  // Copy cloned dominance frontiner set
   DominanceFrontier::DomSetType NewDFSet;
   if (DF) {
     DominanceFrontier::iterator DFI = DF->find(Orig);
@@ -441,8 +519,9 @@ void CloneDomInfo(BasicBlock *NewBB, BasicBlock *Orig, Loop *L,
       for (DominanceFrontier::DomSetType::iterator I = S.begin(), E = S.end();
            I != E; ++I) {
         BasicBlock *BB = *I;
-        if (L->contains(BB)) 
-          NewDFSet.insert(cast<BasicBlock>(VM[Orig]));
+        DenseMap<const Value*, Value*>::iterator IDM = VM.find(BB);
+        if (IDM != VM.end())
+          NewDFSet.insert(cast<BasicBlock>(IDM->second));
         else
           NewDFSet.insert(BB);
       }
@@ -463,7 +542,7 @@ static Loop *CloneLoop(Loop *L, Loop *PL, DenseMap<const Value*, Value*> &VM,
   for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
        I != E; ++I)
     if (LI->getLoopFor(*I) == L)
-      New->addBasicBlockToLoop(cast<BasicBlock>(VM[*I]), *LI);
+      New->addBasicBlockToLoop(cast<BasicBlock>(VM[*I]), LI->getBase());
 
   // Add all of the subloops to the new loop.
   for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
@@ -489,17 +568,8 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,
     std::swap(TrueDest, FalseDest);
 
   // Insert the new branch.
-  BranchInst *BRI = new BranchInst(TrueDest, FalseDest, BranchVal, InsertPt);
-
-  // Update dominator info.
-  // BranchVal is a new preheader so it dominates true and false destination
-  // loop headers.
-  if (DominatorTree *DT = getAnalysisToUpdate<DominatorTree>()) {
-    DT->changeImmediateDominator(TrueDest, BRI->getParent());
-    DT->changeImmediateDominator(FalseDest, BRI->getParent());
-  }
-  // No need to update DominanceFrontier. BRI->getParent() dominated TrueDest
-  // and FalseDest anyway. Now it immediately dominates them.
+  new BranchInst(TrueDest, FalseDest, BranchVal, InsertPt);
+
 }
 
 
@@ -537,10 +607,11 @@ void LoopUnswitch::UnswitchTrivialCondition(Loop *L, Value *Cond,
   // insert the new conditional branch.
   EmitPreheaderBranchOnCondition(Cond, Val, NewExit, NewPH, 
                                  OrigPH->getTerminator());
+  LPM->deleteSimpleAnalysisValue(OrigPH->getTerminator(), L);
   OrigPH->getTerminator()->eraseFromParent();
 
   // We need to reprocess this loop, it could be unswitched again.
-  LPM->redoLoop(L);
+  redoLoop = true;
   
   // Now that we know that the loop is never entered when this condition is a
   // particular value, rewrite the loop with this info.  We know that this will
@@ -549,41 +620,43 @@ void LoopUnswitch::UnswitchTrivialCondition(Loop *L, Value *Cond,
   ++NumTrivial;
 }
 
-/// VersionLoop - We determined that the loop is profitable to unswitch when LIC
-/// equal Val.  Split it into loop versions and test the condition outside of
-/// either loop.  Return the loops created as Out1/Out2.
-void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val, 
-                                               Loop *L) {
-  Function *F = L->getHeader()->getParent();
-  DOUT << "loop-unswitch: Unswitching loop %"
-       << L->getHeader()->getName() << " [" << L->getBlocks().size()
-       << " blocks] in Function " << F->getName()
-       << " when '" << *Val << "' == " << *LIC << "\n";
-
-  // LoopBlocks contains all of the basic blocks of the loop, including the
-  // preheader of the loop, the body of the loop, and the exit blocks of the 
-  // loop, in that order.
-  std::vector<BasicBlock*> LoopBlocks;
+/// ReplaceLoopExternalDFMember -
+/// If BB's dominance frontier  has a member that is not part of loop L then 
+/// remove it. Add NewDFMember in BB's dominance frontier.
+void LoopUnswitch::ReplaceLoopExternalDFMember(Loop *L, BasicBlock *BB,
+                                               BasicBlock *NewDFMember) {
+  
+  DominanceFrontier::iterator DFI = DF->find(BB);
+  if (DFI == DF->end())
+    return;
+  
+  DominanceFrontier::DomSetType &DFSet = DFI->second;
+  for (DominanceFrontier::DomSetType::iterator DI = DFSet.begin(),
+         DE = DFSet.end(); DI != DE;) {
+    BasicBlock *B = *DI++;
+    if (L->contains(B))
+      continue;
 
-  // First step, split the preheader and exit blocks, and add these blocks to
-  // the LoopBlocks list.
-  BasicBlock *OrigPreheader = L->getLoopPreheader();
-  LoopBlocks.push_back(SplitEdge(OrigPreheader, L->getHeader(), this));
+    DF->removeFromFrontier(DFI, B);
+    LoopDF.insert(B);
+  }
 
-  // We want the loop to come after the preheader, but before the exit blocks.
-  LoopBlocks.insert(LoopBlocks.end(), L->block_begin(), L->block_end());
+  DF->addToFrontier(DFI, NewDFMember);
+}
 
-  std::vector<BasicBlock*> ExitBlocks;
-  L->getUniqueExitBlocks(ExitBlocks);
+/// SplitExitEdges -
+/// Split all of the edges from inside the loop to their exit blocks.  Update
+/// the appropriate Phi nodes as we do so.
+void LoopUnswitch::SplitExitEdges(Loop *L, const SmallVector<BasicBlock *, 8> &ExitBlocks,
+                                  SmallVector<BasicBlock *, 8> &MiddleBlocks) {
 
-  // Split all of the edges from inside the loop to their exit blocks.  Update
-  // the appropriate Phi nodes as we do so.
   for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
     BasicBlock *ExitBlock = ExitBlocks[i];
     std::vector<BasicBlock*> Preds(pred_begin(ExitBlock), pred_end(ExitBlock));
 
     for (unsigned j = 0, e = Preds.size(); j != e; ++j) {
       BasicBlock* MiddleBlock = SplitEdge(Preds[j], ExitBlock, this);
+      MiddleBlocks.push_back(MiddleBlock);
       BasicBlock* StartBlock = Preds[j];
       BasicBlock* EndBlock;
       if (MiddleBlock->getSinglePredecessor() == ExitBlock) {
@@ -593,6 +666,8 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
         EndBlock = ExitBlock;
       }
       
+      OrigLoopExitMap[StartBlock] = EndBlock;
+
       std::set<PHINode*> InsertedPHIs;
       PHINode* OldLCSSA = 0;
       for (BasicBlock::iterator I = EndBlock->begin();
@@ -618,9 +693,60 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
         OldLCSSA->replaceAllUsesWith(NewLCSSA);
         NewLCSSA->addIncoming(OldLCSSA, MiddleBlock);
       }
+
+      if (DF && DT) {
+        // StartBlock -- > MiddleBlock -- > EndBlock
+        // StartBlock is loop exiting block. EndBlock will become merge point 
+        // of two loop exits after loop unswitch.
+        
+        // If StartBlock's DF member includes a block that is not loop member 
+        // then replace that DF member with EndBlock.
+
+        // If MiddleBlock's DF member includes a block that is not loop member
+        // tnen replace that DF member with EndBlock.
+
+        ReplaceLoopExternalDFMember(L, StartBlock, EndBlock);
+        ReplaceLoopExternalDFMember(L, MiddleBlock, EndBlock);
+      }
     }    
   }
-  
+
+}
+
+/// UnswitchNontrivialCondition - We determined that the loop is profitable 
+/// to unswitch when LIC equal Val.  Split it into loop versions and test the 
+/// condition outside of either loop.  Return the loops created as Out1/Out2.
+void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val, 
+                                               Loop *L) {
+  Function *F = L->getHeader()->getParent();
+  DOUT << "loop-unswitch: Unswitching loop %"
+       << L->getHeader()->getName() << " [" << L->getBlocks().size()
+       << " blocks] in Function " << F->getName()
+       << " when '" << *Val << "' == " << *LIC << "\n";
+
+  // LoopBlocks contains all of the basic blocks of the loop, including the
+  // preheader of the loop, the body of the loop, and the exit blocks of the 
+  // loop, in that order.
+  std::vector<BasicBlock*> LoopBlocks;
+
+  // First step, split the preheader and exit blocks, and add these blocks to
+  // the LoopBlocks list.
+  BasicBlock *OrigHeader = L->getHeader();
+  BasicBlock *OrigPreheader = L->getLoopPreheader();
+  BasicBlock *NewPreheader = SplitEdge(OrigPreheader, L->getHeader(), this);
+  LoopBlocks.push_back(NewPreheader);
+
+  // We want the loop to come after the preheader, but before the exit blocks.
+  LoopBlocks.insert(LoopBlocks.end(), L->block_begin(), L->block_end());
+
+  SmallVector<BasicBlock*, 8> ExitBlocks;
+  L->getUniqueExitBlocks(ExitBlocks);
+
+  // Split all of the edges from inside the loop to their exit blocks.  Update
+  // the appropriate Phi nodes as we do so.
+  SmallVector<BasicBlock *,8> MiddleBlocks;
+  SplitExitEdges(L, ExitBlocks, MiddleBlocks);
+
   // The exit blocks may have been changed due to edge splitting, recompute.
   ExitBlocks.clear();
   L->getUniqueExitBlocks(ExitBlocks);
@@ -638,17 +764,24 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
     BasicBlock *New = CloneBasicBlock(LoopBlocks[i], ValueMap, ".us", F);
     NewBlocks.push_back(New);
     ValueMap[LoopBlocks[i]] = New;  // Keep the BB mapping.
+    LPM->cloneBasicBlockSimpleAnalysis(LoopBlocks[i], New, L);
   }
 
-  // Update dominator info
-  DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>();
-  if (DominatorTree *DT = getAnalysisToUpdate<DominatorTree>())
-    for (unsigned i = 0, e = LoopBlocks.size(); i != e; ++i) {
-      BasicBlock *LBB = LoopBlocks[i];
-      BasicBlock *NBB = NewBlocks[i];
-      CloneDomInfo(NBB, LBB, L, DT, DF, ValueMap);
+  // OutSiders are basic block that are dominated by original header and
+  // at the same time they are not part of loop.
+  SmallPtrSet<BasicBlock *, 8> OutSiders;
+  if (DT) {
+    DomTreeNode *OrigHeaderNode = DT->getNode(OrigHeader);
+    for(std::vector<DomTreeNode*>::iterator DI = OrigHeaderNode->begin(), 
+          DE = OrigHeaderNode->end();  DI != DE; ++DI) {
+      BasicBlock *B = (*DI)->getBlock();
+
+      DenseMap<const Value*, Value*>::iterator VI = ValueMap.find(B);
+      if (VI == ValueMap.end()) 
+        OutSiders.insert(B);
     }
-  
+  }
+
   // Splice the newly inserted blocks into the function right before the
   // original preheader.
   F->getBasicBlockList().splice(LoopBlocks[0], F->getBasicBlockList(),
@@ -660,14 +793,14 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
   if (ParentLoop) {
     // Make sure to add the cloned preheader and exit blocks to the parent loop
     // as well.
-    ParentLoop->addBasicBlockToLoop(NewBlocks[0], *LI);
+    ParentLoop->addBasicBlockToLoop(NewBlocks[0], LI->getBase());
   }
   
   for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) {
     BasicBlock *NewExit = cast<BasicBlock>(ValueMap[ExitBlocks[i]]);
     // The new exit block should be in the same loop as the old one.
     if (Loop *ExitBBLoop = LI->getLoopFor(ExitBlocks[i]))
-      ExitBBLoop->addBasicBlockToLoop(NewExit, *LI);
+      ExitBBLoop->addBasicBlockToLoop(NewExit, LI->getBase());
     
     assert(NewExit->getTerminator()->getNumSuccessors() == 1 &&
            "Exit block should have been split to have one successor!");
@@ -698,10 +831,97 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
 
   // Emit the new branch that selects between the two versions of this loop.
   EmitPreheaderBranchOnCondition(LIC, Val, NewBlocks[0], LoopBlocks[0], OldBR);
+  LPM->deleteSimpleAnalysisValue(OldBR, L);
   OldBR->eraseFromParent();
-  
+
+  // Update dominator info
+  if (DF && DT) {
+
+    SmallVector<BasicBlock *,4> ExitingBlocks;
+    L->getExitingBlocks(ExitingBlocks);
+
+    // Clone dominator info for all cloned basic block.
+    for (unsigned i = 0, e = LoopBlocks.size(); i != e; ++i) {
+      BasicBlock *LBB = LoopBlocks[i];
+      BasicBlock *NBB = NewBlocks[i];
+      CloneDomInfo(NBB, LBB, NewPreheader, OrigPreheader, 
+                   OrigHeader, DT, DF, ValueMap);
+
+      //   If LBB's dominance frontier includes DFMember 
+      //      such that DFMember is also a member of LoopDF then
+      //         - Remove DFMember from LBB's dominance frontier
+      //         - Copy loop exiting blocks', that are dominated by BB, dominance frontier
+      //           member in BB's dominance frontier
+
+      DominanceFrontier::iterator LBBI = DF->find(LBB);
+      DominanceFrontier::iterator NBBI = DF->find(NBB);
+      if (LBBI == DF->end())
+        continue;
+
+      DominanceFrontier::DomSetType &LBSet = LBBI->second;
+      for (DominanceFrontier::DomSetType::iterator LI = LBSet.begin(),
+             LE = LBSet.end(); LI != LE; /* NULL */) {
+        BasicBlock *B = *LI++;
+        if (B == LBB && B == L->getHeader())
+          continue;
+        bool removeB = false;
+        if (!LoopDF.count(B))
+          continue;
+        
+        // If LBB dominates loop exits then insert loop exit block's DF
+        // into B's DF.
+        for(SmallVector<BasicBlock *, 4>::iterator LExitI = ExitingBlocks.begin(),
+              LExitE = ExitingBlocks.end(); LExitI != LExitE; ++LExitI) {
+          BasicBlock *E = *LExitI;
+          
+          if (!DT->dominates(LBB,E))
+            continue;
+          
+          DenseMap<BasicBlock *, BasicBlock *>::iterator DFBI = 
+            OrigLoopExitMap.find(E);
+          if (DFBI == OrigLoopExitMap.end()) 
+            continue;
+          
+          BasicBlock *DFB = DFBI->second;
+          DF->addToFrontier(LBBI, DFB);
+          DF->addToFrontier(NBBI, DFB);
+          removeB = true;
+        }
+        
+        // If B's replacement is inserted in DF then now is the time to remove B.
+        if (removeB) {
+          DF->removeFromFrontier(LBBI, B);
+          if (L->contains(B))
+            DF->removeFromFrontier(NBBI, cast<BasicBlock>(ValueMap[B]));
+          else
+            DF->removeFromFrontier(NBBI, B);
+        }
+      }
+
+    }
+
+    // MiddleBlocks are dominated by original pre header. SplitEdge updated
+    // MiddleBlocks' dominance frontier appropriately.
+    for (unsigned i = 0, e = MiddleBlocks.size(); i != e; ++i) {
+      BasicBlock *MBB = MiddleBlocks[i];
+      if (!MBB->getSinglePredecessor())
+        DT->changeImmediateDominator(MBB, OrigPreheader);
+    }
+
+    // All Outsiders are now dominated by original pre header.
+    for (SmallPtrSet<BasicBlock *, 8>::iterator OI = OutSiders.begin(),
+           OE = OutSiders.end(); OI != OE; ++OI) {
+      BasicBlock *OB = *OI;
+      DT->changeImmediateDominator(OB, OrigPreheader);
+    }
+
+    // New loop headers are dominated by original preheader
+    DT->changeImmediateDominator(NewBlocks[0], OrigPreheader);
+    DT->changeImmediateDominator(LoopBlocks[0], OrigPreheader);
+  }
+
   LoopProcessWorklist.push_back(NewLoop);
-  LPM->redoLoop(L);
+  redoLoop = true;
 
   // Now we rewrite the original code to know that the condition is true and the
   // new code to know that the condition is false.
@@ -729,7 +949,8 @@ static void RemoveFromWorklist(Instruction *I,
 /// ReplaceUsesOfWith - When we find that I really equals V, remove I from the
 /// program, replacing all uses with V and update the worklist.
 static void ReplaceUsesOfWith(Instruction *I, Value *V, 
-                              std::vector<Instruction*> &Worklist) {
+                              std::vector<Instruction*> &Worklist,
+                              Loop *L, LPPassManager *LPM) {
   DOUT << "Replace with '" << *V << "': " << *I;
 
   // Add uses to the worklist, which may be dead now.
@@ -741,9 +962,10 @@ static void ReplaceUsesOfWith(Instruction *I, Value *V,
   for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
        UI != E; ++UI)
     Worklist.push_back(cast<Instruction>(*UI));
+  LPM->deleteSimpleAnalysisValue(I, L);
+  RemoveFromWorklist(I, Worklist);
   I->replaceAllUsesWith(V);
   I->eraseFromParent();
-  RemoveFromWorklist(I, Worklist);
   ++NumSimplify;
 }
 
@@ -751,7 +973,8 @@ static void ReplaceUsesOfWith(Instruction *I, Value *V,
 /// information, and remove any dead successors it has.
 ///
 void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
-                                     std::vector<Instruction*> &Worklist) {
+                                     std::vector<Instruction*> &Worklist,
+                                     Loop *L) {
   if (pred_begin(BB) != pred_end(BB)) {
     // This block isn't dead, since an edge to BB was just removed, see if there
     // are any easy simplifications we can do now.
@@ -760,7 +983,7 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
       while (isa<PHINode>(BB->begin()))
         ReplaceUsesOfWith(BB->begin(), 
                           cast<PHINode>(BB->begin())->getIncomingValue(0), 
-                          Worklist);
+                          Worklist, L, LPM);
       
       // If this is the header of a loop and the only pred is the latch, we now
       // have an unreachable loop.
@@ -769,6 +992,7 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
           // Remove the branch from the latch to the header block, this makes
           // the header dead, which will make the latch dead (because the header
           // dominates the latch).
+          LPM->deleteSimpleAnalysisValue(Pred->getTerminator(), L);
           Pred->getTerminator()->eraseFromParent();
           new UnreachableInst(Pred);
           
@@ -776,7 +1000,7 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
           RemoveLoopFromHierarchy(L);
           
           // Reprocess the header, which now IS dead.
-          RemoveBlockIfDead(BB, Worklist);
+          RemoveBlockIfDead(BB, Worklist, L);
           return;
         }
       
@@ -826,8 +1050,8 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
   Succs.erase(std::unique(Succs.begin(), Succs.end()), Succs.end());
   
   // Remove the basic block, including all of the instructions contained in it.
+  LPM->deleteSimpleAnalysisValue(BB, L);  
   BB->eraseFromParent();
-  
   // Remove successor blocks here that are not dead, so that we know we only
   // have dead blocks in this list.  Nondead blocks have a way of becoming dead,
   // then getting removed before we revisit them, which is badness.
@@ -846,7 +1070,7 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
     }
   
   for (unsigned i = 0, e = Succs.size(); i != e; ++i)
-    RemoveBlockIfDead(Succs[i], Worklist);
+    RemoveBlockIfDead(Succs[i], Worklist, L);
 }
 
 /// RemoveLoopFromHierarchy - We have discovered that the specified loop has
@@ -929,10 +1153,10 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
               Instruction* OldTerm = Old->getTerminator();
               new BranchInst(Split, SI->getSuccessor(i),
                              ConstantInt::getTrue(), OldTerm);
-              
+
+              LPM->deleteSimpleAnalysisValue(Old->getTerminator(), L);                
               Old->getTerminator()->eraseFromParent();
               
-              
               PHINode *PN;
               for (BasicBlock::iterator II = SI->getSuccessor(i)->begin();
                    (PN = dyn_cast<PHINode>(II)); ++II) {
@@ -951,7 +1175,7 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
       }
   }
   
-  SimplifyCode(Worklist);
+  SimplifyCode(Worklist, L);
 }
 
 /// SimplifyCode - Okay, now that we have simplified some instructions in the 
@@ -963,14 +1187,14 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
 /// FIXME: When the loop optimizer is more mature, separate this out to a new
 /// pass.
 ///
-void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
+void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {
   while (!Worklist.empty()) {
     Instruction *I = Worklist.back();
     Worklist.pop_back();
     
     // Simple constant folding.
     if (Constant *C = ConstantFoldInstruction(I)) {
-      ReplaceUsesOfWith(I, C, Worklist);
+      ReplaceUsesOfWith(I, C, Worklist, L, LPM);
       continue;
     }
     
@@ -982,8 +1206,9 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
       for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
         if (Instruction *Use = dyn_cast<Instruction>(I->getOperand(i)))
           Worklist.push_back(Use);
-      I->eraseFromParent();
+      LPM->deleteSimpleAnalysisValue(I, L);
       RemoveFromWorklist(I, Worklist);
+      I->eraseFromParent();
       ++NumSimplify;
       continue;
     }
@@ -992,7 +1217,8 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
     switch (I->getOpcode()) {
     case Instruction::Select:
       if (ConstantInt *CB = dyn_cast<ConstantInt>(I->getOperand(0))) {
-        ReplaceUsesOfWith(I, I->getOperand(!CB->getZExtValue()+1), Worklist);
+        ReplaceUsesOfWith(I, I->getOperand(!CB->getZExtValue()+1), Worklist, L,
+                          LPM);
         continue;
       }
       break;
@@ -1003,9 +1229,9 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
       if (ConstantInt *CB = dyn_cast<ConstantInt>(I->getOperand(1))) 
         if (CB->getType() == Type::Int1Ty) {
           if (CB->isOne())      // X & 1 -> X
-            ReplaceUsesOfWith(I, I->getOperand(0), Worklist);
+            ReplaceUsesOfWith(I, I->getOperand(0), Worklist, L, LPM);
           else                  // X & 0 -> 0
-            ReplaceUsesOfWith(I, I->getOperand(1), Worklist);
+            ReplaceUsesOfWith(I, I->getOperand(1), Worklist, L, LPM);
           continue;
         }
       break;
@@ -1016,9 +1242,9 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
       if (ConstantInt *CB = dyn_cast<ConstantInt>(I->getOperand(1)))
         if (CB->getType() == Type::Int1Ty) {
           if (CB->isOne())   // X | 1 -> 1
-            ReplaceUsesOfWith(I, I->getOperand(1), Worklist);
+            ReplaceUsesOfWith(I, I->getOperand(1), Worklist, L, LPM);
           else                  // X | 0 -> X
-            ReplaceUsesOfWith(I, I->getOperand(0), Worklist);
+            ReplaceUsesOfWith(I, I->getOperand(0), Worklist, L, LPM);
           continue;
         }
       break;
@@ -1038,11 +1264,12 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
         
         // Resolve any single entry PHI nodes in Succ.
         while (PHINode *PN = dyn_cast<PHINode>(Succ->begin()))
-          ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist);
+          ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist, L, LPM);
         
         // Move all of the successor contents from Succ to Pred.
         Pred->getInstList().splice(BI, Succ->getInstList(), Succ->begin(),
                                    Succ->end());
+        LPM->deleteSimpleAnalysisValue(BI, L);
         BI->eraseFromParent();
         RemoveFromWorklist(BI, Worklist);
         
@@ -1052,6 +1279,7 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
         
         // Remove Succ from the loop tree.
         LI->removeBlock(Succ);
+        LPM->deleteSimpleAnalysisValue(Succ, L);
         Succ->eraseFromParent();
         ++NumSimplify;
       } else if (ConstantInt *CB = dyn_cast<ConstantInt>(BI->getCondition())){
@@ -1064,11 +1292,12 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist) {
         BasicBlock *LiveSucc = BI->getSuccessor(!CB->getZExtValue());
         DeadSucc->removePredecessor(BI->getParent(), true);
         Worklist.push_back(new BranchInst(LiveSucc, BI));
+        LPM->deleteSimpleAnalysisValue(BI, L);
         BI->eraseFromParent();
         RemoveFromWorklist(BI, Worklist);
         ++NumSimplify;
 
-        RemoveBlockIfDead(DeadSucc, Worklist);
+        RemoveBlockIfDead(DeadSucc, Worklist, L);
       }
       break;
     }