[turbofan] greedy: heuristic for memory operands
When we have a memory operand (HasSpillOperand() == true), and it doesn't need a register immediately, split in an optimal position, which is outside the outermost possible loop - just like Linear does. This results in some modest improvements in perf, when compared to baseline greedy. In particular Jetstream zlib x64: 4.66%, Life (Emscripten x64) 11%; largest regression is in AreWeFastYet x64: 8% and Corrections (Emsccripten x32) 10% BUG= Review URL: https://codereview.chromium.org/1306823005 Cr-Commit-Position: refs/heads/master@{#30498}
This commit is contained in:
parent
34ce987586
commit
8937bfc1d1
@ -256,7 +256,7 @@ void GreedyAllocator::SplitAndSpillRangesDefinedByMemoryOperand() {
|
||||
for (size_t i = 0; i < initial_range_count; ++i) {
|
||||
auto range = data()->live_ranges()[i];
|
||||
if (!CanProcessRange(range)) continue;
|
||||
if (range->HasNoSpillType()) continue;
|
||||
if (!range->HasSpillOperand()) continue;
|
||||
|
||||
LifetimePosition start = range->Start();
|
||||
TRACE("Live range %d:%d is defined by a spill operand.\n",
|
||||
@ -273,12 +273,11 @@ void GreedyAllocator::SplitAndSpillRangesDefinedByMemoryOperand() {
|
||||
} else if (pos->pos() > range->Start().NextStart()) {
|
||||
// Do not spill live range eagerly if use position that can benefit from
|
||||
// the register is too close to the start of live range.
|
||||
auto split_pos = pos->pos();
|
||||
if (data()->IsBlockBoundary(split_pos.Start())) {
|
||||
split_pos = split_pos.Start();
|
||||
} else {
|
||||
split_pos = split_pos.PrevStart().End();
|
||||
}
|
||||
auto split_pos = GetSplitPositionForInstruction(
|
||||
range, data()->code(), pos->pos().ToInstructionIndex());
|
||||
split_pos =
|
||||
FindOptimalSplitPos(range->Start().NextFullStart(), split_pos);
|
||||
|
||||
Split(range, data(), split_pos);
|
||||
Spill(range);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user