Index: src/compiler/register-allocator.h |
diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h |
index d968258ce725881be5e3366f253cdd0829a56cb9..0495f0f38ac5d76663cde6a8186e3700d5efdf15 100644 |
--- a/src/compiler/register-allocator.h |
+++ b/src/compiler/register-allocator.h |
@@ -138,8 +138,11 @@ class UseInterval final : public ZoneObject { |
} |
LifetimePosition start() const { return start_; } |
+ void set_start(LifetimePosition start) { start_ = start; } |
LifetimePosition end() const { return end_; } |
+ void set_end(LifetimePosition end) { end_ = end; } |
UseInterval* next() const { return next_; } |
+ void set_next(UseInterval* next) { next_ = next; } |
// Split this interval at the given position without effecting the |
// live range that owns it. The interval must contain the position. |
@@ -157,14 +160,11 @@ class UseInterval final : public ZoneObject { |
return start_.Value() <= point.Value() && point.Value() < end_.Value(); |
} |
- void set_start(LifetimePosition start) { start_ = start; } |
- void set_next(UseInterval* next) { next_ = next; } |
- |
+ private: |
LifetimePosition start_; |
LifetimePosition end_; |
UseInterval* next_; |
- private: |
DISALLOW_COPY_AND_ASSIGN(UseInterval); |
}; |
@@ -194,14 +194,14 @@ class UsePosition final : public ZoneObject { |
void set_next(UsePosition* next) { next_ = next; } |
void set_type(UsePositionType type, bool register_beneficial); |
+ private: |
+ typedef BitField8<UsePositionType, 0, 2> TypeField; |
+ typedef BitField8<bool, 2, 1> RegisterBeneficialField; |
+ |
InstructionOperand* const operand_; |
InstructionOperand* const hint_; |
LifetimePosition const pos_; |
UsePosition* next_; |
- |
- private: |
- typedef BitField8<UsePositionType, 0, 2> TypeField; |
- typedef BitField8<bool, 2, 1> RegisterBeneficialField; |
uint8_t flags_; |
DISALLOW_COPY_AND_ASSIGN(UsePosition); |
@@ -216,7 +216,7 @@ class LiveRange final : public ZoneObject { |
public: |
static const int kInvalidAssignment = 0x7fffffff; |
- LiveRange(int id, Zone* zone); |
+ explicit LiveRange(int id); |
UseInterval* first_interval() const { return first_interval_; } |
UsePosition* first_pos() const { return first_pos_; } |
@@ -302,10 +302,12 @@ class LiveRange final : public ZoneObject { |
enum class SpillType { kNoSpillType, kSpillOperand, kSpillRange }; |
SpillType spill_type() const { return spill_type_; } |
InstructionOperand* GetSpillOperand() const { |
- return spill_type_ == SpillType::kSpillOperand ? spill_operand_ : nullptr; |
+ DCHECK(spill_type_ == SpillType::kSpillOperand); |
+ return spill_operand_; |
} |
SpillRange* GetSpillRange() const { |
- return spill_type_ == SpillType::kSpillRange ? spill_range_ : nullptr; |
+ DCHECK(spill_type_ == SpillType::kSpillRange); |
+ return spill_range_; |
} |
bool HasNoSpillType() const { return spill_type_ == SpillType::kNoSpillType; } |
bool HasSpillOperand() const { |
@@ -461,7 +463,9 @@ class RegisterAllocationData final : public ZoneObject { |
void SetLiveRangeAssignedRegister(LiveRange* range, int reg); |
LiveRange* LiveRangeFor(int index); |
- Instruction* InstructionAt(int index) { return code()->InstructionAt(index); } |
+ Instruction* InstructionAt(int index) const { |
+ return code()->InstructionAt(index); |
+ } |
void AssignPhiInput(LiveRange* range, const InstructionOperand& assignment); |
SpillRange* AssignSpillRangeToLiveRange(LiveRange* range); |
@@ -470,17 +474,6 @@ class RegisterAllocationData final : public ZoneObject { |
const InstructionOperand& from, |
const InstructionOperand& to); |
- bool IsBlockBoundary(LifetimePosition pos) { |
- return pos.IsFullStart() && |
- code() |
- ->GetInstructionBlock(pos.ToInstructionIndex()) |
- ->code_start() == pos.ToInstructionIndex(); |
- } |
- |
- const InstructionBlock* GetInstructionBlock(LifetimePosition pos) const { |
- return code()->GetInstructionBlock(pos.ToInstructionIndex()); |
- } |
- |
bool IsReference(int virtual_register) const { |
return code()->IsReference(virtual_register); |
} |
@@ -589,7 +582,8 @@ class LiveRangeBuilder final : public ZoneObject { |
class LinearScanAllocator final : public ZoneObject { |
public: |
- explicit LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind); |
+ LinearScanAllocator(RegisterAllocationData* data, RegisterKind kind, |
+ Zone* local_zone); |
// Phase 4: compute register assignments. |
void AllocateRegisters(); |
@@ -600,15 +594,24 @@ class LinearScanAllocator final : public ZoneObject { |
Zone* allocation_zone() const { return data()->allocation_zone(); } |
Zone* code_zone() const { return code()->zone(); } |
const RegisterConfiguration* config() const { return data()->config(); } |
+ int num_registers() const { return num_registers_; } |
+ const char* RegisterName(int allocation_index) const; |
- Instruction* InstructionAt(int index) { return code()->InstructionAt(index); } |
- |
- int GetVirtualRegister() { return code()->NextVirtualRegister(); } |
+ ZoneVector<LiveRange*>& live_ranges() { return data()->live_ranges(); } |
+ ZoneVector<LiveRange*>& unhandled_live_ranges() { |
+ return unhandled_live_ranges_; |
+ } |
+ ZoneVector<LiveRange*>& active_live_ranges() { return active_live_ranges_; } |
+ ZoneVector<LiveRange*>& inactive_live_ranges() { |
+ return inactive_live_ranges_; |
+ } |
+ ZoneVector<SpillRange*>& spill_ranges() { return data()->spill_ranges(); } |
+ RegisterAllocationData::PhiMap& phi_map() { return data()->phi_map(); } |
+ Instruction* InstructionAt(int index) { return code()->InstructionAt(index); } |
bool IsReference(int virtual_register) const { |
return data()->IsReference(virtual_register); |
} |
- |
LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); } |
// Helper methods for updating the life range lists. |
@@ -648,6 +651,8 @@ class LinearScanAllocator final : public ZoneObject { |
LifetimePosition FindOptimalSplitPos(LifetimePosition start, |
LifetimePosition end); |
+ void Spill(LiveRange* range); |
+ |
// Spill the given life range after position pos. |
void SpillAfter(LiveRange* range, LifetimePosition pos); |
@@ -667,38 +672,6 @@ class LinearScanAllocator final : public ZoneObject { |
LifetimePosition FindOptimalSpillingPos(LiveRange* range, |
LifetimePosition pos); |
- void Spill(LiveRange* range); |
- |
- // Return the block which contains give lifetime position. |
- const InstructionBlock* GetInstructionBlock(LifetimePosition pos) const { |
- return data()->GetInstructionBlock(pos); |
- } |
- |
- void SetLiveRangeAssignedRegister(LiveRange* range, int reg) { |
- data()->SetLiveRangeAssignedRegister(range, reg); |
- } |
- |
- // Helper methods for the fixed registers. |
- int RegisterCount() const { return num_registers_; } |
- const char* RegisterName(int allocation_index); |
- |
- ZoneVector<LiveRange*>& live_ranges() { return data()->live_ranges(); } |
- ZoneVector<LiveRange*>& fixed_live_ranges() { |
- return data()->fixed_live_ranges(); |
- } |
- ZoneVector<LiveRange*>& fixed_double_live_ranges() { |
- return data()->fixed_double_live_ranges(); |
- } |
- ZoneVector<LiveRange*>& unhandled_live_ranges() { |
- return unhandled_live_ranges_; |
- } |
- ZoneVector<LiveRange*>& active_live_ranges() { return active_live_ranges_; } |
- ZoneVector<LiveRange*>& inactive_live_ranges() { |
- return inactive_live_ranges_; |
- } |
- ZoneVector<SpillRange*>& spill_ranges() { return data()->spill_ranges(); } |
- RegisterAllocationData::PhiMap& phi_map() { return data()->phi_map(); } |
- |
RegisterAllocationData* const data_; |
const RegisterKind mode_; |
const int num_registers_; |
@@ -761,15 +734,12 @@ class LiveRangeConnector final : public ZoneObject { |
explicit LiveRangeConnector(RegisterAllocationData* data); |
// Phase 8: reconnect split ranges with moves. |
- void ConnectRanges(Zone* temp_zone); |
+ void ConnectRanges(Zone* local_zone); |
// Phase 9: insert moves to connect ranges across basic blocks. |
- void ResolveControlFlow(); |
+ void ResolveControlFlow(Zone* local_zone); |
private: |
- const InstructionBlock* GetInstructionBlock(LifetimePosition pos) const { |
- return data()->GetInstructionBlock(pos); |
- } |
bool CanEagerlyResolveControlFlow(const InstructionBlock* block) const; |
void ResolveControlFlow(const InstructionBlock* block, |
const InstructionOperand& cur_op, |