OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/pipeline.h" | 5 #include "src/compiler/pipeline.h" |
6 | 6 |
7 #include <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/base/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
11 #include "src/compiler/ast-graph-builder.h" | 11 #include "src/compiler/ast-graph-builder.h" |
| 12 #include "src/compiler/ast-loop-assignment-analyzer.h" |
12 #include "src/compiler/basic-block-instrumentor.h" | 13 #include "src/compiler/basic-block-instrumentor.h" |
13 #include "src/compiler/change-lowering.h" | 14 #include "src/compiler/change-lowering.h" |
14 #include "src/compiler/code-generator.h" | 15 #include "src/compiler/code-generator.h" |
15 #include "src/compiler/control-reducer.h" | 16 #include "src/compiler/control-reducer.h" |
16 #include "src/compiler/graph-replay.h" | 17 #include "src/compiler/graph-replay.h" |
17 #include "src/compiler/graph-visualizer.h" | 18 #include "src/compiler/graph-visualizer.h" |
18 #include "src/compiler/instruction.h" | 19 #include "src/compiler/instruction.h" |
19 #include "src/compiler/instruction-selector.h" | 20 #include "src/compiler/instruction-selector.h" |
20 #include "src/compiler/js-context-specialization.h" | 21 #include "src/compiler/js-context-specialization.h" |
21 #include "src/compiler/js-generic-lowering.h" | 22 #include "src/compiler/js-generic-lowering.h" |
(...skipping 28 matching lines...) Expand all Loading... |
50 : isolate_(info->zone()->isolate()), | 51 : isolate_(info->zone()->isolate()), |
51 info_(info), | 52 info_(info), |
52 outer_zone_(nullptr), | 53 outer_zone_(nullptr), |
53 zone_pool_(zone_pool), | 54 zone_pool_(zone_pool), |
54 pipeline_statistics_(nullptr), | 55 pipeline_statistics_(nullptr), |
55 compilation_failed_(false), | 56 compilation_failed_(false), |
56 code_(Handle<Code>::null()), | 57 code_(Handle<Code>::null()), |
57 graph_zone_scope_(zone_pool_), | 58 graph_zone_scope_(zone_pool_), |
58 graph_zone_(nullptr), | 59 graph_zone_(nullptr), |
59 graph_(nullptr), | 60 graph_(nullptr), |
| 61 loop_assignment_(nullptr), |
60 machine_(nullptr), | 62 machine_(nullptr), |
61 common_(nullptr), | 63 common_(nullptr), |
62 javascript_(nullptr), | 64 javascript_(nullptr), |
63 jsgraph_(nullptr), | 65 jsgraph_(nullptr), |
64 typer_(nullptr), | 66 typer_(nullptr), |
65 context_node_(nullptr), | 67 context_node_(nullptr), |
66 schedule_(nullptr), | 68 schedule_(nullptr), |
67 instruction_zone_scope_(zone_pool_), | 69 instruction_zone_scope_(zone_pool_), |
68 instruction_zone_(nullptr), | 70 instruction_zone_(nullptr), |
69 sequence_(nullptr), | 71 sequence_(nullptr), |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 Graph* graph() const { return graph_; } | 129 Graph* graph() const { return graph_; } |
128 SourcePositionTable* source_positions() const { | 130 SourcePositionTable* source_positions() const { |
129 return source_positions_.get(); | 131 return source_positions_.get(); |
130 } | 132 } |
131 MachineOperatorBuilder* machine() const { return machine_; } | 133 MachineOperatorBuilder* machine() const { return machine_; } |
132 CommonOperatorBuilder* common() const { return common_; } | 134 CommonOperatorBuilder* common() const { return common_; } |
133 JSOperatorBuilder* javascript() const { return javascript_; } | 135 JSOperatorBuilder* javascript() const { return javascript_; } |
134 JSGraph* jsgraph() const { return jsgraph_; } | 136 JSGraph* jsgraph() const { return jsgraph_; } |
135 Typer* typer() const { return typer_.get(); } | 137 Typer* typer() const { return typer_.get(); } |
136 | 138 |
| 139 LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; } |
| 140 void set_loop_assignment(LoopAssignmentAnalysis* loop_assignment) { |
| 141 DCHECK_EQ(nullptr, loop_assignment_); |
| 142 loop_assignment_ = loop_assignment; |
| 143 } |
| 144 |
137 Node* context_node() const { return context_node_; } | 145 Node* context_node() const { return context_node_; } |
138 void set_context_node(Node* context_node) { | 146 void set_context_node(Node* context_node) { |
139 DCHECK_EQ(nullptr, context_node_); | 147 DCHECK_EQ(nullptr, context_node_); |
140 context_node_ = context_node; | 148 context_node_ = context_node; |
141 } | 149 } |
142 | 150 |
143 Schedule* schedule() const { return schedule_; } | 151 Schedule* schedule() const { return schedule_; } |
144 void set_schedule(Schedule* schedule) { | 152 void set_schedule(Schedule* schedule) { |
145 DCHECK_EQ(nullptr, schedule_); | 153 DCHECK_EQ(nullptr, schedule_); |
146 schedule_ = schedule; | 154 schedule_ = schedule; |
147 } | 155 } |
148 | 156 |
149 Zone* instruction_zone() const { return instruction_zone_; } | 157 Zone* instruction_zone() const { return instruction_zone_; } |
150 InstructionSequence* sequence() const { return sequence_; } | 158 InstructionSequence* sequence() const { return sequence_; } |
151 Frame* frame() const { return frame_; } | 159 Frame* frame() const { return frame_; } |
152 RegisterAllocator* register_allocator() const { return register_allocator_; } | 160 RegisterAllocator* register_allocator() const { return register_allocator_; } |
153 | 161 |
154 void DeleteGraphZone() { | 162 void DeleteGraphZone() { |
155 // Destroy objects with destructors first. | 163 // Destroy objects with destructors first. |
156 source_positions_.Reset(nullptr); | 164 source_positions_.Reset(nullptr); |
157 typer_.Reset(nullptr); | 165 typer_.Reset(nullptr); |
158 if (graph_zone_ == nullptr) return; | 166 if (graph_zone_ == nullptr) return; |
159 // Destroy zone and clear pointers. | 167 // Destroy zone and clear pointers. |
160 graph_zone_scope_.Destroy(); | 168 graph_zone_scope_.Destroy(); |
161 graph_zone_ = nullptr; | 169 graph_zone_ = nullptr; |
162 graph_ = nullptr; | 170 graph_ = nullptr; |
| 171 loop_assignment_ = nullptr; |
163 machine_ = nullptr; | 172 machine_ = nullptr; |
164 common_ = nullptr; | 173 common_ = nullptr; |
165 javascript_ = nullptr; | 174 javascript_ = nullptr; |
166 jsgraph_ = nullptr; | 175 jsgraph_ = nullptr; |
167 context_node_ = nullptr; | 176 context_node_ = nullptr; |
168 schedule_ = nullptr; | 177 schedule_ = nullptr; |
169 } | 178 } |
170 | 179 |
171 void DeleteInstructionZone() { | 180 void DeleteInstructionZone() { |
172 if (instruction_zone_ == nullptr) return; | 181 if (instruction_zone_ == nullptr) return; |
(...skipping 25 matching lines...) Expand all Loading... |
198 | 207 |
199 private: | 208 private: |
200 Isolate* isolate_; | 209 Isolate* isolate_; |
201 CompilationInfo* info_; | 210 CompilationInfo* info_; |
202 Zone* outer_zone_; | 211 Zone* outer_zone_; |
203 ZonePool* const zone_pool_; | 212 ZonePool* const zone_pool_; |
204 PipelineStatistics* pipeline_statistics_; | 213 PipelineStatistics* pipeline_statistics_; |
205 bool compilation_failed_; | 214 bool compilation_failed_; |
206 Handle<Code> code_; | 215 Handle<Code> code_; |
207 | 216 |
| 217 // All objects in the following group of fields are allocated in graph_zone_. |
| 218 // They are all set to NULL when the graph_zone_ is destroyed. |
208 ZonePool::Scope graph_zone_scope_; | 219 ZonePool::Scope graph_zone_scope_; |
209 Zone* graph_zone_; | 220 Zone* graph_zone_; |
210 // All objects in the following group of fields are allocated in graph_zone_. | |
211 // They are all set to NULL when the graph_zone_ is destroyed. | |
212 Graph* graph_; | 221 Graph* graph_; |
213 // TODO(dcarney): make this into a ZoneObject. | 222 // TODO(dcarney): make this into a ZoneObject. |
214 SmartPointer<SourcePositionTable> source_positions_; | 223 SmartPointer<SourcePositionTable> source_positions_; |
| 224 LoopAssignmentAnalysis* loop_assignment_; |
215 MachineOperatorBuilder* machine_; | 225 MachineOperatorBuilder* machine_; |
216 CommonOperatorBuilder* common_; | 226 CommonOperatorBuilder* common_; |
217 JSOperatorBuilder* javascript_; | 227 JSOperatorBuilder* javascript_; |
218 JSGraph* jsgraph_; | 228 JSGraph* jsgraph_; |
219 // TODO(dcarney): make this into a ZoneObject. | 229 // TODO(dcarney): make this into a ZoneObject. |
220 SmartPointer<Typer> typer_; | 230 SmartPointer<Typer> typer_; |
221 Node* context_node_; | 231 Node* context_node_; |
222 Schedule* schedule_; | 232 Schedule* schedule_; |
223 | 233 |
224 // All objects in the following group of fields are allocated in | 234 // All objects in the following group of fields are allocated in |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 } else { | 280 } else { |
271 AllowHandleDereference allow_deref; | 281 AllowHandleDereference allow_deref; |
272 name = info->function()->debug_name()->ToCString(); | 282 name = info->function()->debug_name()->ToCString(); |
273 } | 283 } |
274 return name; | 284 return name; |
275 } | 285 } |
276 | 286 |
277 | 287 |
278 class AstGraphBuilderWithPositions : public AstGraphBuilder { | 288 class AstGraphBuilderWithPositions : public AstGraphBuilder { |
279 public: | 289 public: |
280 explicit AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, | 290 AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, |
281 JSGraph* jsgraph, | 291 JSGraph* jsgraph, |
282 SourcePositionTable* source_positions) | 292 LoopAssignmentAnalysis* loop_assignment, |
283 : AstGraphBuilder(local_zone, info, jsgraph), | 293 SourcePositionTable* source_positions) |
| 294 : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment), |
284 source_positions_(source_positions) {} | 295 source_positions_(source_positions) {} |
285 | 296 |
286 bool CreateGraph() { | 297 bool CreateGraph() { |
287 SourcePositionTable::Scope pos(source_positions_, | 298 SourcePositionTable::Scope pos(source_positions_, |
288 SourcePosition::Unknown()); | 299 SourcePosition::Unknown()); |
289 return AstGraphBuilder::CreateGraph(); | 300 return AstGraphBuilder::CreateGraph(); |
290 } | 301 } |
291 | 302 |
292 #define DEF_VISIT(type) \ | 303 #define DEF_VISIT(type) \ |
293 virtual void Visit##type(type* node) OVERRIDE { \ | 304 virtual void Visit##type(type* node) OVERRIDE { \ |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 | 341 |
331 | 342 |
332 template <typename Phase, typename Arg0> | 343 template <typename Phase, typename Arg0> |
333 void Pipeline::Run(Arg0 arg_0) { | 344 void Pipeline::Run(Arg0 arg_0) { |
334 PipelineRunScope scope(this->data_, Phase::phase_name()); | 345 PipelineRunScope scope(this->data_, Phase::phase_name()); |
335 Phase phase; | 346 Phase phase; |
336 phase.Run(this->data_, scope.zone(), arg_0); | 347 phase.Run(this->data_, scope.zone(), arg_0); |
337 } | 348 } |
338 | 349 |
339 | 350 |
| 351 struct LoopAssignmentAnalysisPhase { |
| 352 static const char* phase_name() { return "loop assignment analysis"; } |
| 353 |
| 354 void Run(PipelineData* data, Zone* temp_zone) { |
| 355 AstLoopAssignmentAnalyzer analyzer(data->graph_zone(), data->info()); |
| 356 LoopAssignmentAnalysis* loop_assignment = analyzer.Analyze(); |
| 357 data->set_loop_assignment(loop_assignment); |
| 358 } |
| 359 }; |
| 360 |
| 361 |
340 struct GraphBuilderPhase { | 362 struct GraphBuilderPhase { |
341 static const char* phase_name() { return "graph builder"; } | 363 static const char* phase_name() { return "graph builder"; } |
342 | 364 |
343 void Run(PipelineData* data, Zone* temp_zone) { | 365 void Run(PipelineData* data, Zone* temp_zone) { |
344 AstGraphBuilderWithPositions graph_builder( | 366 AstGraphBuilderWithPositions graph_builder( |
345 temp_zone, data->info(), data->jsgraph(), data->source_positions()); | 367 temp_zone, data->info(), data->jsgraph(), data->loop_assignment(), |
| 368 data->source_positions()); |
346 if (graph_builder.CreateGraph()) { | 369 if (graph_builder.CreateGraph()) { |
347 data->set_context_node(graph_builder.GetFunctionContext()); | 370 data->set_context_node(graph_builder.GetFunctionContext()); |
348 } else { | 371 } else { |
349 data->set_compilation_failed(); | 372 data->set_compilation_failed(); |
350 } | 373 } |
351 } | 374 } |
352 }; | 375 }; |
353 | 376 |
354 | 377 |
355 struct ContextSpecializerPhase { | 378 struct ContextSpecializerPhase { |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 OFStream os(stdout); | 759 OFStream os(stdout); |
737 os << "---------------------------------------------------\n" | 760 os << "---------------------------------------------------\n" |
738 << "Begin compiling method " << GetDebugName(info()).get() | 761 << "Begin compiling method " << GetDebugName(info()).get() |
739 << " using Turbofan" << std::endl; | 762 << " using Turbofan" << std::endl; |
740 TurboCfgFile tcf(isolate()); | 763 TurboCfgFile tcf(isolate()); |
741 tcf << AsC1VCompilation(info()); | 764 tcf << AsC1VCompilation(info()); |
742 } | 765 } |
743 | 766 |
744 data.source_positions()->AddDecorator(); | 767 data.source_positions()->AddDecorator(); |
745 | 768 |
| 769 if (FLAG_loop_assignment_analysis) { |
| 770 Run<LoopAssignmentAnalysisPhase>(); |
| 771 } |
| 772 |
746 Run<GraphBuilderPhase>(); | 773 Run<GraphBuilderPhase>(); |
747 if (data.compilation_failed()) return Handle<Code>::null(); | 774 if (data.compilation_failed()) return Handle<Code>::null(); |
748 RunPrintAndVerify("Initial untyped", true); | 775 RunPrintAndVerify("Initial untyped", true); |
749 | 776 |
750 Run<EarlyControlReductionPhase>(); | 777 Run<EarlyControlReductionPhase>(); |
751 RunPrintAndVerify("Early Control reduced", true); | 778 RunPrintAndVerify("Early Control reduced", true); |
752 | 779 |
753 if (info()->is_context_specializing()) { | 780 if (info()->is_context_specializing()) { |
754 // Specialize the code to the context as aggressively as possible. | 781 // Specialize the code to the context as aggressively as possible. |
755 Run<ContextSpecializerPhase>(); | 782 Run<ContextSpecializerPhase>(); |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1033 } | 1060 } |
1034 | 1061 |
1035 | 1062 |
1036 void Pipeline::TearDown() { | 1063 void Pipeline::TearDown() { |
1037 InstructionOperand::TearDownCaches(); | 1064 InstructionOperand::TearDownCaches(); |
1038 } | 1065 } |
1039 | 1066 |
1040 } // namespace compiler | 1067 } // namespace compiler |
1041 } // namespace internal | 1068 } // namespace internal |
1042 } // namespace v8 | 1069 } // namespace v8 |
OLD | NEW |