Fix a bug: this does not preserve the CFG!
authorChris Lattner <sabre@nondot.org>
Sun, 18 Apr 2004 05:38:37 +0000 (05:38 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 18 Apr 2004 05:38:37 +0000 (05:38 +0000)
While we're at it, add support for updating loop information correctly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13033 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnroll.cpp

index d337a431321b8141ca958143db8c123ff1284b9b..8b296cb7685c186ca749adf8b0c7ba2ba65ceda2 100644 (file)
@@ -47,9 +47,9 @@ namespace {
     /// loop preheaders be inserted into the CFG...
     ///
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-      AU.setPreservesCFG();
       AU.addRequiredID(LoopSimplifyID);
       AU.addRequired<LoopInfo>();
+      AU.addPreserved<LoopInfo>();
     }
   };
   RegisterOpt<LoopUnroll> X("loop-unroll", "Unroll loops");
@@ -61,8 +61,11 @@ bool LoopUnroll::runOnFunction(Function &F) {
   bool Changed = false;
   LI = &getAnalysis<LoopInfo>();
 
-  for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
-    Changed |= visitLoop(*I);
+  // Transform all the top-level loops.  Copy the loop list so that the child
+  // can update the loop tree if it needs to delete the loop.
+  std::vector<Loop*> SubLoops(LI->begin(), LI->end());
+  for (unsigned i = 0, e = SubLoops.size(); i != e; ++i)
+    Changed |= visitLoop(SubLoops[i]);
 
   return Changed;
 }
@@ -238,7 +241,20 @@ bool LoopUnroll::visitLoop(Loop *L) {
     }
   }
 
-  // FIXME: Should update analyses
+  // Update the loop information for this loop.
+  Loop *Parent = L->getParentLoop();
+
+  // Move all of the basic blocks in the loop into the parent loop.
+  LI->changeLoopFor(BB, Parent);
+
+  // Remove the loop from the parent.
+  if (Parent)
+    delete Parent->removeChildLoop(std::find(Parent->begin(), Parent->end(),L));
+  else
+    delete LI->removeLoop(std::find(LI->begin(), LI->end(), L));
+
+
+  // FIXME: Should update dominator analyses
 
   // FIXME: Should fold into preheader and exit block