Chromium Code Reviews| Index: src/compiler/pipeline.cc |
| diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc |
| index 223ca8f02f380d35fcd7cae7e7accbb4b66f2506..7e75096fa0bba4d0e9d5d59cd8893d8e76961f85 100644 |
| --- a/src/compiler/pipeline.cc |
| +++ b/src/compiler/pipeline.cc |
| @@ -25,6 +25,7 @@ |
| #include "src/compiler/js-generic-lowering.h" |
| #include "src/compiler/js-inlining.h" |
| #include "src/compiler/js-intrinsic-lowering.h" |
| +#include "src/compiler/js-type-feedback.h" |
| #include "src/compiler/js-typed-lowering.h" |
| #include "src/compiler/jump-threading.h" |
| #include "src/compiler/load-elimination.h" |
| @@ -46,6 +47,7 @@ |
| #include "src/compiler/verifier.h" |
| #include "src/compiler/zone-pool.h" |
| #include "src/ostreams.h" |
| +#include "src/type-info.h" |
| #include "src/utils.h" |
| namespace v8 { |
| @@ -72,6 +74,7 @@ class PipelineData { |
| common_(nullptr), |
| javascript_(nullptr), |
| jsgraph_(nullptr), |
| + js_type_feedback_(nullptr), |
| typer_(nullptr), |
| schedule_(nullptr), |
| instruction_zone_scope_(zone_pool_), |
| @@ -111,6 +114,7 @@ class PipelineData { |
| common_(nullptr), |
| javascript_(nullptr), |
| jsgraph_(nullptr), |
| + js_type_feedback_(nullptr), |
| typer_(nullptr), |
| schedule_(schedule), |
| instruction_zone_scope_(zone_pool_), |
| @@ -137,6 +141,7 @@ class PipelineData { |
| common_(nullptr), |
| javascript_(nullptr), |
| jsgraph_(nullptr), |
| + js_type_feedback_(nullptr), |
| typer_(nullptr), |
| schedule_(nullptr), |
| instruction_zone_scope_(zone_pool_), |
| @@ -174,6 +179,10 @@ class PipelineData { |
| CommonOperatorBuilder* common() const { return common_; } |
| JSOperatorBuilder* javascript() const { return javascript_; } |
| JSGraph* jsgraph() const { return jsgraph_; } |
| + JSTypeFeedbackTable* js_type_feedback() { return js_type_feedback_; } |
| + void set_js_type_feedback(JSTypeFeedbackTable* js_type_feedback) { |
| + js_type_feedback_ = js_type_feedback; |
| + } |
| Typer* typer() const { return typer_.get(); } |
| LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; } |
| @@ -259,6 +268,7 @@ class PipelineData { |
| CommonOperatorBuilder* common_; |
| JSOperatorBuilder* javascript_; |
| JSGraph* jsgraph_; |
| + JSTypeFeedbackTable* js_type_feedback_; |
|
Michael Starzinger
2015/03/24 09:06:40
nit: If the feedback table lives in this block, it
titzer
2015/03/24 10:49:32
Done.
|
| // TODO(dcarney): make this into a ZoneObject. |
| SmartPointer<Typer> typer_; |
| Schedule* schedule_; |
| @@ -310,8 +320,10 @@ class AstGraphBuilderWithPositions : public AstGraphBuilder { |
| AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, |
| JSGraph* jsgraph, |
| LoopAssignmentAnalysis* loop_assignment, |
| + JSTypeFeedbackTable* js_type_feedback, |
| SourcePositionTable* source_positions) |
| - : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment), |
| + : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment, |
| + js_type_feedback), |
| source_positions_(source_positions), |
| start_position_(info->shared_info()->start_position()) {} |
| @@ -419,7 +431,7 @@ struct GraphBuilderPhase { |
| void Run(PipelineData* data, Zone* temp_zone, bool constant_context) { |
| AstGraphBuilderWithPositions graph_builder( |
| temp_zone, data->info(), data->jsgraph(), data->loop_assignment(), |
| - data->source_positions()); |
| + data->js_type_feedback(), data->source_positions()); |
| bool stack_check = !data->info()->IsStub(); |
| if (!graph_builder.CreateGraph(constant_context, stack_check)) { |
| data->set_compilation_failed(); |
| @@ -480,6 +492,25 @@ struct OsrDeconstructionPhase { |
| }; |
| +struct JSTypeFeedbackPhase { |
| + static const char* phase_name() { return "type feedback specializing"; } |
| + |
| + void Run(PipelineData* data, Zone* temp_zone) { |
| + SourcePositionTable::Scope pos(data->source_positions(), |
| + SourcePosition::Unknown()); |
| + Handle<Context> native_context(data->info()->context()->native_context()); |
| + TypeFeedbackOracle oracle(data->isolate(), temp_zone, |
| + data->info()->unoptimized_code(), |
| + data->info()->feedback_vector(), native_context); |
| + GraphReducer graph_reducer(data->graph(), temp_zone); |
| + JSTypeFeedbackSpecializer specializer(data->jsgraph(), |
| + data->js_type_feedback(), &oracle); |
| + AddReducer(data, &graph_reducer, &specializer); |
| + graph_reducer.ReduceGraph(); |
| + } |
| +}; |
| + |
| + |
| struct TypedLoweringPhase { |
| static const char* phase_name() { return "typed lowering"; } |
| @@ -884,6 +915,11 @@ Handle<Code> Pipeline::GenerateCode() { |
| PipelineData data(&zone_pool, info(), pipeline_statistics.get()); |
| this->data_ = &data; |
| + if (info()->is_type_feedback_enabled()) { |
| + data.set_js_type_feedback(new (data.graph_zone()) |
| + JSTypeFeedbackTable(data.graph_zone())); |
| + } |
| + |
| BeginPhaseKind("graph creation"); |
| if (FLAG_trace_turbo) { |
| @@ -951,6 +987,11 @@ Handle<Code> Pipeline::GenerateCode() { |
| RunPrintAndVerify("OSR deconstruction"); |
| } |
| + if (info()->is_type_feedback_enabled()) { |
| + Run<JSTypeFeedbackPhase>(); |
| + RunPrintAndVerify("JSType feedback"); |
| + } |
| + |
| // Lower simplified operators and insert changes. |
| Run<SimplifiedLoweringPhase>(); |
| RunPrintAndVerify("Lowered simplified"); |
| @@ -963,7 +1004,7 @@ Handle<Code> Pipeline::GenerateCode() { |
| // Lower changes that have been inserted before. |
| Run<ChangeLoweringPhase>(); |
| - // // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
| + // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
| RunPrintAndVerify("Lowered changes", true); |
| Run<LateControlReductionPhase>(); |