[llvm] r350116 - [LoopSimplifyCFG] Delete dead blocks in RPO
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 27 22:08:51 PST 2018
Author: mkazantsev
Date: Thu Dec 27 22:08:51 2018
New Revision: 350116
URL: http://llvm.org/viewvc/llvm-project?rev=350116&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=350116&r1=350115&r2=350116&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp Thu Dec 27 22:08:51 2018
@@ -106,7 +106,7 @@ private:
SmallPtrSet<BasicBlock *, 8> LiveLoopBlocks;
// The blocks of the original loop that will become unreachable from entry
// after the constant folding.
- SmallPtrSet<BasicBlock *, 8> DeadLoopBlocks;
+ SmallVector<BasicBlock *, 8> DeadLoopBlocks;
// The exits of the original loop that will still be reachable from entry
// after the constant folding.
SmallPtrSet<BasicBlock *, 8> 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<BasicBlock *, 8> DeadLoopBlocksSet(DeadLoopBlocks.begin(),
+ DeadLoopBlocks.end());
+ MSSAU->removeBlocks(DeadLoopBlocksSet);
+ }
for (auto *BB : DeadLoopBlocks) {
assert(BB != L.getHeader() &&
"Header of the current loop cannot be dead!");
More information about the llvm-commits
mailing list