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 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 : relative_id_(relative_id), | 259 : relative_id_(relative_id), |
260 bits_(0), | 260 bits_(0), |
261 last_interval_(nullptr), | 261 last_interval_(nullptr), |
262 first_interval_(nullptr), | 262 first_interval_(nullptr), |
263 first_pos_(nullptr), | 263 first_pos_(nullptr), |
264 top_level_(top_level), | 264 top_level_(top_level), |
265 next_(nullptr), | 265 next_(nullptr), |
266 current_interval_(nullptr), | 266 current_interval_(nullptr), |
267 last_processed_use_(nullptr), | 267 last_processed_use_(nullptr), |
268 current_hint_position_(nullptr), | 268 current_hint_position_(nullptr), |
| 269 splitting_pointer_(nullptr), |
269 size_(kInvalidSize), | 270 size_(kInvalidSize), |
270 weight_(kInvalidWeight), | 271 weight_(kInvalidWeight), |
271 group_(nullptr) { | 272 group_(nullptr) { |
272 DCHECK(AllocatedOperand::IsSupportedMachineType(machine_type)); | 273 DCHECK(AllocatedOperand::IsSupportedMachineType(machine_type)); |
273 bits_ = AssignedRegisterField::encode(kUnassignedRegister) | | 274 bits_ = AssignedRegisterField::encode(kUnassignedRegister) | |
274 MachineTypeField::encode(machine_type); | 275 MachineTypeField::encode(machine_type); |
275 } | 276 } |
276 | 277 |
277 | 278 |
278 void LiveRange::Verify() const { | 279 void LiveRange::Verify() const { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 child->top_level_ = TopLevel(); | 449 child->top_level_ = TopLevel(); |
449 child->next_ = next_; | 450 child->next_ = next_; |
450 next_ = child; | 451 next_ = child; |
451 if (child->next() == nullptr) { | 452 if (child->next() == nullptr) { |
452 TopLevel()->set_last_child(child); | 453 TopLevel()->set_last_child(child); |
453 } | 454 } |
454 return child; | 455 return child; |
455 } | 456 } |
456 | 457 |
457 | 458 |
458 void LiveRange::DetachAt(LifetimePosition position, LiveRange* result, | 459 UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result, |
459 Zone* zone) { | 460 Zone* zone) { |
460 DCHECK(Start() < position); | 461 DCHECK(Start() < position); |
461 DCHECK(End() > position); | 462 DCHECK(End() > position); |
462 DCHECK(result->IsEmpty()); | 463 DCHECK(result->IsEmpty()); |
463 // Find the last interval that ends before the position. If the | 464 // Find the last interval that ends before the position. If the |
464 // position is contained in one of the intervals in the chain, we | 465 // position is contained in one of the intervals in the chain, we |
465 // split that interval and use the first part. | 466 // split that interval and use the first part. |
466 auto current = FirstSearchIntervalForPosition(position); | 467 auto current = FirstSearchIntervalForPosition(position); |
467 | 468 |
468 // If the split position coincides with the beginning of a use interval | 469 // If the split position coincides with the beginning of a use interval |
469 // we need to split use positons in a special way. | 470 // we need to split use positons in a special way. |
(...skipping 25 matching lines...) Expand all Loading... |
495 auto before = current; | 496 auto before = current; |
496 result->last_interval_ = | 497 result->last_interval_ = |
497 (last_interval_ == before) | 498 (last_interval_ == before) |
498 ? after // Only interval in the range after split. | 499 ? after // Only interval in the range after split. |
499 : last_interval_; // Last interval of the original range. | 500 : last_interval_; // Last interval of the original range. |
500 result->first_interval_ = after; | 501 result->first_interval_ = after; |
501 last_interval_ = before; | 502 last_interval_ = before; |
502 | 503 |
503 // Find the last use position before the split and the first use | 504 // Find the last use position before the split and the first use |
504 // position after it. | 505 // position after it. |
505 auto use_after = first_pos_; | 506 auto use_after = |
| 507 splitting_pointer_ == nullptr || splitting_pointer_->pos() > position |
| 508 ? first_pos() |
| 509 : splitting_pointer_; |
506 UsePosition* use_before = nullptr; | 510 UsePosition* use_before = nullptr; |
507 if (split_at_start) { | 511 if (split_at_start) { |
508 // The split position coincides with the beginning of a use interval (the | 512 // The split position coincides with the beginning of a use interval (the |
509 // end of a lifetime hole). Use at this position should be attributed to | 513 // end of a lifetime hole). Use at this position should be attributed to |
510 // the split child because split child owns use interval covering it. | 514 // the split child because split child owns use interval covering it. |
511 while (use_after != nullptr && use_after->pos() < position) { | 515 while (use_after != nullptr && use_after->pos() < position) { |
512 use_before = use_after; | 516 use_before = use_after; |
513 use_after = use_after->next(); | 517 use_after = use_after->next(); |
514 } | 518 } |
515 } else { | 519 } else { |
(...skipping 17 matching lines...) Expand all Loading... |
533 current_interval_ = nullptr; | 537 current_interval_ = nullptr; |
534 | 538 |
535 // Invalidate size and weight of this range. The child range has them | 539 // Invalidate size and weight of this range. The child range has them |
536 // invalid at construction. | 540 // invalid at construction. |
537 size_ = kInvalidSize; | 541 size_ = kInvalidSize; |
538 weight_ = kInvalidWeight; | 542 weight_ = kInvalidWeight; |
539 #ifdef DEBUG | 543 #ifdef DEBUG |
540 Verify(); | 544 Verify(); |
541 result->Verify(); | 545 result->Verify(); |
542 #endif | 546 #endif |
| 547 return use_before; |
543 } | 548 } |
544 | 549 |
545 | 550 |
546 void LiveRange::AppendAsChild(TopLevelLiveRange* other) { | 551 void LiveRange::AppendAsChild(TopLevelLiveRange* other) { |
547 next_ = other; | 552 next_ = other; |
548 | 553 |
549 other->UpdateParentForAllChildren(TopLevel()); | 554 other->UpdateParentForAllChildren(TopLevel()); |
550 TopLevel()->UpdateSpillRangePostMerge(other); | 555 TopLevel()->UpdateSpillRangePostMerge(other); |
551 TopLevel()->set_last_child(other->last_child()); | 556 TopLevel()->set_last_child(other->last_child()); |
552 } | 557 } |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 next_ = nullptr; | 863 next_ = nullptr; |
859 } else if (end >= End()) { | 864 } else if (end >= End()) { |
860 DCHECK(start > Start()); | 865 DCHECK(start > Start()); |
861 DetachAt(start, result, zone); | 866 DetachAt(start, result, zone); |
862 next_ = nullptr; | 867 next_ = nullptr; |
863 } else { | 868 } else { |
864 DCHECK(start < End() && Start() < end); | 869 DCHECK(start < End() && Start() < end); |
865 | 870 |
866 const int kInvalidId = std::numeric_limits<int>::max(); | 871 const int kInvalidId = std::numeric_limits<int>::max(); |
867 | 872 |
868 DetachAt(start, result, zone); | 873 UsePosition* last = DetachAt(start, result, zone); |
869 | 874 |
870 LiveRange end_part(kInvalidId, this->machine_type(), nullptr); | 875 LiveRange end_part(kInvalidId, this->machine_type(), nullptr); |
871 result->DetachAt(end, &end_part, zone); | 876 result->DetachAt(end, &end_part, zone); |
872 | 877 |
873 next_ = end_part.next_; | 878 next_ = end_part.next_; |
874 last_interval_->set_next(end_part.first_interval_); | 879 last_interval_->set_next(end_part.first_interval_); |
875 // The next splinter will happen either at or after the current interval. | 880 // The next splinter will happen either at or after the current interval. |
876 // We can optimize DetachAt by setting current_interval_ accordingly, | 881 // We can optimize DetachAt by setting current_interval_ accordingly, |
877 // which will then be picked up by FirstSearchIntervalForPosition. | 882 // which will then be picked up by FirstSearchIntervalForPosition. |
878 current_interval_ = last_interval_; | 883 current_interval_ = last_interval_; |
879 last_interval_ = end_part.last_interval_; | 884 last_interval_ = end_part.last_interval_; |
880 | 885 |
881 | |
882 if (first_pos_ == nullptr) { | 886 if (first_pos_ == nullptr) { |
883 first_pos_ = end_part.first_pos_; | 887 first_pos_ = end_part.first_pos_; |
884 } else { | 888 } else { |
885 UsePosition* pos = first_pos_; | 889 splitting_pointer_ = last; |
886 for (; pos->next() != nullptr; pos = pos->next()) { | 890 if (last != nullptr) last->set_next(end_part.first_pos_); |
887 } | |
888 pos->set_next(end_part.first_pos_); | |
889 } | 891 } |
890 } | 892 } |
891 result->next_ = nullptr; | 893 result->next_ = nullptr; |
892 result->top_level_ = result; | 894 result->top_level_ = result; |
893 | 895 |
894 result->SetSplinteredFrom(this); | 896 result->SetSplinteredFrom(this); |
895 // Ensure the result's relative ID is unique within the IDs used for this | 897 // Ensure the result's relative ID is unique within the IDs used for this |
896 // virtual register's children and splinters. | 898 // virtual register's children and splinters. |
897 result->relative_id_ = GetNextChildId(); | 899 result->relative_id_ = GetNextChildId(); |
898 } | 900 } |
(...skipping 2460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3359 auto eliminate = moves->PrepareInsertAfter(move); | 3361 auto eliminate = moves->PrepareInsertAfter(move); |
3360 to_insert.push_back(move); | 3362 to_insert.push_back(move); |
3361 if (eliminate != nullptr) to_eliminate.push_back(eliminate); | 3363 if (eliminate != nullptr) to_eliminate.push_back(eliminate); |
3362 } | 3364 } |
3363 } | 3365 } |
3364 | 3366 |
3365 | 3367 |
3366 } // namespace compiler | 3368 } // namespace compiler |
3367 } // namespace internal | 3369 } // namespace internal |
3368 } // namespace v8 | 3370 } // namespace v8 |
OLD | NEW |