| 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" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 code_(Handle<Code>::null()), | 67 code_(Handle<Code>::null()), |
| 68 graph_zone_scope_(zone_pool_), | 68 graph_zone_scope_(zone_pool_), |
| 69 graph_zone_(graph_zone_scope_.zone()), | 69 graph_zone_(graph_zone_scope_.zone()), |
| 70 graph_(nullptr), | 70 graph_(nullptr), |
| 71 loop_assignment_(nullptr), | 71 loop_assignment_(nullptr), |
| 72 machine_(nullptr), | 72 machine_(nullptr), |
| 73 common_(nullptr), | 73 common_(nullptr), |
| 74 javascript_(nullptr), | 74 javascript_(nullptr), |
| 75 jsgraph_(nullptr), | 75 jsgraph_(nullptr), |
| 76 typer_(nullptr), | 76 typer_(nullptr), |
| 77 context_node_(nullptr), | |
| 78 schedule_(nullptr), | 77 schedule_(nullptr), |
| 79 instruction_zone_scope_(zone_pool_), | 78 instruction_zone_scope_(zone_pool_), |
| 80 instruction_zone_(instruction_zone_scope_.zone()), | 79 instruction_zone_(instruction_zone_scope_.zone()), |
| 81 sequence_(nullptr), | 80 sequence_(nullptr), |
| 82 frame_(nullptr), | 81 frame_(nullptr), |
| 83 register_allocator_(nullptr) { | 82 register_allocator_(nullptr) { |
| 84 PhaseScope scope(pipeline_statistics, "init pipeline data"); | 83 PhaseScope scope(pipeline_statistics, "init pipeline data"); |
| 85 graph_ = new (graph_zone_) Graph(graph_zone_); | 84 graph_ = new (graph_zone_) Graph(graph_zone_); |
| 86 source_positions_.Reset(new SourcePositionTable(graph_)); | 85 source_positions_.Reset(new SourcePositionTable(graph_)); |
| 87 machine_ = new (graph_zone_) MachineOperatorBuilder( | 86 machine_ = new (graph_zone_) MachineOperatorBuilder( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 107 graph_zone_scope_(zone_pool_), | 106 graph_zone_scope_(zone_pool_), |
| 108 graph_zone_(nullptr), | 107 graph_zone_(nullptr), |
| 109 graph_(graph), | 108 graph_(graph), |
| 110 source_positions_(new SourcePositionTable(graph_)), | 109 source_positions_(new SourcePositionTable(graph_)), |
| 111 loop_assignment_(nullptr), | 110 loop_assignment_(nullptr), |
| 112 machine_(nullptr), | 111 machine_(nullptr), |
| 113 common_(nullptr), | 112 common_(nullptr), |
| 114 javascript_(nullptr), | 113 javascript_(nullptr), |
| 115 jsgraph_(nullptr), | 114 jsgraph_(nullptr), |
| 116 typer_(nullptr), | 115 typer_(nullptr), |
| 117 context_node_(nullptr), | |
| 118 schedule_(schedule), | 116 schedule_(schedule), |
| 119 instruction_zone_scope_(zone_pool_), | 117 instruction_zone_scope_(zone_pool_), |
| 120 instruction_zone_(instruction_zone_scope_.zone()), | 118 instruction_zone_(instruction_zone_scope_.zone()), |
| 121 sequence_(nullptr), | 119 sequence_(nullptr), |
| 122 frame_(nullptr), | 120 frame_(nullptr), |
| 123 register_allocator_(nullptr) {} | 121 register_allocator_(nullptr) {} |
| 124 | 122 |
| 125 // For register allocation testing entry point. | 123 // For register allocation testing entry point. |
| 126 PipelineData(ZonePool* zone_pool, CompilationInfo* info, | 124 PipelineData(ZonePool* zone_pool, CompilationInfo* info, |
| 127 InstructionSequence* sequence) | 125 InstructionSequence* sequence) |
| 128 : isolate_(info->isolate()), | 126 : isolate_(info->isolate()), |
| 129 info_(info), | 127 info_(info), |
| 130 outer_zone_(nullptr), | 128 outer_zone_(nullptr), |
| 131 zone_pool_(zone_pool), | 129 zone_pool_(zone_pool), |
| 132 pipeline_statistics_(nullptr), | 130 pipeline_statistics_(nullptr), |
| 133 compilation_failed_(false), | 131 compilation_failed_(false), |
| 134 code_(Handle<Code>::null()), | 132 code_(Handle<Code>::null()), |
| 135 graph_zone_scope_(zone_pool_), | 133 graph_zone_scope_(zone_pool_), |
| 136 graph_zone_(nullptr), | 134 graph_zone_(nullptr), |
| 137 graph_(nullptr), | 135 graph_(nullptr), |
| 138 loop_assignment_(nullptr), | 136 loop_assignment_(nullptr), |
| 139 machine_(nullptr), | 137 machine_(nullptr), |
| 140 common_(nullptr), | 138 common_(nullptr), |
| 141 javascript_(nullptr), | 139 javascript_(nullptr), |
| 142 jsgraph_(nullptr), | 140 jsgraph_(nullptr), |
| 143 typer_(nullptr), | 141 typer_(nullptr), |
| 144 context_node_(nullptr), | |
| 145 schedule_(nullptr), | 142 schedule_(nullptr), |
| 146 instruction_zone_scope_(zone_pool_), | 143 instruction_zone_scope_(zone_pool_), |
| 147 instruction_zone_(sequence->zone()), | 144 instruction_zone_(sequence->zone()), |
| 148 sequence_(sequence), | 145 sequence_(sequence), |
| 149 frame_(nullptr), | 146 frame_(nullptr), |
| 150 register_allocator_(nullptr) {} | 147 register_allocator_(nullptr) {} |
| 151 | 148 |
| 152 ~PipelineData() { | 149 ~PipelineData() { |
| 153 DeleteInstructionZone(); | 150 DeleteInstructionZone(); |
| 154 DeleteGraphZone(); | 151 DeleteGraphZone(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 179 JSOperatorBuilder* javascript() const { return javascript_; } | 176 JSOperatorBuilder* javascript() const { return javascript_; } |
| 180 JSGraph* jsgraph() const { return jsgraph_; } | 177 JSGraph* jsgraph() const { return jsgraph_; } |
| 181 Typer* typer() const { return typer_.get(); } | 178 Typer* typer() const { return typer_.get(); } |
| 182 | 179 |
| 183 LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; } | 180 LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; } |
| 184 void set_loop_assignment(LoopAssignmentAnalysis* loop_assignment) { | 181 void set_loop_assignment(LoopAssignmentAnalysis* loop_assignment) { |
| 185 DCHECK(!loop_assignment_); | 182 DCHECK(!loop_assignment_); |
| 186 loop_assignment_ = loop_assignment; | 183 loop_assignment_ = loop_assignment; |
| 187 } | 184 } |
| 188 | 185 |
| 189 Node* context_node() const { return context_node_; } | |
| 190 void set_context_node(Node* context_node) { | |
| 191 DCHECK(!context_node_); | |
| 192 context_node_ = context_node; | |
| 193 } | |
| 194 | |
| 195 Schedule* schedule() const { return schedule_; } | 186 Schedule* schedule() const { return schedule_; } |
| 196 void set_schedule(Schedule* schedule) { | 187 void set_schedule(Schedule* schedule) { |
| 197 DCHECK(!schedule_); | 188 DCHECK(!schedule_); |
| 198 schedule_ = schedule; | 189 schedule_ = schedule; |
| 199 } | 190 } |
| 200 | 191 |
| 201 Zone* instruction_zone() const { return instruction_zone_; } | 192 Zone* instruction_zone() const { return instruction_zone_; } |
| 202 InstructionSequence* sequence() const { return sequence_; } | 193 InstructionSequence* sequence() const { return sequence_; } |
| 203 Frame* frame() const { return frame_; } | 194 Frame* frame() const { return frame_; } |
| 204 RegisterAllocator* register_allocator() const { return register_allocator_; } | 195 RegisterAllocator* register_allocator() const { return register_allocator_; } |
| 205 | 196 |
| 206 void DeleteGraphZone() { | 197 void DeleteGraphZone() { |
| 207 // Destroy objects with destructors first. | 198 // Destroy objects with destructors first. |
| 208 source_positions_.Reset(nullptr); | 199 source_positions_.Reset(nullptr); |
| 209 typer_.Reset(nullptr); | 200 typer_.Reset(nullptr); |
| 210 if (graph_zone_ == nullptr) return; | 201 if (graph_zone_ == nullptr) return; |
| 211 // Destroy zone and clear pointers. | 202 // Destroy zone and clear pointers. |
| 212 graph_zone_scope_.Destroy(); | 203 graph_zone_scope_.Destroy(); |
| 213 graph_zone_ = nullptr; | 204 graph_zone_ = nullptr; |
| 214 graph_ = nullptr; | 205 graph_ = nullptr; |
| 215 loop_assignment_ = nullptr; | 206 loop_assignment_ = nullptr; |
| 216 machine_ = nullptr; | 207 machine_ = nullptr; |
| 217 common_ = nullptr; | 208 common_ = nullptr; |
| 218 javascript_ = nullptr; | 209 javascript_ = nullptr; |
| 219 jsgraph_ = nullptr; | 210 jsgraph_ = nullptr; |
| 220 context_node_ = nullptr; | |
| 221 schedule_ = nullptr; | 211 schedule_ = nullptr; |
| 222 } | 212 } |
| 223 | 213 |
| 224 void DeleteInstructionZone() { | 214 void DeleteInstructionZone() { |
| 225 if (instruction_zone_ == nullptr) return; | 215 if (instruction_zone_ == nullptr) return; |
| 226 instruction_zone_scope_.Destroy(); | 216 instruction_zone_scope_.Destroy(); |
| 227 instruction_zone_ = nullptr; | 217 instruction_zone_ = nullptr; |
| 228 sequence_ = nullptr; | 218 sequence_ = nullptr; |
| 229 frame_ = nullptr; | 219 frame_ = nullptr; |
| 230 register_allocator_ = nullptr; | 220 register_allocator_ = nullptr; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 Graph* graph_; | 255 Graph* graph_; |
| 266 // TODO(dcarney): make this into a ZoneObject. | 256 // TODO(dcarney): make this into a ZoneObject. |
| 267 SmartPointer<SourcePositionTable> source_positions_; | 257 SmartPointer<SourcePositionTable> source_positions_; |
| 268 LoopAssignmentAnalysis* loop_assignment_; | 258 LoopAssignmentAnalysis* loop_assignment_; |
| 269 MachineOperatorBuilder* machine_; | 259 MachineOperatorBuilder* machine_; |
| 270 CommonOperatorBuilder* common_; | 260 CommonOperatorBuilder* common_; |
| 271 JSOperatorBuilder* javascript_; | 261 JSOperatorBuilder* javascript_; |
| 272 JSGraph* jsgraph_; | 262 JSGraph* jsgraph_; |
| 273 // TODO(dcarney): make this into a ZoneObject. | 263 // TODO(dcarney): make this into a ZoneObject. |
| 274 SmartPointer<Typer> typer_; | 264 SmartPointer<Typer> typer_; |
| 275 Node* context_node_; | |
| 276 Schedule* schedule_; | 265 Schedule* schedule_; |
| 277 | 266 |
| 278 // All objects in the following group of fields are allocated in | 267 // All objects in the following group of fields are allocated in |
| 279 // instruction_zone_. They are all set to NULL when the instruction_zone_ is | 268 // instruction_zone_. They are all set to NULL when the instruction_zone_ is |
| 280 // destroyed. | 269 // destroyed. |
| 281 ZonePool::Scope instruction_zone_scope_; | 270 ZonePool::Scope instruction_zone_scope_; |
| 282 Zone* instruction_zone_; | 271 Zone* instruction_zone_; |
| 283 InstructionSequence* sequence_; | 272 InstructionSequence* sequence_; |
| 284 Frame* frame_; | 273 Frame* frame_; |
| 285 RegisterAllocator* register_allocator_; | 274 RegisterAllocator* register_allocator_; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 class AstGraphBuilderWithPositions : public AstGraphBuilder { | 312 class AstGraphBuilderWithPositions : public AstGraphBuilder { |
| 324 public: | 313 public: |
| 325 AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, | 314 AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, |
| 326 JSGraph* jsgraph, | 315 JSGraph* jsgraph, |
| 327 LoopAssignmentAnalysis* loop_assignment, | 316 LoopAssignmentAnalysis* loop_assignment, |
| 328 SourcePositionTable* source_positions) | 317 SourcePositionTable* source_positions) |
| 329 : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment), | 318 : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment), |
| 330 source_positions_(source_positions), | 319 source_positions_(source_positions), |
| 331 start_position_(info->shared_info()->start_position()) {} | 320 start_position_(info->shared_info()->start_position()) {} |
| 332 | 321 |
| 333 bool CreateGraph() { | 322 bool CreateGraph(bool constant_context) { |
| 334 SourcePositionTable::Scope pos_scope(source_positions_, start_position_); | 323 SourcePositionTable::Scope pos_scope(source_positions_, start_position_); |
| 335 return AstGraphBuilder::CreateGraph(); | 324 return AstGraphBuilder::CreateGraph(constant_context); |
| 336 } | 325 } |
| 337 | 326 |
| 338 #define DEF_VISIT(type) \ | 327 #define DEF_VISIT(type) \ |
| 339 void Visit##type(type* node) OVERRIDE { \ | 328 void Visit##type(type* node) OVERRIDE { \ |
| 340 SourcePositionTable::Scope pos(source_positions_, \ | 329 SourcePositionTable::Scope pos(source_positions_, \ |
| 341 SourcePosition(node->position())); \ | 330 SourcePosition(node->position())); \ |
| 342 AstGraphBuilder::Visit##type(node); \ | 331 AstGraphBuilder::Visit##type(node); \ |
| 343 } | 332 } |
| 344 AST_NODE_LIST(DEF_VISIT) | 333 AST_NODE_LIST(DEF_VISIT) |
| 345 #undef DEF_VISIT | 334 #undef DEF_VISIT |
| 346 | 335 |
| 347 Node* GetFunctionContext() { return AstGraphBuilder::GetFunctionContext(); } | |
| 348 | |
| 349 private: | 336 private: |
| 350 SourcePositionTable* source_positions_; | 337 SourcePositionTable* source_positions_; |
| 351 SourcePosition start_position_; | 338 SourcePosition start_position_; |
| 352 }; | 339 }; |
| 353 | 340 |
| 354 | 341 |
| 355 namespace { | 342 namespace { |
| 356 | 343 |
| 357 class SourcePositionWrapper : public Reducer { | 344 class SourcePositionWrapper : public Reducer { |
| 358 public: | 345 public: |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 AstLoopAssignmentAnalyzer analyzer(data->graph_zone(), data->info()); | 413 AstLoopAssignmentAnalyzer analyzer(data->graph_zone(), data->info()); |
| 427 LoopAssignmentAnalysis* loop_assignment = analyzer.Analyze(); | 414 LoopAssignmentAnalysis* loop_assignment = analyzer.Analyze(); |
| 428 data->set_loop_assignment(loop_assignment); | 415 data->set_loop_assignment(loop_assignment); |
| 429 } | 416 } |
| 430 }; | 417 }; |
| 431 | 418 |
| 432 | 419 |
| 433 struct GraphBuilderPhase { | 420 struct GraphBuilderPhase { |
| 434 static const char* phase_name() { return "graph builder"; } | 421 static const char* phase_name() { return "graph builder"; } |
| 435 | 422 |
| 436 void Run(PipelineData* data, Zone* temp_zone) { | 423 void Run(PipelineData* data, Zone* temp_zone, bool constant_context) { |
| 437 AstGraphBuilderWithPositions graph_builder( | 424 AstGraphBuilderWithPositions graph_builder( |
| 438 temp_zone, data->info(), data->jsgraph(), data->loop_assignment(), | 425 temp_zone, data->info(), data->jsgraph(), data->loop_assignment(), |
| 439 data->source_positions()); | 426 data->source_positions()); |
| 440 if (graph_builder.CreateGraph()) { | 427 if (!graph_builder.CreateGraph(constant_context)) { |
| 441 data->set_context_node(graph_builder.GetFunctionContext()); | |
| 442 } else { | |
| 443 data->set_compilation_failed(); | 428 data->set_compilation_failed(); |
| 444 } | 429 } |
| 445 } | 430 } |
| 446 }; | 431 }; |
| 447 | 432 |
| 448 | 433 |
| 449 struct ContextSpecializerPhase { | 434 struct ContextSpecializerPhase { |
| 450 static const char* phase_name() { return "context specializing"; } | 435 static const char* phase_name() { return "context specializing"; } |
| 451 | 436 |
| 452 void Run(PipelineData* data, Zone* temp_zone) { | 437 void Run(PipelineData* data, Zone* temp_zone) { |
| 453 SourcePositionTable::Scope pos(data->source_positions(), | 438 SourcePositionTable::Scope pos(data->source_positions(), |
| 454 SourcePosition::Unknown()); | 439 SourcePosition::Unknown()); |
| 455 JSContextSpecializer spec(data->info()->context(), data->jsgraph(), | 440 JSContextSpecializer spec(data->jsgraph()); |
| 456 data->context_node()); | |
| 457 GraphReducer graph_reducer(data->graph(), temp_zone); | 441 GraphReducer graph_reducer(data->graph(), temp_zone); |
| 458 AddReducer(data, &graph_reducer, &spec); | 442 AddReducer(data, &graph_reducer, &spec); |
| 459 graph_reducer.ReduceGraph(); | 443 graph_reducer.ReduceGraph(); |
| 460 } | 444 } |
| 461 }; | 445 }; |
| 462 | 446 |
| 463 | 447 |
| 464 struct InliningPhase { | 448 struct InliningPhase { |
| 465 static const char* phase_name() { return "inlining"; } | 449 static const char* phase_name() { return "inlining"; } |
| 466 | 450 |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 TurboCfgFile tcf(isolate()); | 895 TurboCfgFile tcf(isolate()); |
| 912 tcf << AsC1VCompilation(info()); | 896 tcf << AsC1VCompilation(info()); |
| 913 } | 897 } |
| 914 | 898 |
| 915 data.source_positions()->AddDecorator(); | 899 data.source_positions()->AddDecorator(); |
| 916 | 900 |
| 917 if (FLAG_loop_assignment_analysis) { | 901 if (FLAG_loop_assignment_analysis) { |
| 918 Run<LoopAssignmentAnalysisPhase>(); | 902 Run<LoopAssignmentAnalysisPhase>(); |
| 919 } | 903 } |
| 920 | 904 |
| 921 Run<GraphBuilderPhase>(); | 905 Run<GraphBuilderPhase>(info()->is_context_specializing()); |
| 922 if (data.compilation_failed()) return Handle<Code>::null(); | 906 if (data.compilation_failed()) return Handle<Code>::null(); |
| 923 RunPrintAndVerify("Initial untyped", true); | 907 RunPrintAndVerify("Initial untyped", true); |
| 924 | 908 |
| 925 Run<EarlyControlReductionPhase>(); | 909 Run<EarlyControlReductionPhase>(); |
| 926 RunPrintAndVerify("Early Control reduced", true); | 910 RunPrintAndVerify("Early Control reduced", true); |
| 927 | 911 |
| 928 if (info()->is_context_specializing()) { | 912 if (info()->is_context_specializing()) { |
| 929 // Specialize the code to the context as aggressively as possible. | 913 // Specialize the code to the context as aggressively as possible. |
| 930 Run<ContextSpecializerPhase>(); | 914 Run<ContextSpecializerPhase>(); |
| 931 RunPrintAndVerify("Context specialized", true); | 915 RunPrintAndVerify("Context specialized", true); |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 | 1195 |
| 1212 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { | 1196 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { |
| 1213 TurboCfgFile tcf(data->isolate()); | 1197 TurboCfgFile tcf(data->isolate()); |
| 1214 tcf << AsC1VAllocator("CodeGen", data->register_allocator()); | 1198 tcf << AsC1VAllocator("CodeGen", data->register_allocator()); |
| 1215 } | 1199 } |
| 1216 } | 1200 } |
| 1217 | 1201 |
| 1218 } // namespace compiler | 1202 } // namespace compiler |
| 1219 } // namespace internal | 1203 } // namespace internal |
| 1220 } // namespace v8 | 1204 } // namespace v8 |
| OLD | NEW |