Index: src/compiler/pipeline.cc |
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc |
index 5d8135e811e333ebf2a065f4168579aa8a1203e5..ef1c83fcb81d3fcd5f7a587990ce315d009a3ce4 100644 |
--- a/src/compiler/pipeline.cc |
+++ b/src/compiler/pipeline.cc |
@@ -81,7 +81,9 @@ class PipelineData { |
instruction_zone_(instruction_zone_scope_.zone()), |
sequence_(nullptr), |
frame_(nullptr), |
- register_allocator_(nullptr) { |
+ register_allocation_zone_scope_(zone_pool_), |
+ register_allocation_zone_(register_allocation_zone_scope_.zone()), |
+ register_allocation_data_(nullptr) { |
PhaseScope scope(pipeline_statistics, "init pipeline data"); |
graph_ = new (graph_zone_) Graph(graph_zone_); |
source_positions_.Reset(new SourcePositionTable(graph_)); |
@@ -121,7 +123,9 @@ class PipelineData { |
instruction_zone_(instruction_zone_scope_.zone()), |
sequence_(nullptr), |
frame_(nullptr), |
- register_allocator_(nullptr) {} |
+ register_allocation_zone_scope_(zone_pool_), |
+ register_allocation_zone_(register_allocation_zone_scope_.zone()), |
+ register_allocation_data_(nullptr) {} |
// For register allocation testing entry point. |
PipelineData(ZonePool* zone_pool, CompilationInfo* info, |
@@ -148,9 +152,12 @@ class PipelineData { |
instruction_zone_(sequence->zone()), |
sequence_(sequence), |
frame_(nullptr), |
- register_allocator_(nullptr) {} |
+ register_allocation_zone_scope_(zone_pool_), |
+ register_allocation_zone_(register_allocation_zone_scope_.zone()), |
+ register_allocation_data_(nullptr) {} |
~PipelineData() { |
+ DeleteRegisterAllocationZone(); |
DeleteInstructionZone(); |
DeleteGraphZone(); |
} |
@@ -200,7 +207,11 @@ class PipelineData { |
Zone* instruction_zone() const { return instruction_zone_; } |
InstructionSequence* sequence() const { return sequence_; } |
Frame* frame() const { return frame_; } |
- RegisterAllocator* register_allocator() const { return register_allocator_; } |
+ |
+ Zone* register_allocation_zone() const { return register_allocation_zone_; } |
+ RegisterAllocationData* register_allocation_data() const { |
+ return register_allocation_data_; |
+ } |
void DeleteGraphZone() { |
// Destroy objects with destructors first. |
@@ -226,11 +237,17 @@ class PipelineData { |
instruction_zone_ = nullptr; |
sequence_ = nullptr; |
frame_ = nullptr; |
- register_allocator_ = nullptr; |
+ } |
+ |
+ void DeleteRegisterAllocationZone() { |
+ if (register_allocation_zone_ == nullptr) return; |
+ register_allocation_zone_scope_.Destroy(); |
+ register_allocation_zone_ = nullptr; |
+ register_allocation_data_ = nullptr; |
} |
void InitializeInstructionSequence() { |
- DCHECK(!sequence_); |
+ DCHECK(sequence_ == nullptr); |
InstructionBlocks* instruction_blocks = |
InstructionSequence::InstructionBlocksFor(instruction_zone(), |
schedule()); |
@@ -238,14 +255,14 @@ class PipelineData { |
info()->isolate(), instruction_zone(), instruction_blocks); |
} |
- void InitializeRegisterAllocator(Zone* local_zone, |
- const RegisterConfiguration* config, |
- const char* debug_name) { |
- DCHECK(!register_allocator_); |
- DCHECK(!frame_); |
+ void InitializeLiveRangeBuilder(const RegisterConfiguration* config, |
+ const char* debug_name) { |
+ DCHECK(frame_ == nullptr); |
+ DCHECK(register_allocation_data_ == nullptr); |
frame_ = new (instruction_zone()) Frame(); |
- register_allocator_ = new (instruction_zone()) |
- RegisterAllocator(config, local_zone, frame(), sequence(), debug_name); |
+ register_allocation_data_ = new (register_allocation_zone()) |
+ RegisterAllocationData(config, register_allocation_zone(), frame(), |
+ sequence(), debug_name); |
} |
private: |
@@ -281,7 +298,13 @@ class PipelineData { |
Zone* instruction_zone_; |
InstructionSequence* sequence_; |
Frame* frame_; |
- RegisterAllocator* register_allocator_; |
+ |
+ // All objects in the following group of fields are allocated in |
+ // register_allocation_zone_. They are all set to NULL when the zone is |
+ // destroyed. |
+ ZonePool::Scope register_allocation_zone_scope_; |
+ Zone* register_allocation_zone_; |
+ RegisterAllocationData* register_allocation_data_; |
DISALLOW_COPY_AND_ASSIGN(PipelineData); |
}; |
@@ -693,7 +716,8 @@ struct MeetRegisterConstraintsPhase { |
static const char* phase_name() { return "meet register constraints"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->MeetRegisterConstraints(); |
+ LiveRangeBuilder builder(data->register_allocation_data()); |
+ builder.MeetRegisterConstraints(); |
} |
}; |
@@ -702,7 +726,8 @@ struct ResolvePhisPhase { |
static const char* phase_name() { return "resolve phis"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->ResolvePhis(); |
+ LiveRangeBuilder builder(data->register_allocation_data()); |
+ builder.ResolvePhis(); |
} |
}; |
@@ -711,7 +736,8 @@ struct BuildLiveRangesPhase { |
static const char* phase_name() { return "build live ranges"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->BuildLiveRanges(); |
+ LiveRangeBuilder builder(data->register_allocation_data()); |
+ builder.BuildLiveRanges(); |
} |
}; |
@@ -720,7 +746,9 @@ struct AllocateGeneralRegistersPhase { |
static const char* phase_name() { return "allocate general registers"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->AllocateGeneralRegisters(); |
+ LinearScanAllocator allocator(data->register_allocation_data(), |
+ GENERAL_REGISTERS); |
+ allocator.AllocateRegisters(); |
} |
}; |
@@ -729,7 +757,9 @@ struct AllocateDoubleRegistersPhase { |
static const char* phase_name() { return "allocate double registers"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->AllocateDoubleRegisters(); |
+ LinearScanAllocator allocator(data->register_allocation_data(), |
+ DOUBLE_REGISTERS); |
+ allocator.AllocateRegisters(); |
} |
}; |
@@ -738,7 +768,8 @@ struct AssignSpillSlotsPhase { |
static const char* phase_name() { return "assign spill slots"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->AssignSpillSlots(); |
+ OperandAssigner assigner(data->register_allocation_data()); |
+ assigner.AssignSpillSlots(); |
} |
}; |
@@ -747,7 +778,8 @@ struct CommitAssignmentPhase { |
static const char* phase_name() { return "commit assignment"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->CommitAssignment(); |
+ OperandAssigner assigner(data->register_allocation_data()); |
+ assigner.CommitAssignment(); |
} |
}; |
@@ -756,7 +788,8 @@ struct PopulateReferenceMapsPhase { |
static const char* phase_name() { return "populate pointer maps"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->PopulateReferenceMaps(); |
+ ReferenceMapPopulator populator(data->register_allocation_data()); |
+ populator.PopulateReferenceMaps(); |
} |
}; |
@@ -765,7 +798,8 @@ struct ConnectRangesPhase { |
static const char* phase_name() { return "connect ranges"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->ConnectRanges(); |
+ LiveRangeConnector connector(data->register_allocation_data()); |
+ connector.ConnectRanges(temp_zone); |
} |
}; |
@@ -774,7 +808,8 @@ struct ResolveControlFlowPhase { |
static const char* phase_name() { return "resolve control flow"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- data->register_allocator()->ResolveControlFlow(); |
+ LiveRangeConnector connector(data->register_allocation_data()); |
+ connector.ResolveControlFlow(); |
} |
}; |
@@ -1216,9 +1251,7 @@ void Pipeline::AllocateRegisters(const RegisterConfiguration* config, |
debug_name = GetDebugName(data->info()); |
#endif |
- ZonePool::Scope zone_scope(data->zone_pool()); |
- data->InitializeRegisterAllocator(zone_scope.zone(), config, |
- debug_name.get()); |
+ data->InitializeLiveRangeBuilder(config, debug_name.get()); |
if (info()->is_osr()) { |
OsrHelper osr_helper(info()); |
osr_helper.SetupFrame(data->frame()); |
@@ -1234,7 +1267,7 @@ void Pipeline::AllocateRegisters(const RegisterConfiguration* config, |
<< printable; |
} |
if (verifier != nullptr) { |
- CHECK(!data->register_allocator()->ExistsUseWithoutDefinition()); |
+ CHECK(!data->register_allocation_data()->ExistsUseWithoutDefinition()); |
} |
Run<AllocateGeneralRegistersPhase>(); |
Run<AllocateDoubleRegistersPhase>(); |
@@ -1262,8 +1295,11 @@ void Pipeline::AllocateRegisters(const RegisterConfiguration* config, |
if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { |
TurboCfgFile tcf(data->isolate()); |
- tcf << AsC1VAllocator("CodeGen", data->register_allocator()); |
+ tcf << AsC1VRegisterAllocationData("CodeGen", |
+ data->register_allocation_data()); |
} |
+ |
+ data->DeleteRegisterAllocationZone(); |
} |
} // namespace compiler |