diff options
author | 2016-02-06 17:01:15 +0000 | |
---|---|---|
committer | 2016-02-06 17:01:36 +0000 | |
commit | 119a885ff58f158a4e3cd783c5604ae4252a08eb (patch) | |
tree | 6fb6eefb81d4d053645a3b5e8475ee4e8b43d68c /compiler/optimizing/register_allocator.cc | |
parent | 2a49bc4625155b80287c155b57354b9559d71bed (diff) |
Fix AllocateBlockedReg.
Motivated by System.arraycopy(char) for x86, where only looking
at use and not register use makes the allocator think it's out
of registers.
bug:27019403
Change-Id: I0db5bc839a77e6394a07facbf19d00a165dc2ef7
Diffstat (limited to 'compiler/optimizing/register_allocator.cc')
-rw-r--r-- | compiler/optimizing/register_allocator.cc | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/compiler/optimizing/register_allocator.cc b/compiler/optimizing/register_allocator.cc index 5cd30adb45..b8d76b912e 100644 --- a/compiler/optimizing/register_allocator.cc +++ b/compiler/optimizing/register_allocator.cc @@ -994,10 +994,6 @@ bool RegisterAllocator::AllocateBlockedReg(LiveInterval* current) { return false; } - // We use the first use to compare with other intervals. If this interval - // is used after any active intervals, we will spill this interval. - size_t first_use = current->FirstUseAfter(current->GetStart()); - // First set all registers as not being used. size_t* next_use = registers_array_; for (size_t i = 0; i < number_of_registers_; ++i) { @@ -1011,7 +1007,7 @@ bool RegisterAllocator::AllocateBlockedReg(LiveInterval* current) { if (active->IsFixed()) { next_use[active->GetRegister()] = current->GetStart(); } else { - size_t use = active->FirstUseAfter(current->GetStart()); + size_t use = active->FirstRegisterUseAfter(current->GetStart()); if (use != kNoLifetime) { next_use[active->GetRegister()] = use; } @@ -1052,16 +1048,16 @@ bool RegisterAllocator::AllocateBlockedReg(LiveInterval* current) { DCHECK(current->IsHighInterval()); reg = current->GetRegister(); // When allocating the low part, we made sure the high register was available. - DCHECK_LT(first_use, next_use[reg]); + DCHECK_LT(first_register_use, next_use[reg]); } else if (current->IsLowInterval()) { - reg = FindAvailableRegisterPair(next_use, first_use); + reg = FindAvailableRegisterPair(next_use, first_register_use); // We should spill if both registers are not available. - should_spill = (first_use >= next_use[reg]) - || (first_use >= next_use[GetHighForLowRegister(reg)]); + should_spill = (first_register_use >= next_use[reg]) + || (first_register_use >= next_use[GetHighForLowRegister(reg)]); } else { DCHECK(!current->IsHighInterval()); reg = FindAvailableRegister(next_use, current); - should_spill = (first_use >= next_use[reg]); + should_spill = (first_register_use >= next_use[reg]); } DCHECK_NE(reg, kNoRegister); |