| 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
|
|
|