[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:
mtrofin 2015-10-23 08:46:45 -07:00 committed by Commit bot
parent 83bb51e5ad
commit 32b6e085e7

View File

@ -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