summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/CodeGenPrepare.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-11-28 23:23:48 +0000
committerBill Wendling <isanbard@gmail.com>2012-11-28 23:23:48 +0000
commitbf2ad736c70c24ae3108b22c5fd36f9f266aad68 (patch)
tree7d6d4028431ccfd31df630aeb866fa5b22e21137 /lib/Transforms/Scalar/CodeGenPrepare.cpp
parent021536888766ab8e0e27cd4c5f48ad6031399ca4 (diff)
downloadllvm-bf2ad736c70c24ae3108b22c5fd36f9f266aad68.tar.gz
llvm-bf2ad736c70c24ae3108b22c5fd36f9f266aad68.tar.bz2
llvm-bf2ad736c70c24ae3108b22c5fd36f9f266aad68.tar.xz
When we delete a dead basic block, see if any of its successors are dead and
delete those as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168829 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/CodeGenPrepare.cpp')
-rw-r--r--lib/Transforms/Scalar/CodeGenPrepare.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp
index b608a5535e..61adb2dc12 100644
--- a/lib/Transforms/Scalar/CodeGenPrepare.cpp
+++ b/lib/Transforms/Scalar/CodeGenPrepare.cpp
@@ -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.