Add missing newlines at EOF (for clang++).
[oota-llvm.git] / lib / Transforms / Utils / CloneLoop.cpp
index 02278b6d2823cf2eb79fb8a891670dd094592f2c..7e000a1a75fe660b8170238bcfabbf64b6dce7d8 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Devang Patel 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.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -79,27 +79,25 @@ Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager  *LPM, LoopInfo *LI,
   DominatorTree *DT = NULL;
   DominanceFrontier *DF = NULL;
   if (P) {
-    DT = P->getAnalysisToUpdate<DominatorTree>();
-    DF = P->getAnalysisToUpdate<DominanceFrontier>();
+    DT = P->getAnalysisIfAvailable<DominatorTree>();
+    DF = P->getAnalysisIfAvailable<DominanceFrontier>();
   }
 
   SmallVector<BasicBlock *, 16> NewBlocks;
-  SmallVector<std::pair<Loop *, Loop::iterator>, 8> LoopNest;
-  LoopNest.push_back(std::make_pair(OrigL, OrigL->begin()));
-  
-  Loop *NewLoop = NULL;
+
+  // Populate loop nest.
+  SmallVector<Loop *, 8> LoopNest;
+  LoopNest.push_back(OrigL);
+
+
+  Loop *NewParentLoop = NULL;
   while (!LoopNest.empty()) {
-    Loop *L = LoopNest.back().first;
-    Loop::iterator SubLoop = LoopNest.back().second;
-    
-    // Handle sub loops.
-    if (SubLoop != L->end()) {
-      Loop *SL  = *SubLoop;
-      LoopNest.push_back(std::make_pair(SL, SL->begin()));
-    } 
-
-    LoopNest.pop_back();
-    NewLoop = new Loop();
+    Loop *L = LoopNest.pop_back_val();
+    Loop *NewLoop = new Loop();
+
+    if (!NewParentLoop)
+      NewParentLoop = NewLoop;
+
     LPM->insertLoop(NewLoop, L->getParentLoop());
 
     // Clone Basic Blocks.
@@ -110,7 +108,7 @@ Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager  *LPM, LoopInfo *LI,
       ValueMap[BB] = NewBB;
       if (P)
         LPM->cloneBasicBlockSimpleAnalysis(BB, NewBB, L);
-      NewLoop->addBasicBlockToLoop(NewBB, *LI);
+      NewLoop->addBasicBlockToLoop(NewBB, LI->getBase());
       NewBlocks.push_back(NewBB);
     }
 
@@ -122,6 +120,9 @@ Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager  *LPM, LoopInfo *LI,
         CloneDominatorInfo(BB, ValueMap, DT, DF);
       }
 
+    // Process sub loops
+    for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
+      LoopNest.push_back(*I);
   }
 
   // Remap instructions to reference operands from ValueMap.
@@ -143,7 +144,9 @@ Loop *llvm::CloneLoop(Loop *OrigL, LPPassManager  *LPM, LoopInfo *LI,
 
   BasicBlock *Latch = OrigL->getLoopLatch();
   Function *F = Latch->getParent();
-  F->getBasicBlockList().insert(Latch, NewBlocks.begin(), NewBlocks.end());
+  F->getBasicBlockList().insert(OrigL->getHeader(), 
+                                NewBlocks.begin(), NewBlocks.end());
+
 
-  return NewLoop;
+  return NewParentLoop;
 }