Preserve dom info.
[oota-llvm.git] / lib / Transforms / Scalar / LoopUnroll.cpp
index 75ad96e49a2266546d0414ffd096ae9c3da27e2f..492db4db097357cc66c6003dcffd66b1e1a9edc6 100644 (file)
@@ -55,6 +55,12 @@ namespace {
       AU.addRequired<LoopInfo>();
       AU.addPreservedID(LCSSAID);
       AU.addPreserved<LoopInfo>();
+      // FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.
+      // If loop unroll does not preserve dom info then LCSSA pass on next
+      // loop will receive invalid dom info.
+      // For now, recreate dom info, if loop is unrolled.
+      AU.addPreserved<DominatorTree>();
+      AU.addPreserved<DominanceFrontier>();
     }
   };
 }
@@ -67,8 +73,9 @@ LoopPass *llvm::createLoopUnrollPass() { return new LoopUnroll(); }
 /// ApproximateLoopSize - Approximate the size of the loop.
 static unsigned ApproximateLoopSize(const Loop *L) {
   unsigned Size = 0;
-  for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i) {
-    BasicBlock *BB = L->getBlocks()[i];
+  for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
+       I != E; ++I) {
+    BasicBlock *BB = *I;
     Instruction *Term = BB->getTerminator();
     for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
       if (isa<PHINode>(I) && BB == L->getHeader()) {
@@ -136,8 +143,17 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
   }
 
   // Unroll the loop.
+  Function *F = L->getHeader()->getParent();
   if (!UnrollLoop(L, Count, LI, &LPM))
     return false;
 
+  // FIXME: Reconstruct dom info, because it is not preserved properly.
+  DominatorTree *DT = getAnalysisToUpdate<DominatorTree>();
+  if (DT) {
+    DT->runOnFunction(*F);
+    DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>();
+    if (DF)
+      DF->runOnFunction(*F);
+  }
   return true;
 }