diff options
author | 2014-12-18 17:46:12 +0000 | |
---|---|---|
committer | 2014-12-18 17:46:13 +0000 | |
commit | 6048838af46f41c08c4132ba242040dc49bd5f23 (patch) | |
tree | 5124300bf9a7106d534e126b1926cc9d787ae2dc /compiler/optimizing/code_generator.cc | |
parent | ca747ea9951188dbc6f5217d49aca34aeadcc2a6 (diff) | |
parent | 5b4b898ed8725242ee6b7229b94467c3ea3054c8 (diff) |
Merge "Revert "Don't block quick callee saved registers for optimizing.""
Diffstat (limited to 'compiler/optimizing/code_generator.cc')
-rw-r--r-- | compiler/optimizing/code_generator.cc | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index b3e99f9c0f..6f424ce11d 100644 --- a/compiler/optimizing/code_generator.cc +++ b/compiler/optimizing/code_generator.cc @@ -177,31 +177,6 @@ int32_t CodeGenerator::GetStackSlot(HLocal* local) const { } } -void CodeGenerator::MaybeBlockPhysicalRegisters(Location loc, bool is_output) const { - // The DCHECKS below check that a register is not specified twice in - // the summary. - // Note that fixed output registers are allowed to overlap with fixed input and - // temp registers: the writer of the location summary has to make sure they - // don't conflict with each other. - if (loc.IsRegister()) { - DCHECK(is_output || !blocked_core_registers_[loc.reg()]); - blocked_core_registers_[loc.reg()] = true; - } else if (loc.IsFpuRegister()) { - DCHECK(is_output || !blocked_fpu_registers_[loc.reg()]); - blocked_fpu_registers_[loc.reg()] = true; - } else if (loc.IsFpuRegisterPair()) { - DCHECK(is_output || !blocked_fpu_registers_[loc.AsFpuRegisterPairLow<int>()]); - blocked_fpu_registers_[loc.AsFpuRegisterPairLow<int>()] = true; - DCHECK(is_output || !blocked_fpu_registers_[loc.AsFpuRegisterPairHigh<int>()]); - blocked_fpu_registers_[loc.AsFpuRegisterPairHigh<int>()] = true; - } else if (loc.IsRegisterPair()) { - DCHECK(is_output || !blocked_core_registers_[loc.AsRegisterPairLow<int>()]); - blocked_core_registers_[loc.AsRegisterPairLow<int>()] = true; - DCHECK(is_output || !blocked_core_registers_[loc.AsRegisterPairHigh<int>()]); - blocked_core_registers_[loc.AsRegisterPairHigh<int>()] = true; - } -} - void CodeGenerator::AllocateRegistersLocally(HInstruction* instruction) const { LocationSummary* locations = instruction->GetLocations(); if (locations == nullptr) return; @@ -221,18 +196,43 @@ void CodeGenerator::AllocateRegistersLocally(HInstruction* instruction) const { // Mark all fixed input, temp and output registers as used. for (size_t i = 0, e = locations->GetInputCount(); i < e; ++i) { Location loc = locations->InAt(i); - MaybeBlockPhysicalRegisters(loc, false); + // The DCHECKS below check that a register is not specified twice in + // the summary. + if (loc.IsRegister()) { + DCHECK(!blocked_core_registers_[loc.reg()]); + blocked_core_registers_[loc.reg()] = true; + } else if (loc.IsFpuRegister()) { + DCHECK(!blocked_fpu_registers_[loc.reg()]); + blocked_fpu_registers_[loc.reg()] = true; + } else if (loc.IsFpuRegisterPair()) { + DCHECK(!blocked_fpu_registers_[loc.AsFpuRegisterPairLow<int>()]); + blocked_fpu_registers_[loc.AsFpuRegisterPairLow<int>()] = true; + DCHECK(!blocked_fpu_registers_[loc.AsFpuRegisterPairHigh<int>()]); + blocked_fpu_registers_[loc.AsFpuRegisterPairHigh<int>()] = true; + } else if (loc.IsRegisterPair()) { + DCHECK(!blocked_core_registers_[loc.AsRegisterPairLow<int>()]); + blocked_core_registers_[loc.AsRegisterPairLow<int>()] = true; + DCHECK(!blocked_core_registers_[loc.AsRegisterPairHigh<int>()]); + blocked_core_registers_[loc.AsRegisterPairHigh<int>()] = true; + } } for (size_t i = 0, e = locations->GetTempCount(); i < e; ++i) { Location loc = locations->GetTemp(i); - MaybeBlockPhysicalRegisters(loc, false); + // The DCHECKS below check that a register is not specified twice in + // the summary. + if (loc.IsRegister()) { + DCHECK(!blocked_core_registers_[loc.reg()]); + blocked_core_registers_[loc.reg()] = true; + } else if (loc.IsFpuRegister()) { + DCHECK(!blocked_fpu_registers_[loc.reg()]); + blocked_fpu_registers_[loc.reg()] = true; + } else { + DCHECK(loc.GetPolicy() == Location::kRequiresRegister + || loc.GetPolicy() == Location::kRequiresFpuRegister); + } } - // If the output is a fixed register, mark it as used. - Location result_location = locations->Out(); - MaybeBlockPhysicalRegisters(result_location, true); - SetupBlockedRegisters(); // Allocate all unallocated input locations. @@ -276,11 +276,9 @@ void CodeGenerator::AllocateRegistersLocally(HInstruction* instruction) const { << loc.GetPolicy(); } locations->SetTempAt(i, loc); - } else { - DCHECK(loc.IsFpuRegister() || loc.IsRegister()); } } - + Location result_location = locations->Out(); if (result_location.IsUnallocated()) { switch (result_location.GetPolicy()) { case Location::kAny: |