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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 splitting_pointer_(nullptr), | 265 splitting_pointer_(nullptr), |
266 size_(kInvalidSize), | 266 size_(kInvalidSize), |
267 weight_(kInvalidWeight), | 267 weight_(kInvalidWeight), |
268 group_(nullptr) { | 268 group_(nullptr) { |
269 DCHECK(AllocatedOperand::IsSupportedRepresentation(rep)); | 269 DCHECK(AllocatedOperand::IsSupportedRepresentation(rep)); |
270 bits_ = AssignedRegisterField::encode(kUnassignedRegister) | | 270 bits_ = AssignedRegisterField::encode(kUnassignedRegister) | |
271 RepresentationField::encode(rep); | 271 RepresentationField::encode(rep); |
272 } | 272 } |
273 | 273 |
274 | 274 |
275 void LiveRange::Verify() const { | 275 void LiveRange::VerifyPositions() const { |
276 // Walk the positions, verifying that each is in an interval. | 276 // Walk the positions, verifying that each is in an interval. |
277 auto interval = first_interval_; | 277 auto interval = first_interval_; |
278 for (auto pos = first_pos_; pos != nullptr; pos = pos->next()) { | 278 for (auto pos = first_pos_; pos != nullptr; pos = pos->next()) { |
279 CHECK(Start() <= pos->pos()); | 279 CHECK(Start() <= pos->pos()); |
280 CHECK(pos->pos() <= End()); | 280 CHECK(pos->pos() <= End()); |
281 CHECK(interval != nullptr); | 281 CHECK(interval != nullptr); |
282 while (!interval->Contains(pos->pos()) && interval->end() != pos->pos()) { | 282 while (!interval->Contains(pos->pos()) && interval->end() != pos->pos()) { |
283 interval = interval->next(); | 283 interval = interval->next(); |
284 CHECK(interval != nullptr); | 284 CHECK(interval != nullptr); |
285 } | 285 } |
286 } | 286 } |
287 } | 287 } |
288 | 288 |
289 | 289 |
| 290 void LiveRange::VerifyIntervals() const { |
| 291 DCHECK(first_interval()->start() == Start()); |
| 292 LifetimePosition last_end = first_interval()->end(); |
| 293 for (UseInterval* interval = first_interval()->next(); interval != nullptr; |
| 294 interval = interval->next()) { |
| 295 DCHECK(last_end <= interval->start()); |
| 296 last_end = interval->end(); |
| 297 } |
| 298 DCHECK(last_end == End()); |
| 299 } |
| 300 |
| 301 |
290 void LiveRange::set_assigned_register(int reg) { | 302 void LiveRange::set_assigned_register(int reg) { |
291 DCHECK(!HasRegisterAssigned() && !spilled()); | 303 DCHECK(!HasRegisterAssigned() && !spilled()); |
292 bits_ = AssignedRegisterField::update(bits_, reg); | 304 bits_ = AssignedRegisterField::update(bits_, reg); |
293 } | 305 } |
294 | 306 |
295 | 307 |
296 void LiveRange::UnsetAssignedRegister() { | 308 void LiveRange::UnsetAssignedRegister() { |
297 DCHECK(HasRegisterAssigned() && !spilled()); | 309 DCHECK(HasRegisterAssigned() && !spilled()); |
298 bits_ = AssignedRegisterField::update(bits_, kUnassignedRegister); | 310 bits_ = AssignedRegisterField::update(bits_, kUnassignedRegister); |
299 } | 311 } |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 // Discard cached iteration state. It might be pointing | 532 // Discard cached iteration state. It might be pointing |
521 // to the use that no longer belongs to this live range. | 533 // to the use that no longer belongs to this live range. |
522 last_processed_use_ = nullptr; | 534 last_processed_use_ = nullptr; |
523 current_interval_ = nullptr; | 535 current_interval_ = nullptr; |
524 | 536 |
525 // Invalidate size and weight of this range. The child range has them | 537 // Invalidate size and weight of this range. The child range has them |
526 // invalid at construction. | 538 // invalid at construction. |
527 size_ = kInvalidSize; | 539 size_ = kInvalidSize; |
528 weight_ = kInvalidWeight; | 540 weight_ = kInvalidWeight; |
529 #ifdef DEBUG | 541 #ifdef DEBUG |
530 Verify(); | 542 VerifyChildStructure(); |
531 result->Verify(); | 543 result->VerifyChildStructure(); |
532 #endif | 544 #endif |
533 return use_before; | 545 return use_before; |
534 } | 546 } |
535 | 547 |
536 | 548 |
537 void LiveRange::AppendAsChild(TopLevelLiveRange* other) { | 549 void LiveRange::AppendAsChild(TopLevelLiveRange* other) { |
538 next_ = other; | 550 next_ = other; |
539 | 551 |
540 other->UpdateParentForAllChildren(TopLevel()); | 552 other->UpdateParentForAllChildren(TopLevel()); |
541 TopLevel()->UpdateSpillRangePostMerge(other); | 553 TopLevel()->UpdateSpillRangePostMerge(other); |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 | 951 |
940 TopLevel()->UpdateParentForAllChildren(TopLevel()); | 952 TopLevel()->UpdateParentForAllChildren(TopLevel()); |
941 TopLevel()->UpdateSpillRangePostMerge(other); | 953 TopLevel()->UpdateSpillRangePostMerge(other); |
942 | 954 |
943 #if DEBUG | 955 #if DEBUG |
944 Verify(); | 956 Verify(); |
945 #endif | 957 #endif |
946 } | 958 } |
947 | 959 |
948 | 960 |
| 961 void TopLevelLiveRange::VerifyChildrenInOrder() const { |
| 962 LifetimePosition last_end = End(); |
| 963 for (const LiveRange* child = this->next(); child != nullptr; |
| 964 child = child->next()) { |
| 965 DCHECK(last_end <= child->Start()); |
| 966 last_end = child->End(); |
| 967 } |
| 968 } |
| 969 |
| 970 |
| 971 void TopLevelLiveRange::Verify() const { |
| 972 VerifyChildrenInOrder(); |
| 973 for (const LiveRange* child = this; child != nullptr; child = child->next()) { |
| 974 VerifyChildStructure(); |
| 975 } |
| 976 } |
| 977 |
| 978 |
949 void TopLevelLiveRange::ShortenTo(LifetimePosition start) { | 979 void TopLevelLiveRange::ShortenTo(LifetimePosition start) { |
950 TRACE("Shorten live range %d to [%d\n", vreg(), start.value()); | 980 TRACE("Shorten live range %d to [%d\n", vreg(), start.value()); |
951 DCHECK(first_interval_ != nullptr); | 981 DCHECK(first_interval_ != nullptr); |
952 DCHECK(first_interval_->start() <= start); | 982 DCHECK(first_interval_->start() <= start); |
953 DCHECK(start < first_interval_->end()); | 983 DCHECK(start < first_interval_->end()); |
954 first_interval_->set_start(start); | 984 first_interval_->set_start(start); |
955 } | 985 } |
956 | 986 |
957 | 987 |
958 void TopLevelLiveRange::EnsureInterval(LifetimePosition start, | 988 void TopLevelLiveRange::EnsureInterval(LifetimePosition start, |
(...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2186 if (it == phi_hints_.end()) return; | 2216 if (it == phi_hints_.end()) return; |
2187 DCHECK(!it->second->IsResolved()); | 2217 DCHECK(!it->second->IsResolved()); |
2188 it->second->ResolveHint(use_pos); | 2218 it->second->ResolveHint(use_pos); |
2189 } | 2219 } |
2190 | 2220 |
2191 | 2221 |
2192 void LiveRangeBuilder::Verify() const { | 2222 void LiveRangeBuilder::Verify() const { |
2193 for (auto& hint : phi_hints_) { | 2223 for (auto& hint : phi_hints_) { |
2194 CHECK(hint.second->IsResolved()); | 2224 CHECK(hint.second->IsResolved()); |
2195 } | 2225 } |
2196 for (LiveRange* current : data()->live_ranges()) { | 2226 for (TopLevelLiveRange* current : data()->live_ranges()) { |
2197 if (current != nullptr) current->Verify(); | 2227 if (current != nullptr && !current->IsEmpty()) current->Verify(); |
2198 } | 2228 } |
2199 } | 2229 } |
2200 | 2230 |
2201 | 2231 |
2202 RegisterAllocator::RegisterAllocator(RegisterAllocationData* data, | 2232 RegisterAllocator::RegisterAllocator(RegisterAllocationData* data, |
2203 RegisterKind kind) | 2233 RegisterKind kind) |
2204 : data_(data), | 2234 : data_(data), |
2205 mode_(kind), | 2235 mode_(kind), |
2206 num_registers_(GetRegisterCount(data->config(), kind)), | 2236 num_registers_(GetRegisterCount(data->config(), kind)), |
2207 num_allocatable_registers_( | 2237 num_allocatable_registers_( |
(...skipping 1241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3449 auto eliminate = moves->PrepareInsertAfter(move); | 3479 auto eliminate = moves->PrepareInsertAfter(move); |
3450 to_insert.push_back(move); | 3480 to_insert.push_back(move); |
3451 if (eliminate != nullptr) to_eliminate.push_back(eliminate); | 3481 if (eliminate != nullptr) to_eliminate.push_back(eliminate); |
3452 } | 3482 } |
3453 } | 3483 } |
3454 | 3484 |
3455 | 3485 |
3456 } // namespace compiler | 3486 } // namespace compiler |
3457 } // namespace internal | 3487 } // namespace internal |
3458 } // namespace v8 | 3488 } // namespace v8 |
OLD | NEW |