Index: src/compiler/register-allocator.h |
diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h |
index 41f00af2d5f0035590939113600add1f59ebdf90..50b89ede055b78db461794d25578b67625ba5685 100644 |
--- a/src/compiler/register-allocator.h |
+++ b/src/compiler/register-allocator.h |
@@ -13,6 +13,7 @@ |
namespace compiler { |
enum RegisterKind { |
+ UNALLOCATED_REGISTERS, |
GENERAL_REGISTERS, |
DOUBLE_REGISTERS |
}; |
@@ -271,7 +272,7 @@ |
// intervals over the instruction ordering. |
class LiveRange final : public ZoneObject { |
public: |
- explicit LiveRange(int id, MachineType machine_type); |
+ explicit LiveRange(int id); |
UseInterval* first_interval() const { return first_interval_; } |
UsePosition* first_pos() const { return first_pos_; } |
@@ -288,8 +289,6 @@ |
InstructionOperand GetAssignedOperand() const; |
int spill_start_index() const { return spill_start_index_; } |
- MachineType machine_type() const { return MachineTypeField::decode(bits_); } |
- |
int assigned_register() const { return AssignedRegisterField::decode(bits_); } |
bool HasRegisterAssigned() const { |
return assigned_register() != kUnassignedRegister; |
@@ -300,7 +299,10 @@ |
bool spilled() const { return SpilledField::decode(bits_); } |
void Spill(); |
- RegisterKind kind() const; |
+ RegisterKind kind() const { return RegisterKindField::decode(bits_); } |
+ void set_kind(RegisterKind kind) { |
+ bits_ = RegisterKindField::update(bits_, kind); |
+ } |
// Correct only for parent. |
bool is_phi() const { return IsPhiField::decode(bits_); } |
@@ -384,14 +386,14 @@ |
return spill_type() == SpillType::kSpillOperand; |
} |
bool HasSpillRange() const { return spill_type() == SpillType::kSpillRange; } |
- AllocatedOperand GetSpillRangeOperand() const; |
void SpillAtDefinition(Zone* zone, int gap_index, |
InstructionOperand* operand); |
void SetSpillOperand(InstructionOperand* operand); |
void SetSpillRange(SpillRange* spill_range); |
+ void CommitSpillOperand(AllocatedOperand* operand); |
void CommitSpillsAtDefinition(InstructionSequence* sequence, |
- const InstructionOperand& operand, |
+ InstructionOperand* operand, |
bool might_be_duplicated); |
void SetSpillStartIndex(int start) { |
@@ -414,7 +416,7 @@ |
void Verify() const; |
void ConvertUsesToOperand(const InstructionOperand& op, |
- const InstructionOperand& spill_op); |
+ InstructionOperand* spill_op); |
void SetUseHints(int register_index); |
void UnsetUseHints() { SetUseHints(kUnassignedRegister); } |
@@ -435,9 +437,9 @@ |
typedef BitField<bool, 1, 1> HasSlotUseField; |
typedef BitField<bool, 2, 1> IsPhiField; |
typedef BitField<bool, 3, 1> IsNonLoopPhiField; |
- typedef BitField<SpillType, 4, 2> SpillTypeField; |
- typedef BitField<int32_t, 6, 6> AssignedRegisterField; |
- typedef BitField<MachineType, 12, 15> MachineTypeField; |
+ typedef BitField<RegisterKind, 4, 2> RegisterKindField; |
+ typedef BitField<SpillType, 6, 2> SpillTypeField; |
+ typedef BitField<int32_t, 8, 6> AssignedRegisterField; |
int id_; |
int spill_start_index_; |
@@ -466,23 +468,13 @@ |
class SpillRange final : public ZoneObject { |
public: |
- static const int kUnassignedSlot = -1; |
SpillRange(LiveRange* range, Zone* zone); |
UseInterval* interval() const { return use_interval_; } |
- // Currently, only 4 or 8 byte slots are supported. |
- int ByteWidth() const; |
+ RegisterKind kind() const { return live_ranges_[0]->kind(); } |
bool IsEmpty() const { return live_ranges_.empty(); } |
bool TryMerge(SpillRange* other); |
- |
- void set_assigned_slot(int index) { |
- DCHECK_EQ(kUnassignedSlot, assigned_slot_); |
- assigned_slot_ = index; |
- } |
- int assigned_slot() { |
- DCHECK_NE(kUnassignedSlot, assigned_slot_); |
- return assigned_slot_; |
- } |
+ void SetOperand(AllocatedOperand* op); |
private: |
LifetimePosition End() const { return end_position_; } |
@@ -494,7 +486,6 @@ |
ZoneVector<LiveRange*> live_ranges_; |
UseInterval* use_interval_; |
LifetimePosition end_position_; |
- int assigned_slot_; |
DISALLOW_COPY_AND_ASSIGN(SpillRange); |
}; |
@@ -558,12 +549,7 @@ |
const char* debug_name() const { return debug_name_; } |
const RegisterConfiguration* config() const { return config_; } |
- MachineType MachineTypeFor(int virtual_register); |
- |
LiveRange* LiveRangeFor(int index); |
- // Creates a new live range. |
- LiveRange* NewLiveRange(int index, MachineType machine_type); |
- LiveRange* NewChildRangeFor(LiveRange* range); |
SpillRange* AssignSpillRangeToLiveRange(LiveRange* range); |
@@ -576,6 +562,9 @@ |
} |
bool ExistsUseWithoutDefinition(); |
+ |
+ // Creates a new live range. |
+ LiveRange* NewLiveRange(int index); |
void MarkAllocated(RegisterKind kind, int index); |
@@ -597,7 +586,6 @@ |
ZoneVector<SpillRange*> spill_ranges_; |
BitVector* assigned_registers_; |
BitVector* assigned_double_registers_; |
- int virtual_register_count_; |
DISALLOW_COPY_AND_ASSIGN(RegisterAllocationData); |
}; |
@@ -675,6 +663,9 @@ |
void MapPhiHint(InstructionOperand* operand, UsePosition* use_pos); |
void ResolvePhiHint(InstructionOperand* operand, UsePosition* use_pos); |
+ |
+ // Returns the register kind required by the given virtual register. |
+ RegisterKind RequiredRegisterKind(int virtual_register) const; |
UsePosition* NewUsePosition(LifetimePosition pos, InstructionOperand* operand, |
void* hint, UsePositionHintType hint_type); |