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

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

Issue 2347563004: [turbofan] Avoid large deopt blocks (Closed)
Patch Set: [turbofan] Avoid large deopt blocks Created 4 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/instruction.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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 // For hinting only. 268 // For hinting only.
269 void set_assigned_register(int register_code) { 269 void set_assigned_register(int register_code) {
270 flags_ = AssignedRegisterField::update(flags_, register_code); 270 flags_ = AssignedRegisterField::update(flags_, register_code);
271 } 271 }
272 272
273 UsePositionHintType hint_type() const { 273 UsePositionHintType hint_type() const {
274 return HintTypeField::decode(flags_); 274 return HintTypeField::decode(flags_);
275 } 275 }
276 bool HasHint() const; 276 bool HasHint() const;
277 bool HintRegister(int* register_code) const; 277 bool HintRegister(int* register_code) const;
278 void SetHint(UsePosition* use_pos);
278 void ResolveHint(UsePosition* use_pos); 279 void ResolveHint(UsePosition* use_pos);
279 bool IsResolved() const { 280 bool IsResolved() const {
280 return hint_type() != UsePositionHintType::kUnresolved; 281 return hint_type() != UsePositionHintType::kUnresolved;
281 } 282 }
282 static UsePositionHintType HintTypeForOperand(const InstructionOperand& op); 283 static UsePositionHintType HintTypeForOperand(const InstructionOperand& op);
283 284
284 private: 285 private:
285 typedef BitField<UsePositionType, 0, 2> TypeField; 286 typedef BitField<UsePositionType, 0, 2> TypeField;
286 typedef BitField<UsePositionHintType, 2, 3> HintTypeField; 287 typedef BitField<UsePositionHintType, 2, 3> HintTypeField;
287 typedef BitField<bool, 5, 1> RegisterBeneficialField; 288 typedef BitField<bool, 5, 1> RegisterBeneficialField;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 // Can this live range be spilled at this position. 362 // Can this live range be spilled at this position.
362 bool CanBeSpilled(LifetimePosition pos) const; 363 bool CanBeSpilled(LifetimePosition pos) const;
363 364
364 // Splitting primitive used by both splitting and splintering members. 365 // Splitting primitive used by both splitting and splintering members.
365 // Performs the split, but does not link the resulting ranges. 366 // Performs the split, but does not link the resulting ranges.
366 // The given position must follow the start of the range. 367 // The given position must follow the start of the range.
367 // All uses following the given position will be moved from this 368 // All uses following the given position will be moved from this
368 // live range to the result live range. 369 // live range to the result live range.
369 // The current range will terminate at position, while result will start from 370 // The current range will terminate at position, while result will start from
370 // position. 371 // position.
372 enum HintConnectionOption : bool {
373 DoNotConnectHints = false,
374 ConnectHints = true
375 };
371 UsePosition* DetachAt(LifetimePosition position, LiveRange* result, 376 UsePosition* DetachAt(LifetimePosition position, LiveRange* result,
372 Zone* zone); 377 Zone* zone, HintConnectionOption connect_hints);
373 378
374 // Detaches at position, and then links the resulting ranges. Returns the 379 // Detaches at position, and then links the resulting ranges. Returns the
375 // child, which starts at position. 380 // child, which starts at position.
376 LiveRange* SplitAt(LifetimePosition position, Zone* zone); 381 LiveRange* SplitAt(LifetimePosition position, Zone* zone);
377 382
378 // Returns nullptr when no register is hinted, otherwise sets register_index. 383 // Returns nullptr when no register is hinted, otherwise sets register_index.
379 UsePosition* FirstHintPosition(int* register_index) const; 384 UsePosition* FirstHintPosition(int* register_index) const;
380 UsePosition* FirstHintPosition() const { 385 UsePosition* FirstHintPosition() const {
381 int register_index; 386 int register_index;
382 return FirstHintPosition(&register_index); 387 return FirstHintPosition(&register_index);
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 void AddToUnhandledUnsorted(LiveRange* range); 1045 void AddToUnhandledUnsorted(LiveRange* range);
1041 void SortUnhandled(); 1046 void SortUnhandled();
1042 bool UnhandledIsSorted(); 1047 bool UnhandledIsSorted();
1043 void ActiveToHandled(LiveRange* range); 1048 void ActiveToHandled(LiveRange* range);
1044 void ActiveToInactive(LiveRange* range); 1049 void ActiveToInactive(LiveRange* range);
1045 void InactiveToHandled(LiveRange* range); 1050 void InactiveToHandled(LiveRange* range);
1046 void InactiveToActive(LiveRange* range); 1051 void InactiveToActive(LiveRange* range);
1047 1052
1048 // Helper methods for allocating registers. 1053 // Helper methods for allocating registers.
1049 bool TryReuseSpillForPhi(TopLevelLiveRange* range); 1054 bool TryReuseSpillForPhi(TopLevelLiveRange* range);
1050 bool TryAllocateFreeReg(LiveRange* range); 1055 bool TryAllocateFreeReg(LiveRange* range,
1056 const Vector<LifetimePosition>& free_until_pos);
1057 bool TryAllocatePreferredReg(LiveRange* range,
1058 const Vector<LifetimePosition>& free_until_pos);
1059 void FindFreeRegistersForRange(LiveRange* range,
1060 Vector<LifetimePosition> free_until_pos);
1061 void ProcessCurrentRange(LiveRange* current);
1051 void AllocateBlockedReg(LiveRange* range); 1062 void AllocateBlockedReg(LiveRange* range);
1063 bool TrySplitAndSpillSplinter(LiveRange* range);
1052 1064
1053 // Spill the given life range after position pos. 1065 // Spill the given life range after position pos.
1054 void SpillAfter(LiveRange* range, LifetimePosition pos); 1066 void SpillAfter(LiveRange* range, LifetimePosition pos);
1055 1067
1056 // Spill the given life range after position [start] and up to position [end]. 1068 // Spill the given life range after position [start] and up to position [end].
1057 void SpillBetween(LiveRange* range, LifetimePosition start, 1069 void SpillBetween(LiveRange* range, LifetimePosition start,
1058 LifetimePosition end); 1070 LifetimePosition end);
1059 1071
1060 // Spill the given life range after position [start] and up to position [end]. 1072 // Spill the given life range after position [start] and up to position [end].
1061 // Range is guaranteed to be spilled at least until position [until]. 1073 // Range is guaranteed to be spilled at least until position [until].
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 RegisterAllocationData* const data_; 1180 RegisterAllocationData* const data_;
1169 1181
1170 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); 1182 DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
1171 }; 1183 };
1172 1184
1173 } // namespace compiler 1185 } // namespace compiler
1174 } // namespace internal 1186 } // namespace internal
1175 } // namespace v8 1187 } // namespace v8
1176 1188
1177 #endif // V8_REGISTER_ALLOCATOR_H_ 1189 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW
« no previous file with comments | « src/compiler/instruction.cc ('k') | src/compiler/register-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698