OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/base/adapters.h" | 5 #include "src/base/adapters.h" |
6 #include "src/compiler/linkage.h" | 6 #include "src/compiler/linkage.h" |
7 #include "src/compiler/register-allocator.h" | 7 #include "src/compiler/register-allocator.h" |
8 #include "src/string-stream.h" | 8 #include "src/string-stream.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 1382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1393 | 1393 |
1394 RegisterAllocationData::RegisterAllocationData( | 1394 RegisterAllocationData::RegisterAllocationData( |
1395 const RegisterConfiguration* config, Zone* zone, Frame* frame, | 1395 const RegisterConfiguration* config, Zone* zone, Frame* frame, |
1396 InstructionSequence* code, const char* debug_name) | 1396 InstructionSequence* code, const char* debug_name) |
1397 : allocation_zone_(zone), | 1397 : allocation_zone_(zone), |
1398 frame_(frame), | 1398 frame_(frame), |
1399 code_(code), | 1399 code_(code), |
1400 debug_name_(debug_name), | 1400 debug_name_(debug_name), |
1401 config_(config), | 1401 config_(config), |
1402 phi_map_(allocation_zone()), | 1402 phi_map_(allocation_zone()), |
1403 allocatable_codes_(this->config()->num_general_registers(), -1, | |
1404 allocation_zone()), | |
1405 allocatable_double_codes_(this->config()->num_double_registers(), -1, | |
1406 allocation_zone()), | |
1407 live_in_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), | 1403 live_in_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), |
1408 live_out_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), | 1404 live_out_sets_(code->InstructionBlockCount(), nullptr, allocation_zone()), |
1409 live_ranges_(code->VirtualRegisterCount() * 2, nullptr, | 1405 live_ranges_(code->VirtualRegisterCount() * 2, nullptr, |
1410 allocation_zone()), | 1406 allocation_zone()), |
1411 fixed_live_ranges_(this->config()->num_general_registers(), nullptr, | 1407 fixed_live_ranges_(this->config()->num_general_registers(), nullptr, |
1412 allocation_zone()), | 1408 allocation_zone()), |
1413 fixed_double_live_ranges_(this->config()->num_double_registers(), nullptr, | 1409 fixed_double_live_ranges_(this->config()->num_double_registers(), nullptr, |
1414 allocation_zone()), | 1410 allocation_zone()), |
1415 spill_ranges_(code->VirtualRegisterCount(), nullptr, allocation_zone()), | 1411 spill_ranges_(code->VirtualRegisterCount(), nullptr, allocation_zone()), |
1416 delayed_references_(allocation_zone()), | 1412 delayed_references_(allocation_zone()), |
1417 assigned_registers_(nullptr), | 1413 assigned_registers_(nullptr), |
1418 assigned_double_registers_(nullptr), | 1414 assigned_double_registers_(nullptr), |
1419 virtual_register_count_(code->VirtualRegisterCount()), | 1415 virtual_register_count_(code->VirtualRegisterCount()), |
1420 preassigned_slot_ranges_(zone) { | 1416 preassigned_slot_ranges_(zone) { |
1421 DCHECK(this->config()->num_general_registers() <= | |
1422 RegisterConfiguration::kMaxGeneralRegisters); | |
1423 DCHECK(this->config()->num_double_registers() <= | |
1424 RegisterConfiguration::kMaxDoubleRegisters); | |
1425 assigned_registers_ = new (code_zone()) | 1417 assigned_registers_ = new (code_zone()) |
1426 BitVector(this->config()->num_general_registers(), code_zone()); | 1418 BitVector(this->config()->num_general_registers(), code_zone()); |
1427 assigned_double_registers_ = new (code_zone()) | 1419 assigned_double_registers_ = new (code_zone()) |
1428 BitVector(this->config()->num_double_registers(), code_zone()); | 1420 BitVector(this->config()->num_double_registers(), code_zone()); |
1429 this->frame()->SetAllocatedRegisters(assigned_registers_); | 1421 this->frame()->SetAllocatedRegisters(assigned_registers_); |
1430 this->frame()->SetAllocatedDoubleRegisters(assigned_double_registers_); | 1422 this->frame()->SetAllocatedDoubleRegisters(assigned_double_registers_); |
1431 } | 1423 } |
1432 | 1424 |
1433 | 1425 |
1434 MoveOperands* RegisterAllocationData::AddGapMove( | 1426 MoveOperands* RegisterAllocationData::AddGapMove( |
(...skipping 1174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2609 : RegisterAllocator(data, kind), | 2601 : RegisterAllocator(data, kind), |
2610 unhandled_live_ranges_(local_zone), | 2602 unhandled_live_ranges_(local_zone), |
2611 active_live_ranges_(local_zone), | 2603 active_live_ranges_(local_zone), |
2612 inactive_live_ranges_(local_zone) { | 2604 inactive_live_ranges_(local_zone) { |
2613 unhandled_live_ranges().reserve( | 2605 unhandled_live_ranges().reserve( |
2614 static_cast<size_t>(code()->VirtualRegisterCount() * 2)); | 2606 static_cast<size_t>(code()->VirtualRegisterCount() * 2)); |
2615 active_live_ranges().reserve(8); | 2607 active_live_ranges().reserve(8); |
2616 inactive_live_ranges().reserve(8); | 2608 inactive_live_ranges().reserve(8); |
2617 // TryAllocateFreeReg and AllocateBlockedReg assume this | 2609 // TryAllocateFreeReg and AllocateBlockedReg assume this |
2618 // when allocating local arrays. | 2610 // when allocating local arrays. |
2619 DCHECK(RegisterConfiguration::kMaxDoubleRegisters >= | 2611 DCHECK(RegisterConfiguration::kMaxFPRegisters >= |
2620 this->data()->config()->num_general_registers()); | 2612 this->data()->config()->num_general_registers()); |
2621 } | 2613 } |
2622 | 2614 |
2623 | 2615 |
2624 void LinearScanAllocator::AllocateRegisters() { | 2616 void LinearScanAllocator::AllocateRegisters() { |
2625 DCHECK(unhandled_live_ranges().empty()); | 2617 DCHECK(unhandled_live_ranges().empty()); |
2626 DCHECK(active_live_ranges().empty()); | 2618 DCHECK(active_live_ranges().empty()); |
2627 DCHECK(inactive_live_ranges().empty()); | 2619 DCHECK(inactive_live_ranges().empty()); |
2628 | 2620 |
2629 SplitAndSpillRangesDefinedByMemoryOperand(code()->VirtualRegisterCount() <= | 2621 SplitAndSpillRangesDefinedByMemoryOperand(code()->VirtualRegisterCount() <= |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2806 | 2798 |
2807 void LinearScanAllocator::InactiveToActive(LiveRange* range) { | 2799 void LinearScanAllocator::InactiveToActive(LiveRange* range) { |
2808 RemoveElement(&inactive_live_ranges(), range); | 2800 RemoveElement(&inactive_live_ranges(), range); |
2809 active_live_ranges().push_back(range); | 2801 active_live_ranges().push_back(range); |
2810 TRACE("Moving live range %d:%d from inactive to active\n", | 2802 TRACE("Moving live range %d:%d from inactive to active\n", |
2811 range->TopLevel()->vreg(), range->relative_id()); | 2803 range->TopLevel()->vreg(), range->relative_id()); |
2812 } | 2804 } |
2813 | 2805 |
2814 | 2806 |
2815 bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { | 2807 bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
2816 LifetimePosition free_until_pos[RegisterConfiguration::kMaxDoubleRegisters]; | 2808 LifetimePosition free_until_pos[RegisterConfiguration::kMaxFPRegisters]; |
2817 | 2809 |
2818 for (int i = 0; i < num_registers(); i++) { | 2810 for (int i = 0; i < num_registers(); i++) { |
2819 free_until_pos[i] = LifetimePosition::MaxPosition(); | 2811 free_until_pos[i] = LifetimePosition::MaxPosition(); |
2820 } | 2812 } |
2821 | 2813 |
2822 for (LiveRange* cur_active : active_live_ranges()) { | 2814 for (LiveRange* cur_active : active_live_ranges()) { |
2823 free_until_pos[cur_active->assigned_register()] = | 2815 free_until_pos[cur_active->assigned_register()] = |
2824 LifetimePosition::GapFromInstructionIndex(0); | 2816 LifetimePosition::GapFromInstructionIndex(0); |
2825 TRACE("Register %s is free until pos %d (1)\n", | 2817 TRACE("Register %s is free until pos %d (1)\n", |
2826 RegisterName(cur_active->assigned_register()), | 2818 RegisterName(cur_active->assigned_register()), |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2892 | 2884 |
2893 void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { | 2885 void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
2894 UsePosition* register_use = current->NextRegisterPosition(current->Start()); | 2886 UsePosition* register_use = current->NextRegisterPosition(current->Start()); |
2895 if (register_use == nullptr) { | 2887 if (register_use == nullptr) { |
2896 // There is no use in the current live range that requires a register. | 2888 // There is no use in the current live range that requires a register. |
2897 // We can just spill it. | 2889 // We can just spill it. |
2898 Spill(current); | 2890 Spill(current); |
2899 return; | 2891 return; |
2900 } | 2892 } |
2901 | 2893 |
2902 LifetimePosition use_pos[RegisterConfiguration::kMaxDoubleRegisters]; | 2894 LifetimePosition use_pos[RegisterConfiguration::kMaxFPRegisters]; |
2903 LifetimePosition block_pos[RegisterConfiguration::kMaxDoubleRegisters]; | 2895 LifetimePosition block_pos[RegisterConfiguration::kMaxFPRegisters]; |
2904 | 2896 |
2905 for (int i = 0; i < num_registers(); i++) { | 2897 for (int i = 0; i < num_registers(); i++) { |
2906 use_pos[i] = block_pos[i] = LifetimePosition::MaxPosition(); | 2898 use_pos[i] = block_pos[i] = LifetimePosition::MaxPosition(); |
2907 } | 2899 } |
2908 | 2900 |
2909 for (LiveRange* range : active_live_ranges()) { | 2901 for (LiveRange* range : active_live_ranges()) { |
2910 int cur_reg = range->assigned_register(); | 2902 int cur_reg = range->assigned_register(); |
2911 if (range->TopLevel()->IsFixed() || | 2903 if (range->TopLevel()->IsFixed() || |
2912 !range->CanBeSpilled(current->Start())) { | 2904 !range->CanBeSpilled(current->Start())) { |
2913 block_pos[cur_reg] = use_pos[cur_reg] = | 2905 block_pos[cur_reg] = use_pos[cur_reg] = |
(...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3667 } | 3659 } |
3668 } | 3660 } |
3669 } | 3661 } |
3670 } | 3662 } |
3671 } | 3663 } |
3672 | 3664 |
3673 | 3665 |
3674 } // namespace compiler | 3666 } // namespace compiler |
3675 } // namespace internal | 3667 } // namespace internal |
3676 } // namespace v8 | 3668 } // namespace v8 |
OLD | NEW |