| 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 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 bool HasNoSpillType() const { | 525 bool HasNoSpillType() const { |
| 526 return spill_type() == SpillType::kNoSpillType; | 526 return spill_type() == SpillType::kNoSpillType; |
| 527 } | 527 } |
| 528 bool HasSpillOperand() const { | 528 bool HasSpillOperand() const { |
| 529 return spill_type() == SpillType::kSpillOperand; | 529 return spill_type() == SpillType::kSpillOperand; |
| 530 } | 530 } |
| 531 bool HasSpillRange() const { return spill_type() == SpillType::kSpillRange; } | 531 bool HasSpillRange() const { return spill_type() == SpillType::kSpillRange; } |
| 532 | 532 |
| 533 AllocatedOperand GetSpillRangeOperand() const; | 533 AllocatedOperand GetSpillRangeOperand() const; |
| 534 | 534 |
| 535 void SpillAtDefinition(Zone* zone, int gap_index, | 535 void RecordSpillLocation(Zone* zone, int gap_index, |
| 536 InstructionOperand* operand); | 536 InstructionOperand* operand); |
| 537 void SetSpillOperand(InstructionOperand* operand); | 537 void SetSpillOperand(InstructionOperand* operand); |
| 538 void SetSpillStartIndex(int start) { | 538 void SetSpillStartIndex(int start) { |
| 539 spill_start_index_ = Min(start, spill_start_index_); | 539 spill_start_index_ = Min(start, spill_start_index_); |
| 540 } | 540 } |
| 541 | 541 |
| 542 void CommitSpillsAtDefinition(InstructionSequence* sequence, | 542 void CommitSpillMoves(InstructionSequence* sequence, |
| 543 const InstructionOperand& operand, | 543 const InstructionOperand& operand, |
| 544 bool might_be_duplicated); | 544 bool might_be_duplicated); |
| 545 | 545 |
| 546 // If all the children of this range are spilled in deferred blocks, and if | 546 // If all the children of this range are spilled in deferred blocks, and if |
| 547 // for any non-spilled child with a use position requiring a slot, that range | 547 // for any non-spilled child with a use position requiring a slot, that range |
| 548 // is contained in a deferred block, mark the range as | 548 // is contained in a deferred block, mark the range as |
| 549 // IsSpilledOnlyInDeferredBlocks, so that we avoid spilling at definition, | 549 // IsSpilledOnlyInDeferredBlocks, so that we avoid spilling at definition, |
| 550 // and instead let the LiveRangeConnector perform the spills within the | 550 // and instead let the LiveRangeConnector perform the spills within the |
| 551 // deferred blocks. If so, we insert here spills for non-spilled ranges | 551 // deferred blocks. If so, we insert here spills for non-spilled ranges |
| 552 // with slot use positions. | 552 // with slot use positions. |
| 553 void MarkSpilledInDeferredBlock(const InstructionSequence* code); | 553 void MarkSpilledInDeferredBlock(const InstructionSequence* code); |
| 554 bool TryCommitSpillInDeferredBlock(InstructionSequence* code, | 554 bool TryCommitSpillInDeferredBlock(InstructionSequence* code, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 569 | 569 |
| 570 int GetNextChildId() { | 570 int GetNextChildId() { |
| 571 return IsSplinter() ? splintered_from()->GetNextChildId() | 571 return IsSplinter() ? splintered_from()->GetNextChildId() |
| 572 : ++last_child_id_; | 572 : ++last_child_id_; |
| 573 } | 573 } |
| 574 | 574 |
| 575 bool IsSpilledOnlyInDeferredBlocks() const { | 575 bool IsSpilledOnlyInDeferredBlocks() const { |
| 576 return spilled_in_deferred_blocks_; | 576 return spilled_in_deferred_blocks_; |
| 577 } | 577 } |
| 578 | 578 |
| 579 struct SpillAtDefinitionList; | 579 struct SpillMoveInsertionList; |
| 580 | 580 |
| 581 SpillAtDefinitionList* spills_at_definition() const { | 581 SpillMoveInsertionList* spill_move_insertion_locations() const { |
| 582 return spills_at_definition_; | 582 return spill_move_insertion_locations_; |
| 583 } | 583 } |
| 584 void set_last_child(LiveRange* range) { last_child_ = range; } | 584 void set_last_child(LiveRange* range) { last_child_ = range; } |
| 585 LiveRange* last_child() const { return last_child_; } | 585 LiveRange* last_child() const { return last_child_; } |
| 586 TopLevelLiveRange* splinter() const { return splinter_; } | 586 TopLevelLiveRange* splinter() const { return splinter_; } |
| 587 void SetSplinter(TopLevelLiveRange* splinter) { | 587 void SetSplinter(TopLevelLiveRange* splinter) { |
| 588 DCHECK_NULL(splinter_); | 588 DCHECK_NULL(splinter_); |
| 589 DCHECK_NOT_NULL(splinter); | 589 DCHECK_NOT_NULL(splinter); |
| 590 | 590 |
| 591 splinter_ = splinter; | 591 splinter_ = splinter; |
| 592 splinter->relative_id_ = GetNextChildId(); | 592 splinter->relative_id_ = GetNextChildId(); |
| 593 splinter->set_spill_type(spill_type()); | 593 splinter->set_spill_type(spill_type()); |
| 594 splinter->SetSplinteredFrom(this); | 594 splinter->SetSplinteredFrom(this); |
| 595 } | 595 } |
| 596 | 596 |
| 597 void MarkHasPreassignedSlot() { has_preassigned_slot_ = true; } |
| 598 bool has_preassigned_slot() const { return has_preassigned_slot_; } |
| 599 |
| 597 private: | 600 private: |
| 598 void SetSplinteredFrom(TopLevelLiveRange* splinter_parent); | 601 void SetSplinteredFrom(TopLevelLiveRange* splinter_parent); |
| 599 | 602 |
| 600 typedef BitField<bool, 1, 1> HasSlotUseField; | 603 typedef BitField<bool, 1, 1> HasSlotUseField; |
| 601 typedef BitField<bool, 2, 1> IsPhiField; | 604 typedef BitField<bool, 2, 1> IsPhiField; |
| 602 typedef BitField<bool, 3, 1> IsNonLoopPhiField; | 605 typedef BitField<bool, 3, 1> IsNonLoopPhiField; |
| 603 typedef BitField<SpillType, 4, 2> SpillTypeField; | 606 typedef BitField<SpillType, 4, 2> SpillTypeField; |
| 604 | 607 |
| 605 int vreg_; | 608 int vreg_; |
| 606 int last_child_id_; | 609 int last_child_id_; |
| 607 TopLevelLiveRange* splintered_from_; | 610 TopLevelLiveRange* splintered_from_; |
| 608 union { | 611 union { |
| 609 // Correct value determined by spill_type() | 612 // Correct value determined by spill_type() |
| 610 InstructionOperand* spill_operand_; | 613 InstructionOperand* spill_operand_; |
| 611 SpillRange* spill_range_; | 614 SpillRange* spill_range_; |
| 612 }; | 615 }; |
| 613 SpillAtDefinitionList* spills_at_definition_; | 616 SpillMoveInsertionList* spill_move_insertion_locations_; |
| 614 // TODO(mtrofin): generalize spilling after definition, currently specialized | 617 // TODO(mtrofin): generalize spilling after definition, currently specialized |
| 615 // just for spill in a single deferred block. | 618 // just for spill in a single deferred block. |
| 616 bool spilled_in_deferred_blocks_; | 619 bool spilled_in_deferred_blocks_; |
| 617 int spill_start_index_; | 620 int spill_start_index_; |
| 618 LiveRange* last_child_; | 621 LiveRange* last_child_; |
| 619 UsePosition* last_pos_; | 622 UsePosition* last_pos_; |
| 620 TopLevelLiveRange* splinter_; | 623 TopLevelLiveRange* splinter_; |
| 624 bool has_preassigned_slot_; |
| 621 | 625 |
| 622 DISALLOW_COPY_AND_ASSIGN(TopLevelLiveRange); | 626 DISALLOW_COPY_AND_ASSIGN(TopLevelLiveRange); |
| 623 }; | 627 }; |
| 624 | 628 |
| 625 | 629 |
| 626 struct PrintableLiveRange { | 630 struct PrintableLiveRange { |
| 627 const RegisterConfiguration* register_configuration_; | 631 const RegisterConfiguration* register_configuration_; |
| 628 const LiveRange* range_; | 632 const LiveRange* range_; |
| 629 }; | 633 }; |
| 630 | 634 |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 RegisterAllocationData* const data_; | 1121 RegisterAllocationData* const data_; |
| 1118 | 1122 |
| 1119 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); | 1123 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); |
| 1120 }; | 1124 }; |
| 1121 | 1125 |
| 1122 } // namespace compiler | 1126 } // namespace compiler |
| 1123 } // namespace internal | 1127 } // namespace internal |
| 1124 } // namespace v8 | 1128 } // namespace v8 |
| 1125 | 1129 |
| 1126 #endif // V8_REGISTER_ALLOCATOR_H_ | 1130 #endif // V8_REGISTER_ALLOCATOR_H_ |
| OLD | NEW |