diff options
Diffstat (limited to 'compiler/optimizing/dead_code_elimination.cc')
-rw-r--r-- | compiler/optimizing/dead_code_elimination.cc | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc index fdfe518e95..5de629d605 100644 --- a/compiler/optimizing/dead_code_elimination.cc +++ b/compiler/optimizing/dead_code_elimination.cc @@ -68,6 +68,7 @@ void HDeadCodeElimination::RemoveDeadBlocks() { ArenaBitVector affected_loops(allocator, graph_->GetBlocks().Size(), false); MarkReachableBlocks(graph_->GetEntryBlock(), &live_blocks); + bool removed_one_or_more_blocks = false; // Remove all dead blocks. Iterate in post order because removal needs the // block's chain of dominators and nested loops need to be updated from the @@ -84,9 +85,17 @@ void HDeadCodeElimination::RemoveDeadBlocks() { MaybeRecordDeadBlock(block); MarkLoopHeadersContaining(*block, &affected_loops); block->DisconnectAndDelete(); + removed_one_or_more_blocks = true; } } + // If we removed at least one block, we need to recompute the full + // dominator tree. + if (removed_one_or_more_blocks) { + graph_->ClearDominanceInformation(); + graph_->ComputeDominanceInformation(); + } + // Connect successive blocks created by dead branches. Order does not matter. for (HReversePostOrderIterator it(*graph_); !it.Done();) { HBasicBlock* block = it.Current(); |