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