Index: runtime/vm/flow_graph_allocator.cc |
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc |
index de0cbed436a43cd05342330a331cf043aec230a1..406e2d38f885eabc70b1f14d46bbb0076242024e 100644 |
--- a/runtime/vm/flow_graph_allocator.cc |
+++ b/runtime/vm/flow_graph_allocator.cc |
@@ -610,7 +610,7 @@ void FlowGraphAllocator::ProcessInitialDefinition(Definition* defn, |
range->set_assigned_location(Location::Constant(constant->value())); |
range->set_spill_slot(Location::Constant(constant->value())); |
} |
- AssignSafepoints(range); |
+ AssignSafepoints(defn, range); |
range->finger()->Initialize(range); |
UsePosition* use = |
range->finger()->FirstRegisterBeneficialUse(block->start_pos()); |
@@ -783,7 +783,7 @@ void FlowGraphAllocator::ConnectIncomingPhiMoves(JoinEntryInstr* join) { |
// All phi resolution moves are connected. Phi's live range is |
// complete. |
- AssignSafepoints(range); |
+ AssignSafepoints(phi, range); |
CompleteRange(range, RegisterKindForResult(phi)); |
@@ -994,7 +994,6 @@ void FlowGraphAllocator::ProcessOneInput(BlockEntryInstr* block, |
void FlowGraphAllocator::ProcessOneOutput(BlockEntryInstr* block, |
- Instruction* current, |
intptr_t pos, |
Location* out, |
Definition* def, |
@@ -1103,8 +1102,8 @@ void FlowGraphAllocator::ProcessOneOutput(BlockEntryInstr* block, |
range->AddUse(pos, out); |
} |
- AssignSafepoints(range); |
- CompleteRange(range, RegisterKindForResult(current)); |
+ AssignSafepoints(def, range); |
+ CompleteRange(range, RegisterKindForResult(def)); |
} |
@@ -1301,14 +1300,14 @@ void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block, |
ASSERT(input->HasPairRepresentation()); |
// Each element of the pair is assigned it's own virtual register number |
// and is allocated its own LiveRange. |
- ProcessOneOutput(block, current, pos, // BlockEntry, Instruction, seq. |
+ ProcessOneOutput(block, pos, // BlockEntry, seq. |
pair->SlotAt(0), def, // (output) Location, Definition. |
def->ssa_temp_index(), // (output) virtual register. |
true, // output mapped to first input. |
in_pair->SlotAt(0), input, // (input) Location, Def. |
input->ssa_temp_index(), // (input) virtual register. |
interference_set); |
- ProcessOneOutput(block, current, pos, |
+ ProcessOneOutput(block, pos, |
pair->SlotAt(1), def, |
ToSecondPairVreg(def->ssa_temp_index()), |
true, |
@@ -1318,13 +1317,13 @@ void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block, |
} else { |
// Each element of the pair is assigned it's own virtual register number |
// and is allocated its own LiveRange. |
- ProcessOneOutput(block, current, pos, |
+ ProcessOneOutput(block, pos, |
pair->SlotAt(0), def, |
def->ssa_temp_index(), |
false, // output is not mapped to first input. |
NULL, NULL, -1, // First input not needed. |
interference_set); |
- ProcessOneOutput(block, current, pos, |
+ ProcessOneOutput(block, pos, |
pair->SlotAt(1), def, |
ToSecondPairVreg(def->ssa_temp_index()), |
false, |
@@ -1336,7 +1335,7 @@ void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block, |
Location* in_ref = locs->in_slot(0); |
Definition* input = current->InputAt(0)->definition(); |
ASSERT(!in_ref->IsPairLocation()); |
- ProcessOneOutput(block, current, pos, // BlockEntry, Instruction, seq. |
+ ProcessOneOutput(block, pos, // BlockEntry, Instruction, seq. |
out, def, // (output) Location, Definition. |
def->ssa_temp_index(), // (output) virtual register. |
true, // output mapped to first input. |
@@ -1344,7 +1343,7 @@ void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block, |
input->ssa_temp_index(), // (input) virtual register. |
interference_set); |
} else { |
- ProcessOneOutput(block, current, pos, |
+ ProcessOneOutput(block, pos, |
out, def, |
def->ssa_temp_index(), |
false, // output is not mapped to first input. |
@@ -2463,14 +2462,23 @@ bool LiveRange::Contains(intptr_t pos) const { |
} |
-void FlowGraphAllocator::AssignSafepoints(LiveRange* range) { |
+void FlowGraphAllocator::AssignSafepoints(Definition* defn, |
+ LiveRange* range) { |
for (intptr_t i = safepoints_.length() - 1; i >= 0; i--) { |
- Instruction* instr = safepoints_[i]; |
+ Instruction* safepoint_instr = safepoints_[i]; |
+ if (safepoint_instr == defn) { |
+ // The value is not live until after the definition is fully executed, |
+ // don't assign the safepoint inside the definition itself to |
+ // definition's liverange. |
+ continue; |
+ } |
- const intptr_t pos = instr->lifetime_position(); |
+ const intptr_t pos = safepoint_instr->lifetime_position(); |
if (range->End() <= pos) break; |
- if (range->Contains(pos)) range->AddSafepoint(pos, instr->locs()); |
+ if (range->Contains(pos)) { |
+ range->AddSafepoint(pos, safepoint_instr->locs()); |
+ } |
} |
} |