Index: src/compiler/register-allocator.h |
diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h |
index 7835bd608052da34bf032b2f775768c30f8c641f..91d3174cd3622d39a74ec60f83077ab5c945b506 100644 |
--- a/src/compiler/register-allocator.h |
+++ b/src/compiler/register-allocator.h |
@@ -141,6 +141,9 @@ class UseInterval FINAL : public ZoneObject { |
}; |
+enum class UsePositionType : uint8_t { kAny, kRequiresRegister, kRequiresSlot }; |
+ |
+ |
// Representation of a use position. |
class UsePosition FINAL : public ZoneObject { |
public: |
@@ -152,22 +155,27 @@ class UsePosition FINAL : public ZoneObject { |
InstructionOperand* hint() const { return hint_; } |
bool HasHint() const; |
- bool RequiresRegister() const; |
- bool RegisterIsBeneficial() const; |
+ bool RegisterIsBeneficial() const { |
+ return RegisterBeneficialField::decode(flags_); |
+ } |
+ UsePositionType type() const { return TypeField::decode(flags_); } |
LifetimePosition pos() const { return pos_; } |
UsePosition* next() const { return next_; } |
void set_next(UsePosition* next) { next_ = next; } |
+ void set_type(UsePositionType type, bool register_beneficial); |
InstructionOperand* const operand_; |
InstructionOperand* const hint_; |
LifetimePosition const pos_; |
UsePosition* next_; |
- bool requires_reg_ : 1; |
- bool register_beneficial_ : 1; |
private: |
+ typedef BitField8<UsePositionType, 0, 2> TypeField; |
+ typedef BitField8<bool, 2, 1> RegisterBeneficialField; |
+ uint8_t flags_; |
+ |
DISALLOW_COPY_AND_ASSIGN(UsePosition); |
}; |
@@ -233,6 +241,8 @@ class LiveRange FINAL : public ZoneObject { |
void set_is_non_loop_phi(bool is_non_loop_phi) { |
is_non_loop_phi_ = is_non_loop_phi; |
} |
+ bool has_slot_use() const { return has_slot_use_; } |
+ void set_has_slot_use(bool has_slot_use) { has_slot_use_ = has_slot_use; } |
// Returns use position in this live range that follows both start |
// and last processed use position. |
@@ -309,7 +319,8 @@ class LiveRange FINAL : public ZoneObject { |
void SetSpillRange(SpillRange* spill_range); |
void CommitSpillOperand(InstructionOperand* operand); |
void CommitSpillsAtDefinition(InstructionSequence* sequence, |
- InstructionOperand* operand); |
+ InstructionOperand* operand, |
+ bool might_be_duplicated); |
void SetSpillStartIndex(int start) { |
spill_start_index_ = Min(start, spill_start_index_); |
@@ -338,16 +349,18 @@ class LiveRange FINAL : public ZoneObject { |
private: |
struct SpillAtDefinitionList; |
- void ConvertUsesToOperand(InstructionOperand* op); |
+ void ConvertUsesToOperand(InstructionOperand* op, |
+ InstructionOperand* spill_op); |
UseInterval* FirstSearchIntervalForPosition(LifetimePosition position) const; |
void AdvanceLastProcessedMarker(UseInterval* to_start_of, |
LifetimePosition but_not_past) const; |
// TODO(dcarney): pack this structure better. |
int id_; |
- bool spilled_; |
- bool is_phi_; |
- bool is_non_loop_phi_; |
+ bool spilled_ : 1; |
+ bool has_slot_use_ : 1; // Relevant only for parent. |
+ bool is_phi_ : 1; |
+ bool is_non_loop_phi_ : 1; |
RegisterKind kind_; |
int assigned_register_; |
UseInterval* last_interval_; |