From: Max Kazantsev Date: Fri, 28 Dec 2018 06:08:51 +0000 (+0000) Subject: [LoopSimplifyCFG] Delete dead blocks in RPO X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9800ccf353835e68897f58894e0cdbd4d4102f36;p=llvm [LoopSimplifyCFG] Delete dead blocks in RPO Deletion of dead blocks in arbitrary order may lead to failure of assertion in `DeleteDeadBlock` that requires that we have deleted all predecessors before we can delete the current block. We should instead delete them in RPO order. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350116 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp index 59bc30ee836..1ad2499bbba 100644 --- a/lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ b/lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -106,7 +106,7 @@ private: SmallPtrSet LiveLoopBlocks; // The blocks of the original loop that will become unreachable from entry // after the constant folding. - SmallPtrSet DeadLoopBlocks; + SmallVector DeadLoopBlocks; // The exits of the original loop that will still be reachable from entry // after the constant folding. SmallPtrSet LiveExitBlocks; @@ -141,7 +141,7 @@ private: PrintOutVector("Blocks in which we can constant-fold terminator:", FoldCandidates); PrintOutSet("Live blocks from the original loop:", LiveLoopBlocks); - PrintOutSet("Dead blocks from the original loop:", DeadLoopBlocks); + PrintOutVector("Dead blocks from the original loop:", DeadLoopBlocks); PrintOutSet("Live exit blocks:", LiveExitBlocks); PrintOutVector("Dead exit blocks:", DeadExitBlocks); if (!DeleteCurrentLoop) @@ -196,7 +196,7 @@ private: // If a loop block wasn't marked as live so far, then it's dead. if (!LiveLoopBlocks.count(BB)) { - DeadLoopBlocks.insert(BB); + DeadLoopBlocks.push_back(BB); continue; } @@ -385,8 +385,11 @@ private: /// relevant updates to DT and LI. void deleteDeadLoopBlocks() { DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager); - if (MSSAU) - MSSAU->removeBlocks(DeadLoopBlocks); + if (MSSAU) { + SmallPtrSet DeadLoopBlocksSet(DeadLoopBlocks.begin(), + DeadLoopBlocks.end()); + MSSAU->removeBlocks(DeadLoopBlocksSet); + } for (auto *BB : DeadLoopBlocks) { assert(BB != L.getHeader() && "Header of the current loop cannot be dead!");