1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00

[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.

llvm-svn: 350116
This commit is contained in:
Max Kazantsev 2018-12-28 06:08:51 +00:00
parent 36ffad5f58
commit 4a72293755

View File

@ -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!");