| Index: runtime/vm/flow_graph_allocator.cc
|
| diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
|
| index a3664ede81aa48f9131678830e93a257942aff32..d8e30f627bed50046ab82ffc9bf4b579acc02350 100644
|
| --- a/runtime/vm/flow_graph_allocator.cc
|
| +++ b/runtime/vm/flow_graph_allocator.cc
|
| @@ -846,15 +846,38 @@ void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block,
|
| range->AddUseInterval(block->start_pos(), pos - 1);
|
| range->AddHintedUse(pos - 1, move->src_slot(), in_ref);
|
| } else if (in_ref->IsUnallocated()) {
|
| - // Normal unallocated input. Expected shape of
|
| - // live ranges:
|
| - //
|
| - // i i'
|
| - // value -----*
|
| - //
|
| - ASSERT(in_ref->IsUnallocated());
|
| - range->AddUseInterval(block->start_pos(), pos + 1);
|
| - range->AddUse(pos + 1, in_ref);
|
| + if (in_ref->policy() == Location::kWritableRegister) {
|
| + // Writable unallocated input. Expected shape of
|
| + // live ranges:
|
| + //
|
| + // i i'
|
| + // value --*
|
| + // temp [--)
|
| + MoveOperands* move = AddMoveAt(pos,
|
| + Location::RequiresRegister(),
|
| + Location::PrefersRegister());
|
| +
|
| + // Add uses to the live range of the input.
|
| + range->AddUseInterval(block->start_pos(), pos);
|
| + range->AddUse(pos, move->src_slot());
|
| +
|
| + // Create live range for the temporary.
|
| + LiveRange* temp = MakeLiveRangeForTemporary();
|
| + temp->AddUseInterval(pos, pos + 1);
|
| + temp->AddHintedUse(pos, in_ref, move->src_slot());
|
| + temp->AddUse(pos, move->dest_slot());
|
| + *in_ref = Location::RequiresRegister();
|
| + CompleteRange(temp, RegisterKindFromPolicy(*in_ref));
|
| + } else {
|
| + // Normal unallocated input. Expected shape of
|
| + // live ranges:
|
| + //
|
| + // i i'
|
| + // value -----*
|
| + //
|
| + range->AddUseInterval(block->start_pos(), pos + 1);
|
| + range->AddUse(pos + 1, in_ref);
|
| + }
|
| } else {
|
| ASSERT(in_ref->IsConstant());
|
| }
|
|
|