ART: Fix test breakage
Recent commit changed the direction of iteration over safepoints in
the register allocator but contained a bug that skipped some of them
at the boundaries of interval siblings. This patch fixes the bug.
Change-Id: Ia7d4892536b5198e01c9bc3034f448227794ff72
diff --git a/compiler/optimizing/register_allocator.cc b/compiler/optimizing/register_allocator.cc
index 0e9c4d6..748ab22 100644
--- a/compiler/optimizing/register_allocator.cc
+++ b/compiler/optimizing/register_allocator.cc
@@ -1425,13 +1425,13 @@
// At each safepoint, we record stack and register information.
// We iterate backwards to test safepoints in ascending order of positions,
// which is what LiveInterval::Covers is optimized for.
- while (safepoint_index > 0) {
- HInstruction* safepoint = safepoints_.Get(--safepoint_index);
+ for (; safepoint_index > 0; --safepoint_index) {
+ HInstruction* safepoint = safepoints_.Get(safepoint_index - 1);
size_t position = safepoint->GetLifetimePosition();
// Test that safepoints are ordered in the optimal way.
- DCHECK(safepoint_index == 0
- || safepoints_.Get(safepoint_index - 1)->GetLifetimePosition() >= position);
+ DCHECK(safepoint_index == safepoints_.Size()
+ || safepoints_.Get(safepoint_index)->GetLifetimePosition() <= position);
if (current->IsDeadAt(position)) {
break;