diff options
author | Fedor Sergeev <fedor.sergeev@azul.com> | 2018-08-29 19:10:44 +0000 |
---|---|---|
committer | Fedor Sergeev <fedor.sergeev@azul.com> | 2018-08-29 19:10:44 +0000 |
commit | 7b49aa03af9877ede00a100c6b178414e2f8656d (patch) | |
tree | 4dfde49be225ff4961d62462ec1088baba3d60ea /llvm/lib/Transforms | |
parent | cf311cfc20a363ba1ee1a8115ab307d6745a6b73 (diff) | |
download | bcm5719-llvm-7b49aa03af9877ede00a100c6b178414e2f8656d.tar.gz bcm5719-llvm-7b49aa03af9877ede00a100c6b178414e2f8656d.zip |
[SimpleLoopUnswitch] After unswitch delete dead blocks in parent loops
Summary:
Assert from PR38737 happens on the dead block inside the parent loop
after unswitching nontrivial switch in the inner loop.
deleteDeadBlocksFromLoop now takes extra care to detect/remove dead
blocks in all the parent loops in addition to the blocks from original
loop being unswitched.
Reviewers: asbirlea, chandlerc
Reviewed By: asbirlea
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D51415
llvm-svn: 340955
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp index 8b67c470a35..3cc2c651f6c 100644 --- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp @@ -1380,13 +1380,21 @@ deleteDeadBlocksFromLoop(Loop &L, DominatorTree &DT, LoopInfo &LI) { // Find all the dead blocks, and remove them from their successors. SmallVector<BasicBlock *, 16> DeadBlocks; - for (BasicBlock *BB : llvm::concat<BasicBlock *const>(L.blocks(), ExitBlocks)) + for (BasicBlock *BB : ExitBlocks) if (!DT.isReachableFromEntry(BB)) { for (BasicBlock *SuccBB : successors(BB)) SuccBB->removePredecessor(BB); DeadBlocks.push_back(BB); } + for (Loop *ParentL = &L; ParentL; ParentL = ParentL->getParentLoop()) + for (BasicBlock *BB : ParentL->blocks()) + if (!DT.isReachableFromEntry(BB)) { + for (BasicBlock *SuccBB : successors(BB)) + SuccBB->removePredecessor(BB); + DeadBlocks.push_back(BB); + } + SmallPtrSet<BasicBlock *, 16> DeadBlockSet(DeadBlocks.begin(), DeadBlocks.end()); @@ -1431,7 +1439,7 @@ deleteDeadBlocksFromLoop(Loop &L, // Actually delete the blocks now that they've been fully unhooked from the // IR. - for (auto *BB : DeadBlocks) + for (auto *BB : DeadBlockSet) BB->eraseFromParent(); } |