[Turbofan] Fix perf regression introduced by per-range change.
When the range ends just at the gap of a non-deferred block, the last instruction the range covers is in the predecessor. If that predecessor is a deferred block, before this CL, we would splinter the remainder of the range all the way to the end. That leads to inefficient codegen, because we still want a split inside the deferred block. Also, opportunistically added a trace before we splinter, for better diagnostics. BUG= chromium:546416 LOG=N Review URL: https://codereview.chromium.org/1412123009 Cr-Commit-Position: refs/heads/master@{#31529}
This commit is contained in:
parent
83bb51e5ad
commit
32b6e085e7
@ -51,6 +51,8 @@ void CreateSplinter(TopLevelLiveRange *range, RegisterAllocationData *data,
|
||||
range->SetSplinter(splinter);
|
||||
}
|
||||
Zone *zone = data->allocation_zone();
|
||||
TRACE("creating splinter for range %d between %d and %d\n", range->vreg(),
|
||||
start.ToInstructionIndex(), end.ToInstructionIndex());
|
||||
range->Splinter(start, end, zone);
|
||||
}
|
||||
}
|
||||
@ -112,8 +114,9 @@ void SplinterLiveRange(TopLevelLiveRange *range, RegisterAllocationData *data) {
|
||||
interval = next_interval;
|
||||
}
|
||||
// When the range ends in deferred blocks, first_cut will be valid here.
|
||||
// Splinter from there to the last instruction that was in a deferred block.
|
||||
if (first_cut.IsValid()) {
|
||||
CreateSplinter(range, data, first_cut, range->End());
|
||||
CreateSplinter(range, data, first_cut, last_cut);
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
Loading…
Reference in New Issue
Block a user