Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(304)

Side by Side Diff: src/compiler/register-allocator.h

Issue 1406983004: [Turbofan] Re-enable single splinter. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/live-range-separator.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 void AddUseInterval(LifetimePosition start, LifetimePosition end, Zone* zone); 488 void AddUseInterval(LifetimePosition start, LifetimePosition end, Zone* zone);
489 void AddUsePosition(UsePosition* pos); 489 void AddUsePosition(UsePosition* pos);
490 490
491 // Shorten the most recently added interval by setting a new start. 491 // Shorten the most recently added interval by setting a new start.
492 void ShortenTo(LifetimePosition start); 492 void ShortenTo(LifetimePosition start);
493 493
494 // Detaches between start and end, and attributes the resulting range to 494 // Detaches between start and end, and attributes the resulting range to
495 // result. 495 // result.
496 // The current range is pointed to as "splintered_from". No parent/child 496 // The current range is pointed to as "splintered_from". No parent/child
497 // relationship is established between this and result. 497 // relationship is established between this and result.
498 void Splinter(LifetimePosition start, LifetimePosition end, 498 void Splinter(LifetimePosition start, LifetimePosition end, Zone* zone);
499 TopLevelLiveRange* result, Zone* zone);
500 499
501 // Assuming other was splintered from this range, embeds other and its 500 // Assuming other was splintered from this range, embeds other and its
502 // children as part of the children sequence of this range. 501 // children as part of the children sequence of this range.
503 void Merge(TopLevelLiveRange* other, Zone* zone); 502 void Merge(TopLevelLiveRange* other, Zone* zone);
504 503
505 // Spill range management. 504 // Spill range management.
506 void SetSpillRange(SpillRange* spill_range); 505 void SetSpillRange(SpillRange* spill_range);
507 enum class SpillType { kNoSpillType, kSpillOperand, kSpillRange }; 506 enum class SpillType { kNoSpillType, kSpillOperand, kSpillRange };
508 void set_spill_type(SpillType value) { 507 void set_spill_type(SpillType value) {
509 bits_ = SpillTypeField::update(bits_, value); 508 bits_ = SpillTypeField::update(bits_, value);
(...skipping 23 matching lines...) Expand all
533 532
534 AllocatedOperand GetSpillRangeOperand() const; 533 AllocatedOperand GetSpillRangeOperand() const;
535 534
536 void SpillAtDefinition(Zone* zone, int gap_index, 535 void SpillAtDefinition(Zone* zone, int gap_index,
537 InstructionOperand* operand); 536 InstructionOperand* operand);
538 void SetSpillOperand(InstructionOperand* operand); 537 void SetSpillOperand(InstructionOperand* operand);
539 void SetSpillStartIndex(int start) { 538 void SetSpillStartIndex(int start) {
540 spill_start_index_ = Min(start, spill_start_index_); 539 spill_start_index_ = Min(start, spill_start_index_);
541 } 540 }
542 541
543 void SetSplinteredFrom(TopLevelLiveRange* splinter_parent);
544 void CommitSpillsAtDefinition(InstructionSequence* sequence, 542 void CommitSpillsAtDefinition(InstructionSequence* sequence,
545 const InstructionOperand& operand, 543 const InstructionOperand& operand,
546 bool might_be_duplicated); 544 bool might_be_duplicated);
547 545
548 // 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
549 // 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
550 // is contained in a deferred block, mark the range as 548 // is contained in a deferred block, mark the range as
551 // IsSpilledOnlyInDeferredBlocks, so that we avoid spilling at definition, 549 // IsSpilledOnlyInDeferredBlocks, so that we avoid spilling at definition,
552 // and instead let the LiveRangeConnector perform the spills within the 550 // and instead let the LiveRangeConnector perform the spills within the
553 // 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
(...skipping 19 matching lines...) Expand all
573 return spilled_in_deferred_blocks_; 571 return spilled_in_deferred_blocks_;
574 } 572 }
575 573
576 struct SpillAtDefinitionList; 574 struct SpillAtDefinitionList;
577 575
578 SpillAtDefinitionList* spills_at_definition() const { 576 SpillAtDefinitionList* spills_at_definition() const {
579 return spills_at_definition_; 577 return spills_at_definition_;
580 } 578 }
581 void set_last_child(LiveRange* range) { last_child_ = range; } 579 void set_last_child(LiveRange* range) { last_child_ = range; }
582 LiveRange* last_child() const { return last_child_; } 580 LiveRange* last_child() const { return last_child_; }
581 TopLevelLiveRange* splinter() const { return splinter_; }
582 void SetSplinter(TopLevelLiveRange* splinter) {
583 DCHECK_NULL(splinter_);
584 DCHECK_NOT_NULL(splinter);
585
586 splinter_ = splinter;
587 splinter->relative_id_ = GetNextChildId();
588 splinter->set_spill_type(spill_type());
589 splinter->SetSplinteredFrom(this);
590 }
583 591
584 private: 592 private:
593 void SetSplinteredFrom(TopLevelLiveRange* splinter_parent);
594
585 typedef BitField<bool, 1, 1> HasSlotUseField; 595 typedef BitField<bool, 1, 1> HasSlotUseField;
586 typedef BitField<bool, 2, 1> IsPhiField; 596 typedef BitField<bool, 2, 1> IsPhiField;
587 typedef BitField<bool, 3, 1> IsNonLoopPhiField; 597 typedef BitField<bool, 3, 1> IsNonLoopPhiField;
588 typedef BitField<SpillType, 4, 2> SpillTypeField; 598 typedef BitField<SpillType, 4, 2> SpillTypeField;
589 599
590 int vreg_; 600 int vreg_;
591 int last_child_id_; 601 int last_child_id_;
592 TopLevelLiveRange* splintered_from_; 602 TopLevelLiveRange* splintered_from_;
593 union { 603 union {
594 // Correct value determined by spill_type() 604 // Correct value determined by spill_type()
595 InstructionOperand* spill_operand_; 605 InstructionOperand* spill_operand_;
596 SpillRange* spill_range_; 606 SpillRange* spill_range_;
597 }; 607 };
598 SpillAtDefinitionList* spills_at_definition_; 608 SpillAtDefinitionList* spills_at_definition_;
599 // TODO(mtrofin): generalize spilling after definition, currently specialized 609 // TODO(mtrofin): generalize spilling after definition, currently specialized
600 // just for spill in a single deferred block. 610 // just for spill in a single deferred block.
601 bool spilled_in_deferred_blocks_; 611 bool spilled_in_deferred_blocks_;
602 int spill_start_index_; 612 int spill_start_index_;
603 LiveRange* last_child_; 613 LiveRange* last_child_;
604 LiveRange* last_insertion_point_; 614 UsePosition* last_pos_;
615 TopLevelLiveRange* splinter_;
605 616
606 DISALLOW_COPY_AND_ASSIGN(TopLevelLiveRange); 617 DISALLOW_COPY_AND_ASSIGN(TopLevelLiveRange);
607 }; 618 };
608 619
609 620
610 struct PrintableLiveRange { 621 struct PrintableLiveRange {
611 const RegisterConfiguration* register_configuration_; 622 const RegisterConfiguration* register_configuration_;
612 const LiveRange* range_; 623 const LiveRange* range_;
613 }; 624 };
614 625
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 RegisterAllocationData* const data_; 1099 RegisterAllocationData* const data_;
1089 1100
1090 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); 1101 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
1091 }; 1102 };
1092 1103
1093 } // namespace compiler 1104 } // namespace compiler
1094 } // namespace internal 1105 } // namespace internal
1095 } // namespace v8 1106 } // namespace v8
1096 1107
1097 #endif // V8_REGISTER_ALLOCATOR_H_ 1108 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW
« no previous file with comments | « src/compiler/live-range-separator.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698