Chromium Code Reviews| Index: src/compiler/pipeline.cc |
| diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc |
| index a05e2b3e382657ebbe83e1e1ed0bdd7e333ad48a..edcb99ed020f14b3d371f2aa7d02efdf1362f2a8 100644 |
| --- a/src/compiler/pipeline.cc |
| +++ b/src/compiler/pipeline.cc |
| @@ -43,12 +43,14 @@ namespace compiler { |
| class PipelineData { |
| public: |
| - explicit PipelineData(CompilationInfo* info, ZonePool* zone_pool, |
| - PipelineStatistics* pipeline_statistics) |
| + PipelineData(CompilationInfo* info, ZonePool* zone_pool, |
| + PipelineStatistics* pipeline_statistics) |
| : isolate_(info->zone()->isolate()), |
| + info_(info), |
| outer_zone_(info->zone()), |
| zone_pool_(zone_pool), |
| pipeline_statistics_(pipeline_statistics), |
| + compilation_failed_(false), |
| graph_zone_scope_(zone_pool_), |
| graph_zone_(graph_zone_scope_.zone()), |
| graph_(new (graph_zone()) Graph(graph_zone())), |
| @@ -61,25 +63,30 @@ class PipelineData { |
| jsgraph_(new (graph_zone()) |
| JSGraph(graph(), common(), javascript(), machine())), |
| typer_(new Typer(graph(), info->context())), |
| - schedule_(NULL), |
| + context_node_(nullptr), |
| + schedule_(nullptr), |
| instruction_zone_scope_(zone_pool_), |
| instruction_zone_(instruction_zone_scope_.zone()) {} |
| + |
| // For machine graph testing only. |
| PipelineData(Graph* graph, Schedule* schedule, ZonePool* zone_pool) |
| : isolate_(graph->zone()->isolate()), |
| - outer_zone_(NULL), |
| + info_(nullptr), |
| + outer_zone_(nullptr), |
| zone_pool_(zone_pool), |
| - pipeline_statistics_(NULL), |
| + pipeline_statistics_(nullptr), |
| + compilation_failed_(false), |
| graph_zone_scope_(zone_pool_), |
| - graph_zone_(NULL), |
| + graph_zone_(nullptr), |
| graph_(graph), |
| source_positions_(new SourcePositionTable(graph)), |
| - machine_(NULL), |
| - common_(NULL), |
| - javascript_(NULL), |
| - jsgraph_(NULL), |
| - typer_(NULL), |
| + machine_(nullptr), |
| + common_(nullptr), |
| + javascript_(nullptr), |
| + jsgraph_(nullptr), |
| + typer_(nullptr), |
| + context_node_(nullptr), |
| schedule_(schedule), |
| instruction_zone_scope_(zone_pool_), |
| instruction_zone_(instruction_zone_scope_.zone()) {} |
| @@ -90,8 +97,11 @@ class PipelineData { |
| } |
| Isolate* isolate() const { return isolate_; } |
| + CompilationInfo* info() const { return info_; } |
| ZonePool* zone_pool() const { return zone_pool_; } |
| PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; } |
| + bool compilation_failed() const { return compilation_failed_; } |
| + void set_compilation_failed() { compilation_failed_ = true; } |
| Zone* graph_zone() const { return graph_zone_; } |
| Graph* graph() const { return graph_; } |
| @@ -103,9 +113,12 @@ class PipelineData { |
| JSOperatorBuilder* javascript() const { return javascript_; } |
| JSGraph* jsgraph() const { return jsgraph_; } |
| Typer* typer() const { return typer_.get(); } |
| + Node* context_node() const { return context_node_; } |
| + void set_context_node(Node* context_node) { context_node_ = context_node; } |
| + |
| Schedule* schedule() const { return schedule_; } |
| void set_schedule(Schedule* schedule) { |
| - DCHECK_EQ(NULL, schedule_); |
| + DCHECK_EQ(nullptr, schedule_); |
| schedule_ = schedule; |
| } |
| @@ -115,18 +128,19 @@ class PipelineData { |
| void DeleteGraphZone() { |
| // Destroy objects with destructors first. |
| - source_positions_.Reset(NULL); |
| - typer_.Reset(NULL); |
| - if (graph_zone_ == NULL) return; |
| + source_positions_.Reset(nullptr); |
| + typer_.Reset(nullptr); |
| + if (graph_zone_ == nullptr) return; |
| // Destroy zone and clear pointers. |
| graph_zone_scope_.Destroy(); |
| - graph_zone_ = NULL; |
| - graph_ = NULL; |
| - machine_ = NULL; |
| - common_ = NULL; |
| - javascript_ = NULL; |
| - jsgraph_ = NULL; |
| - schedule_ = NULL; |
| + graph_zone_ = nullptr; |
| + graph_ = nullptr; |
| + machine_ = nullptr; |
| + common_ = nullptr; |
| + javascript_ = nullptr; |
| + jsgraph_ = nullptr; |
| + context_node_ = nullptr; |
| + schedule_ = nullptr; |
| } |
| void DeleteInstructionZone() { |
| @@ -137,9 +151,11 @@ class PipelineData { |
| private: |
| Isolate* isolate_; |
| + CompilationInfo* info_; |
| Zone* outer_zone_; |
| ZonePool* zone_pool_; |
| PipelineStatistics* pipeline_statistics_; |
| + bool compilation_failed_; |
| ZonePool::Scope graph_zone_scope_; |
| Zone* graph_zone_; |
| @@ -154,6 +170,7 @@ class PipelineData { |
| JSGraph* jsgraph_; |
| // TODO(dcarney): make this into a ZoneObject. |
| SmartPointer<Typer> typer_; |
| + Node* context_node_; |
| Schedule* schedule_; |
| // All objects in the following group of fields are allocated in |
| @@ -182,18 +199,221 @@ struct TurboCfgFile : public std::ofstream { |
| }; |
| -void Pipeline::VerifyAndPrintGraph( |
| - Graph* graph, const char* phase, bool untyped) { |
| - if (FLAG_trace_turbo) { |
| +static void TraceSchedule(Schedule* schedule) { |
| + if (!FLAG_trace_turbo) return; |
| + OFStream os(stdout); |
| + os << "-- Schedule --------------------------------------\n" << *schedule; |
| +} |
| + |
| + |
| +static SmartArrayPointer<char> GetDebugName(CompilationInfo* info) { |
| + SmartArrayPointer<char> name; |
| + if (info->IsStub()) { |
| + if (info->code_stub() != NULL) { |
| + CodeStub::Major major_key = info->code_stub()->MajorKey(); |
| + const char* major_name = CodeStub::MajorName(major_key, false); |
| + size_t len = strlen(major_name); |
| + name.Reset(new char[len]); |
| + memcpy(name.get(), major_name, len); |
| + } |
| + } else { |
| + AllowHandleDereference allow_deref; |
| + name = info->function()->debug_name()->ToCString(); |
| + } |
| + return name; |
| +} |
| + |
| + |
| +class AstGraphBuilderWithPositions : public AstGraphBuilder { |
| + public: |
| + explicit AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, |
| + JSGraph* jsgraph, |
| + SourcePositionTable* source_positions) |
| + : AstGraphBuilder(local_zone, info, jsgraph), |
| + source_positions_(source_positions) {} |
| + |
| + bool CreateGraph() { |
| + SourcePositionTable::Scope pos(source_positions_, |
| + SourcePosition::Unknown()); |
| + return AstGraphBuilder::CreateGraph(); |
| + } |
| + |
| +#define DEF_VISIT(type) \ |
| + virtual void Visit##type(type* node) OVERRIDE { \ |
| + SourcePositionTable::Scope pos(source_positions_, \ |
| + SourcePosition(node->position())); \ |
| + AstGraphBuilder::Visit##type(node); \ |
| + } |
| + AST_NODE_LIST(DEF_VISIT) |
| +#undef DEF_VISIT |
| + |
| + Node* GetFunctionContext() { return AstGraphBuilder::GetFunctionContext(); } |
| + |
| + private: |
| + SourcePositionTable* source_positions_; |
| +}; |
| + |
| + |
| +struct GraphBuilderPhase { |
| + void Run(PipelineData* data) { |
|
titzer
2014/11/14 14:03:40
I like this a lot better!
Can we pull the phase_s
|
| + PhaseScope phase_scope(data->pipeline_statistics(), "graph builder"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + AstGraphBuilderWithPositions graph_builder(zone_scope.zone(), data->info(), |
| + data->jsgraph(), |
| + data->source_positions()); |
| + if (!graph_builder.CreateGraph()) { |
| + data->set_compilation_failed(); |
| + return; |
| + } |
| + data->set_context_node(graph_builder.GetFunctionContext()); |
| + } |
| +}; |
| + |
| + |
| +struct ContextSpecializerPhase { |
| + void Run(PipelineData* data) { |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + JSContextSpecializer spec(data->info(), data->jsgraph(), |
| + data->context_node()); |
| + spec.SpecializeToContext(); |
| + } |
| +}; |
| + |
| + |
| +struct InliningPhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "inlining"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + JSInliner inliner(zone_scope.zone(), data->info(), data->jsgraph()); |
| + inliner.Inline(); |
| + } |
| +}; |
| + |
| + |
| +struct TyperPhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "typer"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + data->typer()->Run(); |
| + } |
| +}; |
| + |
| + |
| +struct TypedLoweringPhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "typed lowering"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + ValueNumberingReducer vn_reducer(data->graph_zone()); |
| + JSTypedLowering lowering(data->jsgraph()); |
| + SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
| + GraphReducer graph_reducer(data->graph()); |
| + graph_reducer.AddReducer(&vn_reducer); |
| + graph_reducer.AddReducer(&lowering); |
| + graph_reducer.AddReducer(&simple_reducer); |
| + graph_reducer.ReduceGraph(); |
| + } |
| +}; |
| + |
| + |
| +struct SimplifiedLoweringPhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "simplified lowering"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + SimplifiedLowering lowering(data->jsgraph()); |
| + lowering.LowerAllNodes(); |
| + ValueNumberingReducer vn_reducer(data->graph_zone()); |
| + SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
| + GraphReducer graph_reducer(data->graph()); |
| + graph_reducer.AddReducer(&vn_reducer); |
| + graph_reducer.AddReducer(&simple_reducer); |
| + graph_reducer.ReduceGraph(); |
| + } |
| +}; |
| + |
| + |
| +struct ChangeLoweringPhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "change lowering"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + Linkage linkage(data->graph_zone(), data->info()); |
| + ValueNumberingReducer vn_reducer(data->graph_zone()); |
| + SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
| + ChangeLowering lowering(data->jsgraph(), &linkage); |
| + MachineOperatorReducer mach_reducer(data->jsgraph()); |
| + GraphReducer graph_reducer(data->graph()); |
| + // TODO(titzer): Figure out if we should run all reducers at once here. |
| + graph_reducer.AddReducer(&vn_reducer); |
| + graph_reducer.AddReducer(&simple_reducer); |
| + graph_reducer.AddReducer(&lowering); |
| + graph_reducer.AddReducer(&mach_reducer); |
| + graph_reducer.ReduceGraph(); |
| + } |
| +}; |
| + |
| + |
| +struct ControlReductionPhase { |
| + void Run(PipelineData* data, const char* phase_name) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), phase_name); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + ControlReducer::ReduceGraph(zone_scope.zone(), data->jsgraph(), |
| + data->common()); |
| + } |
| +}; |
| + |
| + |
| +struct GenericLoweringPhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "generic lowering"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + JSGenericLowering generic(data->info(), data->jsgraph()); |
| + SelectLowering select(data->jsgraph()->graph(), data->jsgraph()->common()); |
| + GraphReducer graph_reducer(data->graph()); |
| + graph_reducer.AddReducer(&generic); |
| + graph_reducer.AddReducer(&select); |
| + graph_reducer.ReduceGraph(); |
| + } |
| +}; |
| + |
| + |
| +struct ComputeSchedulePhase { |
| + void Run(PipelineData* data) { |
| + PhaseScope phase_scope(data->pipeline_statistics(), "scheduling"); |
| + ZonePool::Scope zone_scope(data->zone_pool()); |
| + Schedule* schedule = |
| + Scheduler::ComputeSchedule(zone_scope.zone(), data->graph()); |
| + TraceSchedule(schedule); |
| + if (VerifyGraphs()) ScheduleVerifier::Run(schedule); |
| + data->set_schedule(schedule); |
| + } |
| +}; |
| + |
| + |
| +struct PrintGraphPhase { |
| + void Run(PipelineData* data, const char* phase) { |
| + CompilationInfo* info = data->info(); |
| + Graph* graph = data->graph(); |
| char buffer[256]; |
| Vector<char> filename(buffer, sizeof(buffer)); |
| SmartArrayPointer<char> functionname; |
| - if (!info_->shared_info().is_null()) { |
| - functionname = info_->shared_info()->DebugName()->ToCString(); |
| + if (!info->shared_info().is_null()) { |
| + functionname = info->shared_info()->DebugName()->ToCString(); |
| if (strlen(functionname.get()) > 0) { |
| SNPrintF(filename, "turbo-%s-%s", functionname.get(), phase); |
| } else { |
| - SNPrintF(filename, "turbo-%p-%s", static_cast<void*>(info_), phase); |
| + SNPrintF(filename, "turbo-%p-%s", static_cast<void*>(info), phase); |
| } |
| } else { |
| SNPrintF(filename, "turbo-none-%s", phase); |
| @@ -221,63 +441,25 @@ void Pipeline::VerifyAndPrintGraph( |
| os << "-- " << phase << " graph printed to file " << filename.start() |
| << "\n"; |
| } |
| - if (VerifyGraphs()) { |
| - Verifier::Run(graph, |
| - FLAG_turbo_types && !untyped ? Verifier::TYPED : Verifier::UNTYPED); |
| - } |
| -} |
| - |
| - |
| -class AstGraphBuilderWithPositions : public AstGraphBuilder { |
| - public: |
| - explicit AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, |
| - JSGraph* jsgraph, |
| - SourcePositionTable* source_positions) |
| - : AstGraphBuilder(local_zone, info, jsgraph), |
| - source_positions_(source_positions) {} |
| +}; |
| - bool CreateGraph() { |
| - SourcePositionTable::Scope pos(source_positions_, |
| - SourcePosition::Unknown()); |
| - return AstGraphBuilder::CreateGraph(); |
| - } |
| -#define DEF_VISIT(type) \ |
| - virtual void Visit##type(type* node) OVERRIDE { \ |
| - SourcePositionTable::Scope pos(source_positions_, \ |
| - SourcePosition(node->position())); \ |
| - AstGraphBuilder::Visit##type(node); \ |
| +struct VerifyGraphPhase { |
| + void Run(PipelineData* data, const bool untyped) { |
| + Verifier::Run(data->graph(), FLAG_turbo_types && !untyped |
| + ? Verifier::TYPED |
| + : Verifier::UNTYPED); |
| } |
| - AST_NODE_LIST(DEF_VISIT) |
| -#undef DEF_VISIT |
| - |
| - private: |
| - SourcePositionTable* source_positions_; |
| }; |
| -static void TraceSchedule(Schedule* schedule) { |
| - if (!FLAG_trace_turbo) return; |
| - OFStream os(stdout); |
| - os << "-- Schedule --------------------------------------\n" << *schedule; |
| -} |
| - |
| - |
| -static SmartArrayPointer<char> GetDebugName(CompilationInfo* info) { |
| - SmartArrayPointer<char> name; |
| - if (info->IsStub()) { |
| - if (info->code_stub() != NULL) { |
| - CodeStub::Major major_key = info->code_stub()->MajorKey(); |
| - const char* major_name = CodeStub::MajorName(major_key, false); |
| - size_t len = strlen(major_name); |
| - name.Reset(new char[len]); |
| - memcpy(name.get(), major_name, len); |
| - } |
| - } else { |
| - AllowHandleDereference allow_deref; |
| - name = info->function()->debug_name()->ToCString(); |
| +void Pipeline::RunPrintAndVerify(const char* phase, bool untyped) { |
| + if (FLAG_trace_turbo) { |
| + Run<PrintGraphPhase>(phase); |
| + } |
| + if (VerifyGraphs()) { |
| + Run<VerifyGraphPhase>(untyped); |
| } |
| - return name; |
| } |
| @@ -297,13 +479,16 @@ Handle<Code> Pipeline::GenerateCode() { |
| } |
| ZonePool zone_pool(isolate()); |
| - |
| SmartPointer<PipelineStatistics> pipeline_statistics; |
| + |
| if (FLAG_turbo_stats) { |
| pipeline_statistics.Reset(new PipelineStatistics(info(), &zone_pool)); |
| pipeline_statistics->BeginPhaseKind("graph creation"); |
| } |
| + PipelineData data(info(), &zone_pool, pipeline_statistics.get()); |
| + this->data_ = &data; |
| + |
| if (FLAG_trace_turbo) { |
| OFStream os(stdout); |
| os << "---------------------------------------------------\n" |
| @@ -313,56 +498,28 @@ Handle<Code> Pipeline::GenerateCode() { |
| tcf << AsC1VCompilation(info()); |
| } |
| - // Initialize the graph and builders. |
| - PipelineData data(info(), &zone_pool, pipeline_statistics.get()); |
| - |
| data.source_positions()->AddDecorator(); |
| - Node* context_node; |
| - { |
| - PhaseScope phase_scope(pipeline_statistics.get(), "graph builder"); |
| - ZonePool::Scope zone_scope(data.zone_pool()); |
| - AstGraphBuilderWithPositions graph_builder( |
| - zone_scope.zone(), info(), data.jsgraph(), data.source_positions()); |
| - if (!graph_builder.CreateGraph()) return Handle<Code>::null(); |
| - context_node = graph_builder.GetFunctionContext(); |
| - } |
| - |
| - VerifyAndPrintGraph(data.graph(), "Initial untyped", true); |
| + Run<GraphBuilderPhase>(); |
| + if (data.compilation_failed()) return Handle<Code>::null(); |
| + RunPrintAndVerify("Initial untyped", true); |
| - { |
| - PhaseScope phase_scope(pipeline_statistics.get(), |
| - "early control reduction"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - ZonePool::Scope zone_scope(data.zone_pool()); |
| - ControlReducer::ReduceGraph(zone_scope.zone(), data.jsgraph(), |
| - data.common()); |
| - |
| - VerifyAndPrintGraph(data.graph(), "Early Control reduced", true); |
| - } |
| + Run<ControlReductionPhase>("early control reduction"); |
| + RunPrintAndVerify("Early Control reduced", true); |
| if (info()->is_context_specializing()) { |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| // Specialize the code to the context as aggressively as possible. |
| - JSContextSpecializer spec(info(), data.jsgraph(), context_node); |
| - spec.SpecializeToContext(); |
| - VerifyAndPrintGraph(data.graph(), "Context specialized", true); |
| + Run<ContextSpecializerPhase>(); |
| + RunPrintAndVerify("Context specialized", true); |
| } |
| if (info()->is_inlining_enabled()) { |
| - PhaseScope phase_scope(pipeline_statistics.get(), "inlining"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - ZonePool::Scope zone_scope(data.zone_pool()); |
| - JSInliner inliner(zone_scope.zone(), info(), data.jsgraph()); |
| - inliner.Inline(); |
| - VerifyAndPrintGraph(data.graph(), "Inlined", true); |
| + Run<InliningPhase>(); |
| + RunPrintAndVerify("Inlined", true); |
| } |
| - // Print a replay of the initial graph. |
| if (FLAG_print_turbo_replay) { |
| + // Print a replay of the initial graph. |
| GraphReplayPrinter::PrintReplay(data.graph()); |
| } |
| @@ -370,110 +527,46 @@ Handle<Code> Pipeline::GenerateCode() { |
| if (!SupportedTarget()) return Handle<Code>::null(); |
| if (info()->is_typing_enabled()) { |
| - { |
| - // Type the graph. |
| - PhaseScope phase_scope(pipeline_statistics.get(), "typer"); |
| - data.typer()->Run(); |
| - VerifyAndPrintGraph(data.graph(), "Typed"); |
| - } |
| + // Type the graph. |
| + Run<TyperPhase>(); |
| + RunPrintAndVerify("Typed"); |
| } |
| if (!pipeline_statistics.is_empty()) { |
| - pipeline_statistics->BeginPhaseKind("lowering"); |
| + data.pipeline_statistics()->BeginPhaseKind("lowering"); |
| } |
| if (info()->is_typing_enabled()) { |
| - { |
| - // Lower JSOperators where we can determine types. |
| - PhaseScope phase_scope(pipeline_statistics.get(), "typed lowering"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - ValueNumberingReducer vn_reducer(data.graph_zone()); |
| - JSTypedLowering lowering(data.jsgraph()); |
| - SimplifiedOperatorReducer simple_reducer(data.jsgraph()); |
| - GraphReducer graph_reducer(data.graph()); |
| - graph_reducer.AddReducer(&vn_reducer); |
| - graph_reducer.AddReducer(&lowering); |
| - graph_reducer.AddReducer(&simple_reducer); |
| - graph_reducer.ReduceGraph(); |
| - |
| - VerifyAndPrintGraph(data.graph(), "Lowered typed"); |
| - } |
| - { |
| - // Lower simplified operators and insert changes. |
| - PhaseScope phase_scope(pipeline_statistics.get(), "simplified lowering"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - SimplifiedLowering lowering(data.jsgraph()); |
| - lowering.LowerAllNodes(); |
| - ValueNumberingReducer vn_reducer(data.graph_zone()); |
| - SimplifiedOperatorReducer simple_reducer(data.jsgraph()); |
| - GraphReducer graph_reducer(data.graph()); |
| - graph_reducer.AddReducer(&vn_reducer); |
| - graph_reducer.AddReducer(&simple_reducer); |
| - graph_reducer.ReduceGraph(); |
| - |
| - VerifyAndPrintGraph(data.graph(), "Lowered simplified"); |
| - } |
| - { |
| - // Lower changes that have been inserted before. |
| - PhaseScope phase_scope(pipeline_statistics.get(), "change lowering"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - Linkage linkage(data.graph_zone(), info()); |
| - ValueNumberingReducer vn_reducer(data.graph_zone()); |
| - SimplifiedOperatorReducer simple_reducer(data.jsgraph()); |
| - ChangeLowering lowering(data.jsgraph(), &linkage); |
| - MachineOperatorReducer mach_reducer(data.jsgraph()); |
| - GraphReducer graph_reducer(data.graph()); |
| - // TODO(titzer): Figure out if we should run all reducers at once here. |
| - graph_reducer.AddReducer(&vn_reducer); |
| - graph_reducer.AddReducer(&simple_reducer); |
| - graph_reducer.AddReducer(&lowering); |
| - graph_reducer.AddReducer(&mach_reducer); |
| - graph_reducer.ReduceGraph(); |
| - |
| - // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
| - VerifyAndPrintGraph(data.graph(), "Lowered changes", true); |
| - } |
| + // Lower JSOperators where we can determine types. |
| + Run<TypedLoweringPhase>(); |
| + RunPrintAndVerify("Lowered typed"); |
| - { |
| - PhaseScope phase_scope(pipeline_statistics.get(), |
| - "late control reduction"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - ZonePool::Scope zone_scope(data.zone_pool()); |
| - ControlReducer::ReduceGraph(zone_scope.zone(), data.jsgraph(), |
| - data.common()); |
| + // Lower simplified operators and insert changes. |
| + Run<SimplifiedLoweringPhase>(); |
| + RunPrintAndVerify("Lowered simplified"); |
| - VerifyAndPrintGraph(data.graph(), "Late Control reduced"); |
| - } |
| - } |
| + // Lower changes that have been inserted before. |
| + Run<ChangeLoweringPhase>(); |
| + // // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
| + RunPrintAndVerify("Lowered changes", true); |
| - { |
| - // Lower any remaining generic JSOperators. |
| - PhaseScope phase_scope(pipeline_statistics.get(), "generic lowering"); |
| - SourcePositionTable::Scope pos(data.source_positions(), |
| - SourcePosition::Unknown()); |
| - JSGenericLowering generic(info(), data.jsgraph()); |
| - SelectLowering select(data.jsgraph()->graph(), data.jsgraph()->common()); |
| - GraphReducer graph_reducer(data.graph()); |
| - graph_reducer.AddReducer(&generic); |
| - graph_reducer.AddReducer(&select); |
| - graph_reducer.ReduceGraph(); |
| - |
| - // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
| - VerifyAndPrintGraph(data.graph(), "Lowered generic", true); |
| + Run<ControlReductionPhase>("late control reduction"); |
| + RunPrintAndVerify("Late Control reduced"); |
| } |
| + // Lower any remaining generic JSOperators. |
| + Run<GenericLoweringPhase>(); |
| + // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
| + RunPrintAndVerify("Lowered generic", true); |
| + |
| if (!pipeline_statistics.is_empty()) { |
| - pipeline_statistics->BeginPhaseKind("block building"); |
| + data.pipeline_statistics()->BeginPhaseKind("block building"); |
| } |
| data.source_positions()->RemoveDecorator(); |
| // Compute a schedule. |
| - ComputeSchedule(&data); |
| + Run<ComputeSchedulePhase>(); |
| Handle<Code> code = Handle<Code>::null(); |
| { |
| @@ -497,27 +590,17 @@ Handle<Code> Pipeline::GenerateCode() { |
| } |
| -void Pipeline::ComputeSchedule(PipelineData* data) { |
| - PhaseScope phase_scope(data->pipeline_statistics(), "scheduling"); |
| - ZonePool::Scope zone_scope(data->zone_pool()); |
| - Schedule* schedule = |
| - Scheduler::ComputeSchedule(zone_scope.zone(), data->graph()); |
| - TraceSchedule(schedule); |
| - if (VerifyGraphs()) ScheduleVerifier::Run(schedule); |
| - data->set_schedule(schedule); |
| -} |
| - |
| - |
| Handle<Code> Pipeline::GenerateCodeForMachineGraph(Linkage* linkage, |
| Graph* graph, |
| Schedule* schedule) { |
| ZonePool zone_pool(isolate()); |
| CHECK(SupportedBackend()); |
| PipelineData data(graph, schedule, &zone_pool); |
| + this->data_ = &data; |
| if (schedule == NULL) { |
| // TODO(rossberg): Should this really be untyped? |
| - VerifyAndPrintGraph(graph, "Machine", true); |
| - ComputeSchedule(&data); |
| + RunPrintAndVerify("Machine", true); |
| + Run<ComputeSchedulePhase>(); |
| } else { |
| TraceSchedule(schedule); |
| } |