diff options
| author | 2015-07-06 15:12:53 +0000 | |
|---|---|---|
| committer | 2015-07-06 16:20:59 +0100 | |
| commit | 45b83aff85a8a8dfcae0da90d010fa2d7eb299a7 (patch) | |
| tree | ab9859f385b166831204d002878677d3cd30a031 /compiler/optimizing | |
| parent | f7aa6c05a1c7d70182d43abaf3ff43b6d463eec0 (diff) | |
Revert "Revert "Fix LSRA bug with explicit register temporaries""
This reverts commit a5fc140ff315dda9bc0a8e59963ed547676cd941.
Change-Id: Ic322484176e55d0c7cd7250d629b9e5046006a4f
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/code_generator.h | 6 | ||||
| -rw-r--r-- | compiler/optimizing/locations.h | 4 | ||||
| -rw-r--r-- | compiler/optimizing/register_allocator.cc | 7 |
3 files changed, 15 insertions, 2 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index 4cecd61365..eb63b49884 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -294,6 +294,12 @@ class CodeGenerator { allocated_registers_.Add(location); } + bool HasAllocatedRegister(bool is_core, int reg) const { + return is_core + ? allocated_registers_.ContainsCoreRegister(reg) + : allocated_registers_.ContainsFloatingPointRegister(reg); + } + void AllocateLocations(HInstruction* instruction); // Tells whether the stack frame of the compiled method is diff --git a/compiler/optimizing/locations.h b/compiler/optimizing/locations.h index f41a782fe6..4b250465aa 100644 --- a/compiler/optimizing/locations.h +++ b/compiler/optimizing/locations.h @@ -427,11 +427,11 @@ class RegisterSet : public ValueObject { } } - bool ContainsCoreRegister(uint32_t id) { + bool ContainsCoreRegister(uint32_t id) const { return Contains(core_registers_, id); } - bool ContainsFloatingPointRegister(uint32_t id) { + bool ContainsFloatingPointRegister(uint32_t id) const { return Contains(floating_point_registers_, id); } diff --git a/compiler/optimizing/register_allocator.cc b/compiler/optimizing/register_allocator.cc index 7b23d020c2..72ddabe559 100644 --- a/compiler/optimizing/register_allocator.cc +++ b/compiler/optimizing/register_allocator.cc @@ -209,6 +209,8 @@ void RegisterAllocator::ProcessInstruction(HInstruction* instruction) { Location temp = locations->GetTemp(i); if (temp.IsRegister() || temp.IsFpuRegister()) { BlockRegister(temp, position, position + 1); + // Ensure that an explicit temporary register is marked as being allocated. + codegen_->AddAllocatedRegister(temp); } else { DCHECK(temp.IsUnallocated()); switch (temp.GetPolicy()) { @@ -507,6 +509,11 @@ bool RegisterAllocator::ValidateIntervals(const GrowableArray<LiveInterval*>& in } if (current->HasRegister()) { + if (kIsDebugBuild && log_fatal_on_failure && !current->IsFixed()) { + // Only check when an error is fatal. Only tests code ask for non-fatal failures + // and test code may not properly fill the right information to the code generator. + CHECK(codegen.HasAllocatedRegister(processing_core_registers, current->GetRegister())); + } BitVector* liveness_of_register = liveness_of_values.Get(current->GetRegister()); for (size_t j = it.CurrentRange()->GetStart(); j < it.CurrentRange()->GetEnd(); ++j) { if (liveness_of_register->IsBitSet(j)) { |