diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2019-02-06 07:56:36 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2019-02-06 07:56:36 +0000 |
commit | 36b392cbe4fc2c88b8451be14dd37d552ef2d881 (patch) | |
tree | 2d60575bc6396281527217d9047088c6d1234cd6 /llvm/lib/Transforms/Utils | |
parent | a4ccfc1841f90b0dbce3f4e36a97ca0901bf35d7 (diff) | |
download | bcm5719-llvm-36b392cbe4fc2c88b8451be14dd37d552ef2d881.tar.gz bcm5719-llvm-36b392cbe4fc2c88b8451be14dd37d552ef2d881.zip |
[NFC] Factor out detatchment of dead blocks from their erasing
llvm-svn: 353277
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r-- | llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index cb8614fcb98..41ad4fefe1f 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -47,29 +47,17 @@ using namespace llvm; -void llvm::DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU) { - DeleteDeadBlocks({BB}, DTU); -} - -void llvm::DeleteDeadBlocks(ArrayRef <BasicBlock *> BBs, - DomTreeUpdater *DTU) { -#ifndef NDEBUG - // Make sure that all predecessors of each dead block is also dead. - SmallPtrSet<BasicBlock *, 4> Dead(BBs.begin(), BBs.end()); - assert(Dead.size() == BBs.size() && "Duplicating blocks?"); - for (auto *BB : Dead) - for (BasicBlock *Pred : predecessors(BB)) - assert(Dead.count(Pred) && "All predecessors must be dead!"); -#endif - - SmallVector<DominatorTree::UpdateType, 4> Updates; +void llvm::DetatchDeadBlocks( + ArrayRef<BasicBlock *> BBs, + SmallVectorImpl<DominatorTree::UpdateType> *Updates) { for (auto *BB : BBs) { // Loop through all of our successors and make sure they know that one // of their predecessors is going away. + SmallPtrSet<BasicBlock *, 4> UniqueSuccessors; for (BasicBlock *Succ : successors(BB)) { Succ->removePredecessor(BB); - if (DTU) - Updates.push_back({DominatorTree::Delete, BB, Succ}); + if (Updates && UniqueSuccessors.insert(Succ).second) + Updates->push_back({DominatorTree::Delete, BB, Succ}); } // Zap all the instructions in the block. @@ -90,6 +78,26 @@ void llvm::DeleteDeadBlocks(ArrayRef <BasicBlock *> BBs, "The successor list of BB isn't empty before " "applying corresponding DTU updates."); } +} + +void llvm::DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU) { + DeleteDeadBlocks({BB}, DTU); +} + +void llvm::DeleteDeadBlocks(ArrayRef <BasicBlock *> BBs, + DomTreeUpdater *DTU) { +#ifndef NDEBUG + // Make sure that all predecessors of each dead block is also dead. + SmallPtrSet<BasicBlock *, 4> Dead(BBs.begin(), BBs.end()); + assert(Dead.size() == BBs.size() && "Duplicating blocks?"); + for (auto *BB : Dead) + for (BasicBlock *Pred : predecessors(BB)) + assert(Dead.count(Pred) && "All predecessors must be dead!"); +#endif + + SmallVector<DominatorTree::UpdateType, 4> Updates; + DetatchDeadBlocks(BBs, DTU ? &Updates : nullptr); + if (DTU) DTU->applyUpdates(Updates, /*ForceRemoveDuplicates*/ true); |