| 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/zone-containers.h" | 10 #include "src/zone-containers.h" | 
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 268   LifetimePosition const pos_; | 268   LifetimePosition const pos_; | 
| 269   uint32_t flags_; | 269   uint32_t flags_; | 
| 270 | 270 | 
| 271   DISALLOW_COPY_AND_ASSIGN(UsePosition); | 271   DISALLOW_COPY_AND_ASSIGN(UsePosition); | 
| 272 }; | 272 }; | 
| 273 | 273 | 
| 274 | 274 | 
| 275 class SpillRange; | 275 class SpillRange; | 
| 276 class RegisterAllocationData; | 276 class RegisterAllocationData; | 
| 277 class TopLevelLiveRange; | 277 class TopLevelLiveRange; | 
|  | 278 class LiveRangeGroup; | 
| 278 | 279 | 
| 279 // Representation of SSA values' live ranges as a collection of (continuous) | 280 // Representation of SSA values' live ranges as a collection of (continuous) | 
| 280 // intervals over the instruction ordering. | 281 // intervals over the instruction ordering. | 
| 281 class LiveRange : public ZoneObject { | 282 class LiveRange : public ZoneObject { | 
| 282  public: | 283  public: | 
| 283   UseInterval* first_interval() const { return first_interval_; } | 284   UseInterval* first_interval() const { return first_interval_; } | 
| 284   UsePosition* first_pos() const { return first_pos_; } | 285   UsePosition* first_pos() const { return first_pos_; } | 
| 285   TopLevelLiveRange* TopLevel() { return top_level_; } | 286   TopLevelLiveRange* TopLevel() { return top_level_; } | 
| 286   const TopLevelLiveRange* TopLevel() const { return top_level_; } | 287   const TopLevelLiveRange* TopLevel() const { return top_level_; } | 
| 287 | 288 | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 377 | 378 | 
| 378   void ConvertUsesToOperand(const InstructionOperand& op, | 379   void ConvertUsesToOperand(const InstructionOperand& op, | 
| 379                             const InstructionOperand& spill_op); | 380                             const InstructionOperand& spill_op); | 
| 380   void SetUseHints(int register_index); | 381   void SetUseHints(int register_index); | 
| 381   void UnsetUseHints() { SetUseHints(kUnassignedRegister); } | 382   void UnsetUseHints() { SetUseHints(kUnassignedRegister); } | 
| 382 | 383 | 
| 383   // Used solely by the Greedy Allocator: | 384   // Used solely by the Greedy Allocator: | 
| 384   unsigned GetSize(); | 385   unsigned GetSize(); | 
| 385   float weight() const { return weight_; } | 386   float weight() const { return weight_; } | 
| 386   void set_weight(float weight) { weight_ = weight; } | 387   void set_weight(float weight) { weight_ = weight; } | 
|  | 388   LiveRangeGroup* group() const { return group_; } | 
|  | 389   void set_group(LiveRangeGroup* group) { group_ = group; } | 
| 387 | 390 | 
| 388   static const int kInvalidSize = -1; | 391   static const int kInvalidSize = -1; | 
| 389   static const float kInvalidWeight; | 392   static const float kInvalidWeight; | 
| 390   static const float kMaxWeight; | 393   static const float kMaxWeight; | 
| 391 | 394 | 
| 392  private: | 395  private: | 
| 393   friend class TopLevelLiveRange; | 396   friend class TopLevelLiveRange; | 
| 394   explicit LiveRange(int relative_id, MachineType machine_type, | 397   explicit LiveRange(int relative_id, MachineType machine_type, | 
| 395                      TopLevelLiveRange* top_level); | 398                      TopLevelLiveRange* top_level); | 
| 396 | 399 | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 424 | 427 | 
| 425   // greedy: the number of LifetimePositions covered by this range. Used to | 428   // greedy: the number of LifetimePositions covered by this range. Used to | 
| 426   // prioritize selecting live ranges for register assignment, as well as | 429   // prioritize selecting live ranges for register assignment, as well as | 
| 427   // in weight calculations. | 430   // in weight calculations. | 
| 428   int size_; | 431   int size_; | 
| 429 | 432 | 
| 430   // greedy: a metric for resolving conflicts between ranges with an assigned | 433   // greedy: a metric for resolving conflicts between ranges with an assigned | 
| 431   // register and ranges that intersect them and need a register. | 434   // register and ranges that intersect them and need a register. | 
| 432   float weight_; | 435   float weight_; | 
| 433 | 436 | 
|  | 437   // greedy: groupping | 
|  | 438   LiveRangeGroup* group_; | 
|  | 439 | 
| 434   DISALLOW_COPY_AND_ASSIGN(LiveRange); | 440   DISALLOW_COPY_AND_ASSIGN(LiveRange); | 
| 435 }; | 441 }; | 
| 436 | 442 | 
| 437 | 443 | 
|  | 444 class LiveRangeGroup final : public ZoneObject { | 
|  | 445  public: | 
|  | 446   explicit LiveRangeGroup(Zone* zone) : ranges_(zone) {} | 
|  | 447   ZoneVector<LiveRange*>& ranges() { return ranges_; } | 
|  | 448   const ZoneVector<LiveRange*>& ranges() const { return ranges_; } | 
|  | 449 | 
|  | 450   // TODO(mtrofin): populate assigned register and use in weight calculation. | 
|  | 451   int assigned_register() const { return assigned_register_; } | 
|  | 452   void set_assigned_register(int reg) { assigned_register_ = reg; } | 
|  | 453 | 
|  | 454  private: | 
|  | 455   ZoneVector<LiveRange*> ranges_; | 
|  | 456   int assigned_register_; | 
|  | 457   DISALLOW_COPY_AND_ASSIGN(LiveRangeGroup); | 
|  | 458 }; | 
|  | 459 | 
|  | 460 | 
| 438 class TopLevelLiveRange final : public LiveRange { | 461 class TopLevelLiveRange final : public LiveRange { | 
| 439  public: | 462  public: | 
| 440   explicit TopLevelLiveRange(int vreg, MachineType machine_type); | 463   explicit TopLevelLiveRange(int vreg, MachineType machine_type); | 
| 441   int spill_start_index() const { return spill_start_index_; } | 464   int spill_start_index() const { return spill_start_index_; } | 
| 442 | 465 | 
| 443   bool IsFixed() const { return vreg_ < 0; } | 466   bool IsFixed() const { return vreg_ < 0; } | 
| 444 | 467 | 
| 445   bool is_phi() const { return IsPhiField::decode(bits_); } | 468   bool is_phi() const { return IsPhiField::decode(bits_); } | 
| 446   void set_is_phi(bool value) { bits_ = IsPhiField::update(bits_, value); } | 469   void set_is_phi(bool value) { bits_ = IsPhiField::update(bits_, value); } | 
| 447 | 470 | 
| (...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1052   RegisterAllocationData* const data_; | 1075   RegisterAllocationData* const data_; | 
| 1053 | 1076 | 
| 1054   DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); | 1077   DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); | 
| 1055 }; | 1078 }; | 
| 1056 | 1079 | 
| 1057 }  // namespace compiler | 1080 }  // namespace compiler | 
| 1058 }  // namespace internal | 1081 }  // namespace internal | 
| 1059 }  // namespace v8 | 1082 }  // namespace v8 | 
| 1060 | 1083 | 
| 1061 #endif  // V8_REGISTER_ALLOCATOR_H_ | 1084 #endif  // V8_REGISTER_ALLOCATOR_H_ | 
| OLD | NEW | 
|---|