Chromium Code Reviews| Index: src/compiler/register-allocator.cc |
| diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc |
| index e65b9fffa212daf865b8b248e05b8e5514e50e5c..644fd21923ce4776238bec10fcbf264e63da7c4c 100644 |
| --- a/src/compiler/register-allocator.cc |
| +++ b/src/compiler/register-allocator.cc |
| @@ -5,6 +5,7 @@ |
| #include "src/compiler/linkage.h" |
| #include "src/compiler/pipeline-statistics.h" |
| #include "src/compiler/register-allocator.h" |
| +#include "src/macro-assembler.h" // TODO(dcarney): remove this. |
| #include "src/string-stream.h" |
| namespace v8 { |
| @@ -506,17 +507,33 @@ LifetimePosition LiveRange::FirstIntersection(LiveRange* other) { |
| } |
| -RegisterAllocator::RegisterAllocator(Zone* local_zone, Frame* frame, |
| - InstructionSequence* code, |
| +RegisterAllocator::Config RegisterAllocator::PlatformConfig() { |
| + DCHECK_EQ(Register::kMaxNumAllocatableRegisters, |
| + Register::NumAllocatableRegisters()); |
| + Config config; |
| + config.num_general_registers_ = Register::kMaxNumAllocatableRegisters; |
| + config.num_double_registers_ = DoubleRegister::kMaxNumAllocatableRegisters; |
| + config.num_aliased_double_registers_ = |
| + DoubleRegister::NumAllocatableAliasedRegisters(); |
| + config.GeneralRegisterName = Register::AllocationIndexToString; |
| + config.DoubleRegisterName = DoubleRegister::AllocationIndexToString; |
| + return config; |
| +} |
| + |
| + |
| +RegisterAllocator::RegisterAllocator(const Config& config, Zone* local_zone, |
| + Frame* frame, InstructionSequence* code, |
| const char* debug_name) |
| : zone_(local_zone), |
| frame_(frame), |
| code_(code), |
| debug_name_(debug_name), |
| + config_(config), |
| live_in_sets_(code->InstructionBlockCount(), zone()), |
| live_ranges_(code->VirtualRegisterCount() * 2, zone()), |
| - fixed_live_ranges_(NULL), |
| - fixed_double_live_ranges_(NULL), |
| + fixed_live_ranges_(this->config().num_general_registers_, NULL, zone()), |
| + fixed_double_live_ranges_(this->config().num_double_registers_, NULL, |
| + zone()), |
| unhandled_live_ranges_(code->VirtualRegisterCount() * 2, zone()), |
| active_live_ranges_(8, zone()), |
| inactive_live_ranges_(8, zone()), |
| @@ -579,7 +596,7 @@ void RegisterAllocator::AddInitialIntervals(const InstructionBlock* block, |
| int RegisterAllocator::FixedDoubleLiveRangeID(int index) { |
| - return -index - 1 - Register::kMaxNumAllocatableRegisters; |
| + return -index - 1 - config().num_general_registers_; |
| } |
| @@ -611,7 +628,7 @@ InstructionOperand* RegisterAllocator::AllocateFixed( |
| LiveRange* RegisterAllocator::FixedLiveRangeFor(int index) { |
| - DCHECK(index < Register::kMaxNumAllocatableRegisters); |
| + DCHECK(index < config().num_general_registers_); |
| LiveRange* result = fixed_live_ranges_[index]; |
| if (result == NULL) { |
| // TODO(titzer): add a utility method to allocate a new LiveRange: |
| @@ -629,7 +646,7 @@ LiveRange* RegisterAllocator::FixedLiveRangeFor(int index) { |
| LiveRange* RegisterAllocator::FixedDoubleLiveRangeFor(int index) { |
| - DCHECK(index < DoubleRegister::NumAllocatableAliasedRegisters()); |
| + DCHECK(index < config().num_aliased_double_registers_); |
| LiveRange* result = fixed_double_live_ranges_[index]; |
| if (result == NULL) { |
| result = new (zone()) LiveRange(FixedDoubleLiveRangeID(index), code_zone()); |
| @@ -1007,7 +1024,7 @@ void RegisterAllocator::ProcessInstructions(const InstructionBlock* block, |
| } |
| if (instr->ClobbersRegisters()) { |
| - for (int i = 0; i < Register::kMaxNumAllocatableRegisters; ++i) { |
| + for (int i = 0; i < config().num_general_registers_; ++i) { |
| if (!IsOutputRegisterOf(instr, i)) { |
| LiveRange* range = FixedLiveRangeFor(i); |
| range->AddUseInterval(curr_position, curr_position.InstructionEnd(), |
| @@ -1017,8 +1034,7 @@ void RegisterAllocator::ProcessInstructions(const InstructionBlock* block, |
| } |
| if (instr->ClobbersDoubleRegisters()) { |
| - for (int i = 0; i < DoubleRegister::NumAllocatableAliasedRegisters(); |
| - ++i) { |
| + for (int i = 0; i < config().num_aliased_double_registers_; ++i) { |
| if (!IsOutputDoubleRegisterOf(instr, i)) { |
| LiveRange* range = FixedDoubleLiveRangeFor(i); |
| range->AddUseInterval(curr_position, curr_position.InstructionEnd(), |
| @@ -1103,10 +1119,10 @@ void RegisterAllocator::ResolvePhis(const InstructionBlock* block) { |
| bool RegisterAllocator::Allocate(PipelineStatistics* stats) { |
| - assigned_registers_ = new (code_zone()) |
| - BitVector(Register::NumAllocatableRegisters(), code_zone()); |
| + assigned_registers_ = |
| + new (code_zone()) BitVector(config().num_general_registers_, code_zone()); |
| assigned_double_registers_ = new (code_zone()) |
| - BitVector(DoubleRegister::NumAllocatableAliasedRegisters(), code_zone()); |
| + BitVector(config().num_aliased_double_registers_, code_zone()); |
| { |
| PhaseScope phase_scope(stats, "meet register constraints"); |
| MeetRegisterConstraints(); |
| @@ -1235,8 +1251,8 @@ const InstructionBlock* RegisterAllocator::GetInstructionBlock( |
| void RegisterAllocator::ConnectRanges() { |
| - for (int i = 0; i < live_ranges()->length(); ++i) { |
| - LiveRange* first_range = live_ranges()->at(i); |
| + for (int i = 0; i < live_ranges().length(); ++i) { |
| + LiveRange* first_range = live_ranges().at(i); |
| if (first_range == NULL || first_range->parent() != NULL) continue; |
| LiveRange* second_range = first_range->next(); |
| @@ -1437,8 +1453,8 @@ void RegisterAllocator::PopulatePointerMaps() { |
| int last_range_start = 0; |
| const PointerMapDeque* pointer_maps = code()->pointer_maps(); |
| PointerMapDeque::const_iterator first_it = pointer_maps->begin(); |
| - for (int range_idx = 0; range_idx < live_ranges()->length(); ++range_idx) { |
| - LiveRange* range = live_ranges()->at(range_idx); |
| + for (int range_idx = 0; range_idx < live_ranges().length(); ++range_idx) { |
| + LiveRange* range = live_ranges().at(range_idx); |
| if (range == NULL) continue; |
| // Iterate over the first parts of multi-part live ranges. |
| if (range->parent() != NULL) continue; |
| @@ -1512,14 +1528,14 @@ void RegisterAllocator::PopulatePointerMaps() { |
| void RegisterAllocator::AllocateGeneralRegisters() { |
| - num_registers_ = Register::NumAllocatableRegisters(); |
| + num_registers_ = config().num_general_registers_; |
| mode_ = GENERAL_REGISTERS; |
| AllocateRegisters(); |
| } |
| void RegisterAllocator::AllocateDoubleRegisters() { |
| - num_registers_ = DoubleRegister::NumAllocatableAliasedRegisters(); |
| + num_registers_ = config().num_aliased_double_registers_; |
| mode_ = DOUBLE_REGISTERS; |
| AllocateRegisters(); |
| } |
| @@ -1543,7 +1559,7 @@ void RegisterAllocator::AllocateRegisters() { |
| DCHECK(inactive_live_ranges_.is_empty()); |
| if (mode_ == DOUBLE_REGISTERS) { |
| - for (int i = 0; i < DoubleRegister::NumAllocatableAliasedRegisters(); ++i) { |
| + for (int i = 0; i < config().num_aliased_double_registers_; ++i) { |
| LiveRange* current = fixed_double_live_ranges_.at(i); |
| if (current != NULL) { |
| AddToInactive(current); |
| @@ -1551,8 +1567,7 @@ void RegisterAllocator::AllocateRegisters() { |
| } |
| } else { |
| DCHECK(mode_ == GENERAL_REGISTERS); |
| - for (int i = 0; i < fixed_live_ranges_.length(); ++i) { |
| - LiveRange* current = fixed_live_ranges_.at(i); |
| + for (auto current : fixed_live_ranges()) { |
| if (current != NULL) { |
| AddToInactive(current); |
| } |
| @@ -1636,9 +1651,9 @@ void RegisterAllocator::AllocateRegisters() { |
| const char* RegisterAllocator::RegisterName(int allocation_index) { |
| if (mode_ == GENERAL_REGISTERS) { |
| - return Register::AllocationIndexToString(allocation_index); |
| + return config().GeneralRegisterName(allocation_index); |
| } else { |
| - return DoubleRegister::AllocationIndexToString(allocation_index); |
| + return config().DoubleRegisterName(allocation_index); |
| } |
| } |
| @@ -1782,14 +1797,11 @@ void RegisterAllocator::InactiveToActive(LiveRange* range) { |
| } |
| -// TryAllocateFreeReg and AllocateBlockedReg assume this |
| -// when allocating local arrays. |
| -STATIC_ASSERT(DoubleRegister::kMaxNumAllocatableRegisters >= |
| - Register::kMaxNumAllocatableRegisters); |
| - |
| - |
| bool RegisterAllocator::TryAllocateFreeReg(LiveRange* current) { |
| - LifetimePosition free_until_pos[DoubleRegister::kMaxNumAllocatableRegisters]; |
| + DCHECK(config().num_double_registers_ >= config().num_general_registers_); |
| + // TODO(dcarney): ensure this function in non recursive and allocate space for |
| + // this in RegisterAllocator. |
| + LifetimePosition free_until_pos[kMaxDoubleRegisters]; |
| for (int i = 0; i < num_registers_; i++) { |
| free_until_pos[i] = LifetimePosition::MaxPosition(); |
| @@ -1864,6 +1876,7 @@ bool RegisterAllocator::TryAllocateFreeReg(LiveRange* current) { |
| void RegisterAllocator::AllocateBlockedReg(LiveRange* current) { |
| + DCHECK(config().num_double_registers_ >= config().num_general_registers_); |
| UsePosition* register_use = current->NextRegisterPosition(current->Start()); |
| if (register_use == NULL) { |
| // There is no use in the current live range that requires a register. |
| @@ -1872,9 +1885,12 @@ void RegisterAllocator::AllocateBlockedReg(LiveRange* current) { |
| return; |
| } |
| - |
| - LifetimePosition use_pos[DoubleRegister::kMaxNumAllocatableRegisters]; |
| - LifetimePosition block_pos[DoubleRegister::kMaxNumAllocatableRegisters]; |
| + // TODO(dcarney): ensure this function in non recursive and allocate space for |
| + // this in RegisterAllocator. |
|
Jarin
2014/10/29 17:37:43
Why would you want this to be allocated RegisterAl
|
| + LifetimePosition use_pos[kMaxGeneralRegisters]; |
| + // TODO(dcarney): ensure this function in non recursive and allocate space for |
| + // this in RegisterAllocator. |
| + LifetimePosition block_pos[kMaxDoubleRegisters]; |
| for (int i = 0; i < num_registers_; i++) { |
| use_pos[i] = block_pos[i] = LifetimePosition::MaxPosition(); |
| @@ -2187,8 +2203,7 @@ int RegisterAllocator::RegisterCount() const { return num_registers_; } |
| void RegisterAllocator::Verify() const { |
| - for (int i = 0; i < live_ranges()->length(); ++i) { |
| - LiveRange* current = live_ranges()->at(i); |
| + for (auto current : live_ranges()) { |
| if (current != NULL) current->Verify(); |
| } |
| } |