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 #ifndef V8_REGISTER_ALLOCATOR_H_ | 5 #ifndef V8_REGISTER_ALLOCATOR_H_ |
6 #define V8_REGISTER_ALLOCATOR_H_ | 6 #define V8_REGISTER_ALLOCATOR_H_ |
7 | 7 |
8 #include "src/compiler/instruction.h" | 8 #include "src/compiler/instruction.h" |
9 #include "src/ostreams.h" | 9 #include "src/ostreams.h" |
10 #include "src/register-configuration.h" | 10 #include "src/register-configuration.h" |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 LifetimePosition End() const { | 389 LifetimePosition End() const { |
390 DCHECK(!IsEmpty()); | 390 DCHECK(!IsEmpty()); |
391 return last_interval_->end(); | 391 return last_interval_->end(); |
392 } | 392 } |
393 | 393 |
394 bool ShouldBeAllocatedBefore(const LiveRange* other) const; | 394 bool ShouldBeAllocatedBefore(const LiveRange* other) const; |
395 bool CanCover(LifetimePosition position) const; | 395 bool CanCover(LifetimePosition position) const; |
396 bool Covers(LifetimePosition position) const; | 396 bool Covers(LifetimePosition position) const; |
397 LifetimePosition FirstIntersection(LiveRange* other) const; | 397 LifetimePosition FirstIntersection(LiveRange* other) const; |
398 | 398 |
399 void Verify() const; | 399 void VerifyChildStructure() const { |
| 400 VerifyIntervals(); |
| 401 VerifyPositions(); |
| 402 } |
400 | 403 |
401 void ConvertUsesToOperand(const InstructionOperand& op, | 404 void ConvertUsesToOperand(const InstructionOperand& op, |
402 const InstructionOperand& spill_op); | 405 const InstructionOperand& spill_op); |
403 void SetUseHints(int register_index); | 406 void SetUseHints(int register_index); |
404 void UnsetUseHints() { SetUseHints(kUnassignedRegister); } | 407 void UnsetUseHints() { SetUseHints(kUnassignedRegister); } |
405 | 408 |
406 // Used solely by the Greedy Allocator: | 409 // Used solely by the Greedy Allocator: |
407 unsigned GetSize(); | 410 unsigned GetSize(); |
408 float weight() const { return weight_; } | 411 float weight() const { return weight_; } |
409 void set_weight(float weight) { weight_ = weight; } | 412 void set_weight(float weight) { weight_ = weight; } |
(...skipping 11 matching lines...) Expand all Loading... |
421 | 424 |
422 void AppendAsChild(TopLevelLiveRange* other); | 425 void AppendAsChild(TopLevelLiveRange* other); |
423 void UpdateParentForAllChildren(TopLevelLiveRange* new_top_level); | 426 void UpdateParentForAllChildren(TopLevelLiveRange* new_top_level); |
424 | 427 |
425 void set_spilled(bool value) { bits_ = SpilledField::update(bits_, value); } | 428 void set_spilled(bool value) { bits_ = SpilledField::update(bits_, value); } |
426 | 429 |
427 UseInterval* FirstSearchIntervalForPosition(LifetimePosition position) const; | 430 UseInterval* FirstSearchIntervalForPosition(LifetimePosition position) const; |
428 void AdvanceLastProcessedMarker(UseInterval* to_start_of, | 431 void AdvanceLastProcessedMarker(UseInterval* to_start_of, |
429 LifetimePosition but_not_past) const; | 432 LifetimePosition but_not_past) const; |
430 | 433 |
| 434 void VerifyPositions() const; |
| 435 void VerifyIntervals() const; |
| 436 |
431 typedef BitField<bool, 0, 1> SpilledField; | 437 typedef BitField<bool, 0, 1> SpilledField; |
432 typedef BitField<int32_t, 6, 6> AssignedRegisterField; | 438 typedef BitField<int32_t, 6, 6> AssignedRegisterField; |
433 typedef BitField<MachineRepresentation, 12, 8> RepresentationField; | 439 typedef BitField<MachineRepresentation, 12, 8> RepresentationField; |
434 | 440 |
435 // Unique among children and splinters of the same virtual register. | 441 // Unique among children and splinters of the same virtual register. |
436 int relative_id_; | 442 int relative_id_; |
437 uint32_t bits_; | 443 uint32_t bits_; |
438 UseInterval* last_interval_; | 444 UseInterval* last_interval_; |
439 UseInterval* first_interval_; | 445 UseInterval* first_interval_; |
440 UsePosition* first_pos_; | 446 UsePosition* first_pos_; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 DCHECK(!IsSplinter()); | 589 DCHECK(!IsSplinter()); |
584 return !HasSpillOperand() && spill_range_ == nullptr; | 590 return !HasSpillOperand() && spill_range_ == nullptr; |
585 } | 591 } |
586 void UpdateSpillRangePostMerge(TopLevelLiveRange* merged); | 592 void UpdateSpillRangePostMerge(TopLevelLiveRange* merged); |
587 int vreg() const { return vreg_; } | 593 int vreg() const { return vreg_; } |
588 | 594 |
589 #if DEBUG | 595 #if DEBUG |
590 int debug_virt_reg() const; | 596 int debug_virt_reg() const; |
591 #endif | 597 #endif |
592 | 598 |
| 599 void Verify() const; |
| 600 void VerifyChildrenInOrder() const; |
| 601 |
593 int GetNextChildId() { | 602 int GetNextChildId() { |
594 return IsSplinter() ? splintered_from()->GetNextChildId() | 603 return IsSplinter() ? splintered_from()->GetNextChildId() |
595 : ++last_child_id_; | 604 : ++last_child_id_; |
596 } | 605 } |
597 | 606 |
598 int GetChildCount() const { return last_child_id_ + 1; } | 607 int GetChildCount() const { return last_child_id_ + 1; } |
599 | 608 |
600 bool IsSpilledOnlyInDeferredBlocks() const { | 609 bool IsSpilledOnlyInDeferredBlocks() const { |
601 return spilled_in_deferred_blocks_; | 610 return spilled_in_deferred_blocks_; |
602 } | 611 } |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 RegisterAllocationData* const data_; | 1164 RegisterAllocationData* const data_; |
1156 | 1165 |
1157 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); | 1166 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); |
1158 }; | 1167 }; |
1159 | 1168 |
1160 } // namespace compiler | 1169 } // namespace compiler |
1161 } // namespace internal | 1170 } // namespace internal |
1162 } // namespace v8 | 1171 } // namespace v8 |
1163 | 1172 |
1164 #endif // V8_REGISTER_ALLOCATOR_H_ | 1173 #endif // V8_REGISTER_ALLOCATOR_H_ |
OLD | NEW |