| 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/compiler/linkage.h" | 5 #include "src/compiler/linkage.h" |
| 6 #include "src/compiler/pipeline-statistics.h" | 6 #include "src/compiler/pipeline-statistics.h" |
| 7 #include "src/compiler/register-allocator.h" | 7 #include "src/compiler/register-allocator.h" |
| 8 #include "src/compiler/register-allocator-verifier.h" |
| 8 #include "src/string-stream.h" | 9 #include "src/string-stream.h" |
| 9 | 10 |
| 10 namespace v8 { | 11 namespace v8 { |
| 11 namespace internal { | 12 namespace internal { |
| 12 namespace compiler { | 13 namespace compiler { |
| 13 | 14 |
| 14 static inline LifetimePosition Min(LifetimePosition a, LifetimePosition b) { | 15 static inline LifetimePosition Min(LifetimePosition a, LifetimePosition b) { |
| 15 return a.Value() < b.Value() ? a : b; | 16 return a.Value() < b.Value() ? a : b; |
| 16 } | 17 } |
| 17 | 18 |
| (...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 | 1110 |
| 1110 // We use the phi-ness of some nodes in some later heuristics. | 1111 // We use the phi-ness of some nodes in some later heuristics. |
| 1111 live_range->set_is_phi(true); | 1112 live_range->set_is_phi(true); |
| 1112 if (!block->IsLoopHeader()) { | 1113 if (!block->IsLoopHeader()) { |
| 1113 live_range->set_is_non_loop_phi(true); | 1114 live_range->set_is_non_loop_phi(true); |
| 1114 } | 1115 } |
| 1115 } | 1116 } |
| 1116 } | 1117 } |
| 1117 | 1118 |
| 1118 | 1119 |
| 1119 bool RegisterAllocator::Allocate(PipelineStatistics* stats) { | 1120 bool RegisterAllocator::Allocate(PipelineStatistics* stats, |
| 1121 VerificationType verification_type) { |
| 1122 SmartPointer<Zone> verifier_zone; |
| 1123 RegisterAllocatorVerifier* verifier = NULL; |
| 1124 if (verification_type == kVerifyAssignment) { |
| 1125 // Don't track usage for this zone in compiler stats. |
| 1126 verifier_zone.Reset(new Zone(local_zone()->isolate())); |
| 1127 verifier = new (verifier_zone.get()) |
| 1128 RegisterAllocatorVerifier(verifier_zone.get(), code()); |
| 1129 } |
| 1120 assigned_registers_ = new (code_zone()) | 1130 assigned_registers_ = new (code_zone()) |
| 1121 BitVector(config()->num_general_registers(), code_zone()); | 1131 BitVector(config()->num_general_registers(), code_zone()); |
| 1122 assigned_double_registers_ = new (code_zone()) | 1132 assigned_double_registers_ = new (code_zone()) |
| 1123 BitVector(config()->num_aliased_double_registers(), code_zone()); | 1133 BitVector(config()->num_aliased_double_registers(), code_zone()); |
| 1124 { | 1134 { |
| 1125 PhaseScope phase_scope(stats, "meet register constraints"); | 1135 PhaseScope phase_scope(stats, "meet register constraints"); |
| 1126 MeetRegisterConstraints(); | 1136 MeetRegisterConstraints(); |
| 1127 } | 1137 } |
| 1128 if (!AllocationOk()) return false; | 1138 if (!AllocationOk()) return false; |
| 1129 { | 1139 { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1151 { | 1161 { |
| 1152 PhaseScope phase_scope(stats, "connect ranges"); | 1162 PhaseScope phase_scope(stats, "connect ranges"); |
| 1153 ConnectRanges(); | 1163 ConnectRanges(); |
| 1154 } | 1164 } |
| 1155 { | 1165 { |
| 1156 PhaseScope phase_scope(stats, "resolve control flow"); | 1166 PhaseScope phase_scope(stats, "resolve control flow"); |
| 1157 ResolveControlFlow(); | 1167 ResolveControlFlow(); |
| 1158 } | 1168 } |
| 1159 frame()->SetAllocatedRegisters(assigned_registers_); | 1169 frame()->SetAllocatedRegisters(assigned_registers_); |
| 1160 frame()->SetAllocatedDoubleRegisters(assigned_double_registers_); | 1170 frame()->SetAllocatedDoubleRegisters(assigned_double_registers_); |
| 1171 if (verifier != NULL) { |
| 1172 verifier->VerifyAssignment(); |
| 1173 } |
| 1161 return true; | 1174 return true; |
| 1162 } | 1175 } |
| 1163 | 1176 |
| 1164 | 1177 |
| 1165 void RegisterAllocator::MeetRegisterConstraints() { | 1178 void RegisterAllocator::MeetRegisterConstraints() { |
| 1166 for (auto block : code()->instruction_blocks()) { | 1179 for (auto block : code()->instruction_blocks()) { |
| 1167 MeetRegisterConstraints(block); | 1180 MeetRegisterConstraints(block); |
| 1168 if (!AllocationOk()) return; | 1181 if (!AllocationOk()) return; |
| 1169 } | 1182 } |
| 1170 } | 1183 } |
| (...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2318 } else { | 2331 } else { |
| 2319 DCHECK(range->Kind() == GENERAL_REGISTERS); | 2332 DCHECK(range->Kind() == GENERAL_REGISTERS); |
| 2320 assigned_registers_->Add(reg); | 2333 assigned_registers_->Add(reg); |
| 2321 } | 2334 } |
| 2322 range->set_assigned_register(reg, code_zone()); | 2335 range->set_assigned_register(reg, code_zone()); |
| 2323 } | 2336 } |
| 2324 | 2337 |
| 2325 } | 2338 } |
| 2326 } | 2339 } |
| 2327 } // namespace v8::internal::compiler | 2340 } // namespace v8::internal::compiler |
| OLD | NEW |