| Index: src/compiler/greedy-allocator.cc
|
| diff --git a/src/compiler/greedy-allocator.cc b/src/compiler/greedy-allocator.cc
|
| index 7852830c03d439f86bc6dc818a63f32d81289d0b..e0368bf366fe73a7d03dbf0aaaaceaee74957552 100644
|
| --- a/src/compiler/greedy-allocator.cc
|
| +++ b/src/compiler/greedy-allocator.cc
|
| @@ -63,53 +63,6 @@ LifetimePosition GetSplitPositionForInstruction(const LiveRange* range,
|
| }
|
|
|
|
|
| -int GetFirstGapIndex(const UseInterval* interval) {
|
| - LifetimePosition start = interval->start();
|
| - int ret = start.ToInstructionIndex();
|
| - return ret;
|
| -}
|
| -
|
| -
|
| -int GetLastGapIndex(const UseInterval* interval) {
|
| - LifetimePosition end = interval->end();
|
| - return end.ToInstructionIndex();
|
| -}
|
| -
|
| -
|
| -// Basic heuristic for advancing the algorithm, if any other splitting heuristic
|
| -// failed.
|
| -LifetimePosition GetLastResortSplitPosition(const LiveRange* range,
|
| - const InstructionSequence* code) {
|
| - if (range->first_interval()->next() != nullptr) {
|
| - return range->first_interval()->next()->start();
|
| - }
|
| -
|
| - UseInterval* interval = range->first_interval();
|
| - int first = GetFirstGapIndex(interval);
|
| - int last = GetLastGapIndex(interval);
|
| - if (first == last) return LifetimePosition::Invalid();
|
| -
|
| - // TODO(mtrofin:) determine why we can't just split somewhere arbitrary
|
| - // within the range, e.g. it's middle.
|
| - for (UsePosition* pos = range->first_pos(); pos != nullptr;
|
| - pos = pos->next()) {
|
| - if (pos->type() != UsePositionType::kRequiresRegister) continue;
|
| - LifetimePosition before =
|
| - GetSplitPositionForInstruction(range, pos->pos().ToInstructionIndex());
|
| - if (before.IsValid()) return before;
|
| - LifetimePosition after = GetSplitPositionForInstruction(
|
| - range, pos->pos().ToInstructionIndex() + 1);
|
| - if (after.IsValid()) return after;
|
| - }
|
| - return LifetimePosition::Invalid();
|
| -}
|
| -
|
| -
|
| -bool IsProgressPossible(const LiveRange* range,
|
| - const InstructionSequence* code) {
|
| - return range->CanBeSpilled(range->Start()) ||
|
| - GetLastResortSplitPosition(range, code).IsValid();
|
| -}
|
| } // namespace
|
|
|
|
|
| @@ -556,7 +509,7 @@ void GreedyAllocator::EnsureValidRangeWeight(LiveRange* range) {
|
| range->set_weight(LiveRange::kMaxWeight);
|
| return;
|
| }
|
| - if (!IsProgressPossible(range, code())) {
|
| + if (!IsProgressPossible(range)) {
|
| range->set_weight(LiveRange::kMaxWeight);
|
| return;
|
| }
|
| @@ -682,7 +635,7 @@ void GreedyAllocator::SplitOrSpillBlockedRange(LiveRange* range) {
|
|
|
| LifetimePosition pos = FindSplitPositionBeforeLoops(range);
|
|
|
| - if (!pos.IsValid()) pos = GetLastResortSplitPosition(range, code());
|
| + if (!pos.IsValid()) pos = GetLastResortSplitPosition(range);
|
| if (pos.IsValid()) {
|
| LiveRange* tail = Split(range, data(), pos);
|
| DCHECK(tail != range);
|
| @@ -694,6 +647,31 @@ void GreedyAllocator::SplitOrSpillBlockedRange(LiveRange* range) {
|
| }
|
|
|
|
|
| +// Basic heuristic for advancing the algorithm, if any other splitting heuristic
|
| +// failed.
|
| +LifetimePosition GreedyAllocator::GetLastResortSplitPosition(
|
| + const LiveRange* range) {
|
| + LifetimePosition previous = range->Start();
|
| + for (UsePosition *pos = range->NextRegisterPosition(previous); pos != nullptr;
|
| + previous = previous.NextFullStart(),
|
| + pos = range->NextRegisterPosition(previous)) {
|
| + LifetimePosition optimal = FindOptimalSplitPos(previous, pos->pos());
|
| + LifetimePosition before =
|
| + GetSplitPositionForInstruction(range, optimal.ToInstructionIndex());
|
| + if (before.IsValid()) return before;
|
| + LifetimePosition after = GetSplitPositionForInstruction(
|
| + range, pos->pos().ToInstructionIndex() + 1);
|
| + if (after.IsValid()) return after;
|
| + }
|
| + return LifetimePosition::Invalid();
|
| +}
|
| +
|
| +
|
| +bool GreedyAllocator::IsProgressPossible(const LiveRange* range) {
|
| + return range->CanBeSpilled(range->Start()) ||
|
| + GetLastResortSplitPosition(range).IsValid();
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|