Commit 8937bfc1 authored by mtrofin's avatar mtrofin Committed by Commit bot

[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}
parent 34ce9875
...@@ -256,7 +256,7 @@ void GreedyAllocator::SplitAndSpillRangesDefinedByMemoryOperand() { ...@@ -256,7 +256,7 @@ void GreedyAllocator::SplitAndSpillRangesDefinedByMemoryOperand() {
for (size_t i = 0; i < initial_range_count; ++i) { for (size_t i = 0; i < initial_range_count; ++i) {
auto range = data()->live_ranges()[i]; auto range = data()->live_ranges()[i];
if (!CanProcessRange(range)) continue; if (!CanProcessRange(range)) continue;
if (range->HasNoSpillType()) continue; if (!range->HasSpillOperand()) continue;
LifetimePosition start = range->Start(); LifetimePosition start = range->Start();
TRACE("Live range %d:%d is defined by a spill operand.\n", TRACE("Live range %d:%d is defined by a spill operand.\n",
...@@ -273,12 +273,11 @@ void GreedyAllocator::SplitAndSpillRangesDefinedByMemoryOperand() { ...@@ -273,12 +273,11 @@ void GreedyAllocator::SplitAndSpillRangesDefinedByMemoryOperand() {
} else if (pos->pos() > range->Start().NextStart()) { } else if (pos->pos() > range->Start().NextStart()) {
// Do not spill live range eagerly if use position that can benefit from // Do not spill live range eagerly if use position that can benefit from
// the register is too close to the start of live range. // the register is too close to the start of live range.
auto split_pos = pos->pos(); auto split_pos = GetSplitPositionForInstruction(
if (data()->IsBlockBoundary(split_pos.Start())) { range, data()->code(), pos->pos().ToInstructionIndex());
split_pos = split_pos.Start(); split_pos =
} else { FindOptimalSplitPos(range->Start().NextFullStart(), split_pos);
split_pos = split_pos.PrevStart().End();
}
Split(range, data(), split_pos); Split(range, data(), split_pos);
Spill(range); Spill(range);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment