Index: src/compiler/register-allocator.h |
diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h |
index 067ed871c43b7c64cade3616518ea8bc9787d56e..45c33712de70bb3cc3e64d4988238e6bf736d336 100644 |
--- a/src/compiler/register-allocator.h |
+++ b/src/compiler/register-allocator.h |
@@ -12,8 +12,6 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
-class PipelineStatistics; |
- |
enum RegisterKind { |
UNALLOCATED_REGISTERS, |
GENERAL_REGISTERS, |
@@ -320,17 +318,14 @@ class LiveRange FINAL : public ZoneObject { |
}; |
-class RegisterAllocator FINAL { |
+class RegisterAllocator FINAL : public ZoneObject { |
public: |
explicit RegisterAllocator(const RegisterConfiguration* config, |
Zone* local_zone, Frame* frame, |
InstructionSequence* code, |
const char* debug_name = nullptr); |
- bool Allocate(PipelineStatistics* stats = NULL); |
bool AllocationOk() { return allocation_ok_; } |
- BitVector* assigned_registers() { return assigned_registers_; } |
- BitVector* assigned_double_registers() { return assigned_double_registers_; } |
const ZoneList<LiveRange*>& live_ranges() const { return live_ranges_; } |
const ZoneVector<LiveRange*>& fixed_live_ranges() const { |
@@ -343,6 +338,30 @@ class RegisterAllocator FINAL { |
// This zone is for datastructures only needed during register allocation. |
Zone* local_zone() const { return local_zone_; } |
+ // Phase 1 : insert moves to account for fixed register operands. |
+ void MeetRegisterConstraints(); |
+ |
+ // Phase 2: deconstruct SSA by inserting moves in successors and the headers |
+ // of blocks containing phis. |
+ void ResolvePhis(); |
+ |
+ // Phase 3: compute liveness of all virtual register. |
+ void BuildLiveRanges(); |
+ bool ExistsUseWithoutDefinition(); |
+ |
+ // Phase 4: compute register assignments. |
+ void AllocateGeneralRegisters(); |
+ void AllocateDoubleRegisters(); |
+ |
+ // Phase 5: compute values for pointer maps. |
+ void PopulatePointerMaps(); // TODO(titzer): rename to PopulateReferenceMaps. |
+ |
+ // Phase 6: reconnect split ranges with moves. |
+ void ConnectRanges(); |
+ |
+ // Phase 7: insert moves to connect ranges across basic blocks. |
+ void ResolveControlFlow(); |
+ |
private: |
int GetVirtualRegister() { |
int vreg = code()->NextVirtualRegister(); |
@@ -365,18 +384,13 @@ class RegisterAllocator FINAL { |
// allocation. |
Zone* code_zone() const { return code()->zone(); } |
+ BitVector* assigned_registers() { return assigned_registers_; } |
+ BitVector* assigned_double_registers() { return assigned_double_registers_; } |
+ |
#ifdef DEBUG |
void Verify() const; |
#endif |
- void MeetRegisterConstraints(); |
- void ResolvePhis(); |
- void BuildLiveRanges(); |
- void AllocateGeneralRegisters(); |
- void AllocateDoubleRegisters(); |
- void ConnectRanges(); |
- void ResolveControlFlow(); |
- void PopulatePointerMaps(); // TODO(titzer): rename to PopulateReferenceMaps. |
void AllocateRegisters(); |
bool CanEagerlyResolveControlFlow(const InstructionBlock* block) const; |
bool SafePointsAreInOrder() const; |
@@ -388,7 +402,6 @@ class RegisterAllocator FINAL { |
bool IsOutputRegisterOf(Instruction* instr, int index); |
bool IsOutputDoubleRegisterOf(Instruction* instr, int index); |
void ProcessInstructions(const InstructionBlock* block, BitVector* live); |
- bool ExistsUseWithoutDefinition(); |
void MeetRegisterConstraints(const InstructionBlock* block); |
void MeetConstraintsBetween(Instruction* first, Instruction* second, |
int gap_index); |