[turbofan] don't take hints from deferred blocks
We should prefer hints from operands in non-deferred blocks, else we risk sideways moves on the hot path, just to accommodate the register allocator's choice of register assignment in the deferred block. BUG= Review URL: https://codereview.chromium.org/1718223002 Cr-Commit-Position: refs/heads/master@{#34296}
This commit is contained in:
parent
c5142d863b
commit
ac9f182746
@ -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() &&
|
||||
|
Loading…
Reference in New Issue
Block a user