When we delete a dead basic block, see if any of its successors are dead and
authorBill Wendling <isanbard@gmail.com>
Wed, 28 Nov 2012 23:23:48 +0000 (23:23 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 28 Nov 2012 23:23:48 +0000 (23:23 +0000)
delete those as well.

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

lib/Transforms/Scalar/CodeGenPrepare.cpp

index b608a5535edcde5d8e56353d34e157b40a547c6a..61adb2dc12bd8f7322335c8383e25d7732137d22 100644 (file)
@@ -194,9 +194,19 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
           WorkList.insert(*II);
     }
 
-    for (SmallPtrSet<BasicBlock*, 8>::iterator
-           I = WorkList.begin(), E = WorkList.end(); I != E; ++I)
-      DeleteDeadBlock(*I);
+    // Delete the dead blocks and any of their dead successors.
+    while (!WorkList.empty()) {
+      BasicBlock *BB = *WorkList.begin();
+      WorkList.erase(BB);
+      SmallVector<BasicBlock*, 2> Successors(succ_begin(BB), succ_end(BB));
+
+      DeleteDeadBlock(BB);
+      
+      for (SmallVectorImpl<BasicBlock*>::iterator
+             II = Successors.begin(), IE = Successors.end(); II != IE; ++II)
+        if (pred_begin(*II) == pred_end(*II))
+          WorkList.insert(*II);
+    }
 
     // Merge pairs of basic blocks with unconditional branches, connected by
     // a single edge.