| Index: src/compiler/register-allocator.cc
|
| diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc
|
| index 02ba1f17c24c640d6865f5c5805ec267b85828a6..fec5d1b027bcf59a3555ceb8b96730fe7084a6da 100644
|
| --- a/src/compiler/register-allocator.cc
|
| +++ b/src/compiler/register-allocator.cc
|
| @@ -2197,8 +2197,22 @@ void LiveRangeBuilder::ProcessPhis(const InstructionBlock* block,
|
| int phi_vreg = phi->virtual_register();
|
| live->Remove(phi_vreg);
|
| InstructionOperand* hint = nullptr;
|
| - Instruction* instr = GetLastInstruction(
|
| - code(), code()->InstructionBlockAt(block->predecessors()[0]));
|
| + const InstructionBlock::Predecessors& predecessors = block->predecessors();
|
| + const InstructionBlock* predecessor_block =
|
| + code()->InstructionBlockAt(predecessors[0]);
|
| + const Instruction* instr = GetLastInstruction(code(), predecessor_block);
|
| + if (predecessor_block->IsDeferred()) {
|
| + // "Prefer the hint from the first non-deferred predecessor, if any.
|
| + for (size_t i = 1; i < predecessors.size(); ++i) {
|
| + predecessor_block = code()->InstructionBlockAt(predecessors[i]);
|
| + if (!predecessor_block->IsDeferred()) {
|
| + instr = GetLastInstruction(code(), predecessor_block);
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + DCHECK_NOT_NULL(instr);
|
| +
|
| for (MoveOperands* move : *instr->GetParallelMove(Instruction::END)) {
|
| InstructionOperand& to = move->destination();
|
| if (to.IsUnallocated() &&
|
|
|