Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1351)

Unified Diff: src/compiler/pipeline.cc

Issue 1094063002: [turbofan] split register allocator into little pieces (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/graph-visualizer.cc ('k') | src/compiler/register-allocator.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « src/compiler/graph-visualizer.cc ('k') | src/compiler/register-allocator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698