Quick: Fix LoopRepeatingTopologicalSortIterator.
Always push the loop head on the loop head stack. This fixes
a bug where we failed to return to an unnatural loop head to
recalculate its GVN data.
Bug: 17410955
Change-Id: I3a2c3225e5d16268c3f56f7f90228759c7da37a9
diff --git a/compiler/dex/dataflow_iterator-inl.h b/compiler/dex/dataflow_iterator-inl.h
index 83dfc28..e9402e3 100644
--- a/compiler/dex/dataflow_iterator-inl.h
+++ b/compiler/dex/dataflow_iterator-inl.h
@@ -181,10 +181,16 @@
idx_ += 1;
BasicBlock* bb = mir_graph_->GetBasicBlock((*block_id_list_)[idx]);
DCHECK(bb != nullptr);
+ if ((*loop_ends_)[idx] != 0u) {
+ // If bb->visited is false, the loop needs to be processed from scratch.
+ // Otherwise we mark it as recalculating; for a natural loop we will not
+ // need to recalculate any block in the loop anyway, and for unnatural
+ // loops we will recalculate the loop head only if one of its predecessors
+ // actually changes.
+ bool recalculating = bb->visited;
+ loop_head_stack_->push_back(std::make_pair(idx, recalculating));
+ }
if (!bb->visited) {
- if ((*loop_ends_)[idx] != 0u) {
- loop_head_stack_->push_back(std::make_pair(idx, false)); // Not recalculating.
- }
return bb;
}
}