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

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

Issue 1426583002: [turbofan] Centralize splitting for memory operands. (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/greedy-allocator.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 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 555
556 TopLevelLiveRange* splintered_from() const { return splintered_from_; } 556 TopLevelLiveRange* splintered_from() const { return splintered_from_; }
557 bool IsSplinter() const { return splintered_from_ != nullptr; } 557 bool IsSplinter() const { return splintered_from_ != nullptr; }
558 bool MayRequireSpillRange() const { 558 bool MayRequireSpillRange() const {
559 DCHECK(!IsSplinter()); 559 DCHECK(!IsSplinter());
560 return !HasSpillOperand() && spill_range_ == nullptr; 560 return !HasSpillOperand() && spill_range_ == nullptr;
561 } 561 }
562 void UpdateSpillRangePostMerge(TopLevelLiveRange* merged); 562 void UpdateSpillRangePostMerge(TopLevelLiveRange* merged);
563 int vreg() const { return vreg_; } 563 int vreg() const { return vreg_; }
564 564
565 #if DEBUG
566 int debug_virt_reg() const;
567 #endif
568
565 int GetNextChildId() { 569 int GetNextChildId() {
566 return IsSplinter() ? splintered_from()->GetNextChildId() 570 return IsSplinter() ? splintered_from()->GetNextChildId()
567 : ++last_child_id_; 571 : ++last_child_id_;
568 } 572 }
569 573
570 bool IsSpilledOnlyInDeferredBlocks() const { 574 bool IsSpilledOnlyInDeferredBlocks() const {
571 return spilled_in_deferred_blocks_; 575 return spilled_in_deferred_blocks_;
572 } 576 }
573 577
574 struct SpillAtDefinitionList; 578 struct SpillAtDefinitionList;
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 protected: 906 protected:
903 RegisterAllocationData* data() const { return data_; } 907 RegisterAllocationData* data() const { return data_; }
904 InstructionSequence* code() const { return data()->code(); } 908 InstructionSequence* code() const { return data()->code(); }
905 RegisterKind mode() const { return mode_; } 909 RegisterKind mode() const { return mode_; }
906 int num_registers() const { return num_registers_; } 910 int num_registers() const { return num_registers_; }
907 int num_allocatable_registers() const { return num_allocatable_registers_; } 911 int num_allocatable_registers() const { return num_allocatable_registers_; }
908 int allocatable_register_code(int allocatable_index) const { 912 int allocatable_register_code(int allocatable_index) const {
909 return allocatable_register_codes_[allocatable_index]; 913 return allocatable_register_codes_[allocatable_index];
910 } 914 }
911 915
916 // TODO(mtrofin): explain why splitting in gap START is always OK.
917 LifetimePosition GetSplitPositionForInstruction(const LiveRange* range,
918 int instruction_index);
919
912 Zone* allocation_zone() const { return data()->allocation_zone(); } 920 Zone* allocation_zone() const { return data()->allocation_zone(); }
913 921
922 // Find the optimal split for ranges defined by a memory operand, e.g.
923 // constants or function parameters passed on the stack.
924 void SplitAndSpillRangesDefinedByMemoryOperand();
925
914 // Split the given range at the given position. 926 // Split the given range at the given position.
915 // If range starts at or after the given position then the 927 // If range starts at or after the given position then the
916 // original range is returned. 928 // original range is returned.
917 // Otherwise returns the live range that starts at pos and contains 929 // Otherwise returns the live range that starts at pos and contains
918 // all uses from the original range that follow pos. Uses at pos will 930 // all uses from the original range that follow pos. Uses at pos will
919 // still be owned by the original range after splitting. 931 // still be owned by the original range after splitting.
920 LiveRange* SplitRangeAt(LiveRange* range, LifetimePosition pos); 932 LiveRange* SplitRangeAt(LiveRange* range, LifetimePosition pos);
921 933
934 bool CanProcessRange(LiveRange* range) const {
935 return range != nullptr && !range->IsEmpty() && range->kind() == mode();
936 }
937
938
922 // Split the given range in a position from the interval [start, end]. 939 // Split the given range in a position from the interval [start, end].
923 LiveRange* SplitBetween(LiveRange* range, LifetimePosition start, 940 LiveRange* SplitBetween(LiveRange* range, LifetimePosition start,
924 LifetimePosition end); 941 LifetimePosition end);
925 942
926 // Find a lifetime position in the interval [start, end] which 943 // Find a lifetime position in the interval [start, end] which
927 // is optimal for splitting: it is either header of the outermost 944 // is optimal for splitting: it is either header of the outermost
928 // loop covered by this interval or the latest possible position. 945 // loop covered by this interval or the latest possible position.
929 LifetimePosition FindOptimalSplitPos(LifetimePosition start, 946 LifetimePosition FindOptimalSplitPos(LifetimePosition start,
930 LifetimePosition end); 947 LifetimePosition end);
931 948
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 RegisterAllocationData* const data_; 1116 RegisterAllocationData* const data_;
1100 1117
1101 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); 1118 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
1102 }; 1119 };
1103 1120
1104 } // namespace compiler 1121 } // namespace compiler
1105 } // namespace internal 1122 } // namespace internal
1106 } // namespace v8 1123 } // namespace v8
1107 1124
1108 #endif // V8_REGISTER_ALLOCATOR_H_ 1125 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW
« no previous file with comments | « src/compiler/greedy-allocator.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698