Index: runtime/vm/flow_graph_compiler.cc |
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc |
index 648bc6e53f02694710ab365b40ecf5990a00ecc3..7da18183f150ef10fae39072aab59fb7cdbce9a7 100644 |
--- a/runtime/vm/flow_graph_compiler.cc |
+++ b/runtime/vm/flow_graph_compiler.cc |
@@ -567,7 +567,7 @@ void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs) { |
for (intptr_t i = 0; i < kNumberOfCpuRegisters; ++i) { |
Register reg = static_cast<Register>(i); |
if (locs->live_registers()->ContainsRegister(reg)) { |
- bitmap->Set(bitmap->Length(), true); |
+ bitmap->Set(bitmap->Length(), locs->live_registers()->IsTagged(reg)); |
} |
} |
} |
@@ -638,7 +638,6 @@ Environment* FlowGraphCompiler::SlowPathEnvironmentFor( |
Value* value = it.CurrentValue(); |
switch (value->definition()->representation()) { |
case kUnboxedDouble: |
- case kUnboxedMint: |
it.SetCurrentLocation(Location::DoubleStackSlot(index)); |
break; |
case kUnboxedFloat32x4: |
@@ -649,6 +648,27 @@ Environment* FlowGraphCompiler::SlowPathEnvironmentFor( |
default: |
UNREACHABLE(); |
} |
+ } else if (loc.IsPairLocation()) { |
+ intptr_t representation = |
+ it.CurrentValue()->definition()->representation(); |
+ ASSERT(representation == kUnboxedMint); |
+ PairLocation* value_pair = loc.AsPairLocation(); |
+ intptr_t index_lo; |
+ intptr_t index_hi; |
+ if (value_pair->At(0).IsRegister()) { |
+ index_lo = cpu_reg_slots[value_pair->At(0).reg()]; |
+ } else { |
+ ASSERT(value_pair->At(0).IsStackSlot()); |
+ index_lo = value_pair->At(0).stack_index(); |
+ } |
+ if (value_pair->At(1).IsRegister()) { |
+ index_hi = cpu_reg_slots[value_pair->At(1).reg()]; |
+ } else { |
+ ASSERT(value_pair->At(1).IsStackSlot()); |
+ index_hi = value_pair->At(1).stack_index(); |
+ } |
+ it.SetCurrentLocation(Location::Pair(Location::StackSlot(index_lo), |
+ Location::StackSlot(index_hi))); |
} else if (loc.IsInvalid()) { |
Definition* def = |
it.CurrentValue()->definition(); |