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 |