Remove ADCE's ability to delete loops.  This ability is now implemented in a
safer manner by loop deletion.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51182 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp
index c633f93..11fb1e3 100644
--- a/lib/Transforms/Scalar/ADCE.cpp
+++ b/lib/Transforms/Scalar/ADCE.cpp
@@ -191,10 +191,18 @@
   // be eliminated later, along with the instructions inside.
   //
   std::set<BasicBlock*> ReachableBBs;
-  for (df_ext_iterator<BasicBlock*>
-         BBI = df_ext_begin(&Func->front(), ReachableBBs),
-         BBE = df_ext_end(&Func->front(), ReachableBBs); BBI != BBE; ++BBI) {
-    BasicBlock *BB = *BBI;
+  std::vector<BasicBlock*> Stack;
+  Stack.push_back(&Func->getEntryBlock());
+  
+  while (!Stack.empty()) {
+    BasicBlock* BB = Stack.back();
+    if (ReachableBBs.count(BB)) {
+      Stack.pop_back();
+      continue;
+    } else {
+      ReachableBBs.insert(BB);
+    }
+    
     for (BasicBlock::iterator II = BB->begin(), EI = BB->end(); II != EI; ) {
       Instruction *I = II++;
       if (CallInst *CI = dyn_cast<CallInst>(I)) {
@@ -217,6 +225,15 @@
         ++NumInstRemoved;
       }
     }
+  
+    for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI) {
+      // Back edges (as opposed to cross edges) indicate loops, so implicitly
+      // mark them live.
+      if (std::find(Stack.begin(), Stack.end(), *SI) != Stack.end())
+        markInstructionLive(BB->getTerminator());
+      if (!ReachableBBs.count(*SI))
+        Stack.push_back(*SI);
+    }
   }
 
   // Check to ensure we have an exit node for this CFG.  If we don't, we won't