| 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 <memory> | 8 #include <memory> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 #include "src/compiler/simplified-lowering.h" | 63 #include "src/compiler/simplified-lowering.h" |
| 64 #include "src/compiler/simplified-operator-reducer.h" | 64 #include "src/compiler/simplified-operator-reducer.h" |
| 65 #include "src/compiler/simplified-operator.h" | 65 #include "src/compiler/simplified-operator.h" |
| 66 #include "src/compiler/store-store-elimination.h" | 66 #include "src/compiler/store-store-elimination.h" |
| 67 #include "src/compiler/tail-call-optimization.h" | 67 #include "src/compiler/tail-call-optimization.h" |
| 68 #include "src/compiler/type-hint-analyzer.h" | 68 #include "src/compiler/type-hint-analyzer.h" |
| 69 #include "src/compiler/typed-optimization.h" | 69 #include "src/compiler/typed-optimization.h" |
| 70 #include "src/compiler/typer.h" | 70 #include "src/compiler/typer.h" |
| 71 #include "src/compiler/value-numbering-reducer.h" | 71 #include "src/compiler/value-numbering-reducer.h" |
| 72 #include "src/compiler/verifier.h" | 72 #include "src/compiler/verifier.h" |
| 73 #include "src/compiler/zone-stats.h" | 73 #include "src/compiler/zone-pool.h" |
| 74 #include "src/isolate-inl.h" | 74 #include "src/isolate-inl.h" |
| 75 #include "src/ostreams.h" | 75 #include "src/ostreams.h" |
| 76 #include "src/parsing/parse-info.h" | 76 #include "src/parsing/parse-info.h" |
| 77 #include "src/register-configuration.h" | 77 #include "src/register-configuration.h" |
| 78 #include "src/type-info.h" | 78 #include "src/type-info.h" |
| 79 #include "src/utils.h" | 79 #include "src/utils.h" |
| 80 | 80 |
| 81 namespace v8 { | 81 namespace v8 { |
| 82 namespace internal { | 82 namespace internal { |
| 83 namespace compiler { | 83 namespace compiler { |
| 84 | 84 |
| 85 class PipelineData { | 85 class PipelineData { |
| 86 public: | 86 public: |
| 87 // For main entry point. | 87 // For main entry point. |
| 88 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, | 88 PipelineData(ZonePool* zone_pool, CompilationInfo* info, |
| 89 PipelineStatistics* pipeline_statistics) | 89 PipelineStatistics* pipeline_statistics) |
| 90 : isolate_(info->isolate()), | 90 : isolate_(info->isolate()), |
| 91 info_(info), | 91 info_(info), |
| 92 debug_name_(info_->GetDebugName()), | 92 debug_name_(info_->GetDebugName()), |
| 93 outer_zone_(info_->zone()), | 93 outer_zone_(info_->zone()), |
| 94 zone_stats_(zone_stats), | 94 zone_pool_(zone_pool), |
| 95 pipeline_statistics_(pipeline_statistics), | 95 pipeline_statistics_(pipeline_statistics), |
| 96 graph_zone_scope_(zone_stats_), | 96 graph_zone_scope_(zone_pool_), |
| 97 graph_zone_(graph_zone_scope_.zone()), | 97 graph_zone_(graph_zone_scope_.zone()), |
| 98 instruction_zone_scope_(zone_stats_), | 98 instruction_zone_scope_(zone_pool_), |
| 99 instruction_zone_(instruction_zone_scope_.zone()), | 99 instruction_zone_(instruction_zone_scope_.zone()), |
| 100 register_allocation_zone_scope_(zone_stats_), | 100 register_allocation_zone_scope_(zone_pool_), |
| 101 register_allocation_zone_(register_allocation_zone_scope_.zone()) { | 101 register_allocation_zone_(register_allocation_zone_scope_.zone()) { |
| 102 PhaseScope scope(pipeline_statistics, "init pipeline data"); | 102 PhaseScope scope(pipeline_statistics, "init pipeline data"); |
| 103 graph_ = new (graph_zone_) Graph(graph_zone_); | 103 graph_ = new (graph_zone_) Graph(graph_zone_); |
| 104 source_positions_ = new (graph_zone_) SourcePositionTable(graph_); | 104 source_positions_ = new (graph_zone_) SourcePositionTable(graph_); |
| 105 simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_); | 105 simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_); |
| 106 machine_ = new (graph_zone_) MachineOperatorBuilder( | 106 machine_ = new (graph_zone_) MachineOperatorBuilder( |
| 107 graph_zone_, MachineType::PointerRepresentation(), | 107 graph_zone_, MachineType::PointerRepresentation(), |
| 108 InstructionSelector::SupportedMachineOperatorFlags(), | 108 InstructionSelector::SupportedMachineOperatorFlags(), |
| 109 InstructionSelector::AlignmentRequirements()); | 109 InstructionSelector::AlignmentRequirements()); |
| 110 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); | 110 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); |
| 111 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); | 111 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); |
| 112 jsgraph_ = new (graph_zone_) | 112 jsgraph_ = new (graph_zone_) |
| 113 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_); | 113 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_); |
| 114 } | 114 } |
| 115 | 115 |
| 116 // For WASM compile entry point. | 116 // For WASM compile entry point. |
| 117 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, Graph* graph, | 117 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, |
| 118 SourcePositionTable* source_positions) | 118 SourcePositionTable* source_positions) |
| 119 : isolate_(info->isolate()), | 119 : isolate_(info->isolate()), |
| 120 info_(info), | 120 info_(info), |
| 121 debug_name_(info_->GetDebugName()), | 121 debug_name_(info_->GetDebugName()), |
| 122 zone_stats_(zone_stats), | 122 zone_pool_(zone_pool), |
| 123 graph_zone_scope_(zone_stats_), | 123 graph_zone_scope_(zone_pool_), |
| 124 graph_(graph), | 124 graph_(graph), |
| 125 source_positions_(source_positions), | 125 source_positions_(source_positions), |
| 126 instruction_zone_scope_(zone_stats_), | 126 instruction_zone_scope_(zone_pool_), |
| 127 instruction_zone_(instruction_zone_scope_.zone()), | 127 instruction_zone_(instruction_zone_scope_.zone()), |
| 128 register_allocation_zone_scope_(zone_stats_), | 128 register_allocation_zone_scope_(zone_pool_), |
| 129 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} | 129 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} |
| 130 | 130 |
| 131 // For machine graph testing entry point. | 131 // For machine graph testing entry point. |
| 132 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, Graph* graph, | 132 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, |
| 133 Schedule* schedule) | 133 Schedule* schedule) |
| 134 : isolate_(info->isolate()), | 134 : isolate_(info->isolate()), |
| 135 info_(info), | 135 info_(info), |
| 136 debug_name_(info_->GetDebugName()), | 136 debug_name_(info_->GetDebugName()), |
| 137 zone_stats_(zone_stats), | 137 zone_pool_(zone_pool), |
| 138 graph_zone_scope_(zone_stats_), | 138 graph_zone_scope_(zone_pool_), |
| 139 graph_(graph), | 139 graph_(graph), |
| 140 source_positions_(new (info->zone()) SourcePositionTable(graph_)), | 140 source_positions_(new (info->zone()) SourcePositionTable(graph_)), |
| 141 schedule_(schedule), | 141 schedule_(schedule), |
| 142 instruction_zone_scope_(zone_stats_), | 142 instruction_zone_scope_(zone_pool_), |
| 143 instruction_zone_(instruction_zone_scope_.zone()), | 143 instruction_zone_(instruction_zone_scope_.zone()), |
| 144 register_allocation_zone_scope_(zone_stats_), | 144 register_allocation_zone_scope_(zone_pool_), |
| 145 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} | 145 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} |
| 146 | 146 |
| 147 // For register allocation testing entry point. | 147 // For register allocation testing entry point. |
| 148 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, | 148 PipelineData(ZonePool* zone_pool, CompilationInfo* info, |
| 149 InstructionSequence* sequence) | 149 InstructionSequence* sequence) |
| 150 : isolate_(info->isolate()), | 150 : isolate_(info->isolate()), |
| 151 info_(info), | 151 info_(info), |
| 152 debug_name_(info_->GetDebugName()), | 152 debug_name_(info_->GetDebugName()), |
| 153 zone_stats_(zone_stats), | 153 zone_pool_(zone_pool), |
| 154 graph_zone_scope_(zone_stats_), | 154 graph_zone_scope_(zone_pool_), |
| 155 instruction_zone_scope_(zone_stats_), | 155 instruction_zone_scope_(zone_pool_), |
| 156 instruction_zone_(sequence->zone()), | 156 instruction_zone_(sequence->zone()), |
| 157 sequence_(sequence), | 157 sequence_(sequence), |
| 158 register_allocation_zone_scope_(zone_stats_), | 158 register_allocation_zone_scope_(zone_pool_), |
| 159 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} | 159 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} |
| 160 | 160 |
| 161 ~PipelineData() { | 161 ~PipelineData() { |
| 162 DeleteRegisterAllocationZone(); | 162 DeleteRegisterAllocationZone(); |
| 163 DeleteInstructionZone(); | 163 DeleteInstructionZone(); |
| 164 DeleteGraphZone(); | 164 DeleteGraphZone(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 Isolate* isolate() const { return isolate_; } | 167 Isolate* isolate() const { return isolate_; } |
| 168 CompilationInfo* info() const { return info_; } | 168 CompilationInfo* info() const { return info_; } |
| 169 ZoneStats* zone_stats() const { return zone_stats_; } | 169 ZonePool* zone_pool() const { return zone_pool_; } |
| 170 PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; } | 170 PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; } |
| 171 bool compilation_failed() const { return compilation_failed_; } | 171 bool compilation_failed() const { return compilation_failed_; } |
| 172 void set_compilation_failed() { compilation_failed_ = true; } | 172 void set_compilation_failed() { compilation_failed_ = true; } |
| 173 Handle<Code> code() { return code_; } | 173 Handle<Code> code() { return code_; } |
| 174 void set_code(Handle<Code> code) { | 174 void set_code(Handle<Code> code) { |
| 175 DCHECK(code_.is_null()); | 175 DCHECK(code_.is_null()); |
| 176 code_ = code; | 176 code_ = code; |
| 177 } | 177 } |
| 178 | 178 |
| 179 // RawMachineAssembler generally produces graphs which cannot be verified. | 179 // RawMachineAssembler generally produces graphs which cannot be verified. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 if (pipeline_statistics() != nullptr) { | 306 if (pipeline_statistics() != nullptr) { |
| 307 pipeline_statistics()->EndPhaseKind(); | 307 pipeline_statistics()->EndPhaseKind(); |
| 308 } | 308 } |
| 309 } | 309 } |
| 310 | 310 |
| 311 private: | 311 private: |
| 312 Isolate* const isolate_; | 312 Isolate* const isolate_; |
| 313 CompilationInfo* const info_; | 313 CompilationInfo* const info_; |
| 314 std::unique_ptr<char[]> debug_name_; | 314 std::unique_ptr<char[]> debug_name_; |
| 315 Zone* outer_zone_ = nullptr; | 315 Zone* outer_zone_ = nullptr; |
| 316 ZoneStats* const zone_stats_; | 316 ZonePool* const zone_pool_; |
| 317 PipelineStatistics* pipeline_statistics_ = nullptr; | 317 PipelineStatistics* pipeline_statistics_ = nullptr; |
| 318 bool compilation_failed_ = false; | 318 bool compilation_failed_ = false; |
| 319 Handle<Code> code_ = Handle<Code>::null(); | 319 Handle<Code> code_ = Handle<Code>::null(); |
| 320 | 320 |
| 321 // All objects in the following group of fields are allocated in graph_zone_. | 321 // All objects in the following group of fields are allocated in graph_zone_. |
| 322 // They are all set to nullptr when the graph_zone_ is destroyed. | 322 // They are all set to nullptr when the graph_zone_ is destroyed. |
| 323 ZoneStats::Scope graph_zone_scope_; | 323 ZonePool::Scope graph_zone_scope_; |
| 324 Zone* graph_zone_ = nullptr; | 324 Zone* graph_zone_ = nullptr; |
| 325 Graph* graph_ = nullptr; | 325 Graph* graph_ = nullptr; |
| 326 SourcePositionTable* source_positions_ = nullptr; | 326 SourcePositionTable* source_positions_ = nullptr; |
| 327 LoopAssignmentAnalysis* loop_assignment_ = nullptr; | 327 LoopAssignmentAnalysis* loop_assignment_ = nullptr; |
| 328 TypeHintAnalysis* type_hint_analysis_ = nullptr; | 328 TypeHintAnalysis* type_hint_analysis_ = nullptr; |
| 329 SimplifiedOperatorBuilder* simplified_ = nullptr; | 329 SimplifiedOperatorBuilder* simplified_ = nullptr; |
| 330 MachineOperatorBuilder* machine_ = nullptr; | 330 MachineOperatorBuilder* machine_ = nullptr; |
| 331 CommonOperatorBuilder* common_ = nullptr; | 331 CommonOperatorBuilder* common_ = nullptr; |
| 332 JSOperatorBuilder* javascript_ = nullptr; | 332 JSOperatorBuilder* javascript_ = nullptr; |
| 333 JSGraph* jsgraph_ = nullptr; | 333 JSGraph* jsgraph_ = nullptr; |
| 334 Schedule* schedule_ = nullptr; | 334 Schedule* schedule_ = nullptr; |
| 335 | 335 |
| 336 // All objects in the following group of fields are allocated in | 336 // All objects in the following group of fields are allocated in |
| 337 // instruction_zone_. They are all set to nullptr when the instruction_zone_ | 337 // instruction_zone_. They are all set to nullptr when the instruction_zone_ |
| 338 // is | 338 // is |
| 339 // destroyed. | 339 // destroyed. |
| 340 ZoneStats::Scope instruction_zone_scope_; | 340 ZonePool::Scope instruction_zone_scope_; |
| 341 Zone* instruction_zone_; | 341 Zone* instruction_zone_; |
| 342 InstructionSequence* sequence_ = nullptr; | 342 InstructionSequence* sequence_ = nullptr; |
| 343 Frame* frame_ = nullptr; | 343 Frame* frame_ = nullptr; |
| 344 | 344 |
| 345 // All objects in the following group of fields are allocated in | 345 // All objects in the following group of fields are allocated in |
| 346 // register_allocation_zone_. They are all set to nullptr when the zone is | 346 // register_allocation_zone_. They are all set to nullptr when the zone is |
| 347 // destroyed. | 347 // destroyed. |
| 348 ZoneStats::Scope register_allocation_zone_scope_; | 348 ZonePool::Scope register_allocation_zone_scope_; |
| 349 Zone* register_allocation_zone_; | 349 Zone* register_allocation_zone_; |
| 350 RegisterAllocationData* register_allocation_data_ = nullptr; | 350 RegisterAllocationData* register_allocation_data_ = nullptr; |
| 351 | 351 |
| 352 // Basic block profiling support. | 352 // Basic block profiling support. |
| 353 BasicBlockProfiler::Data* profiler_data_ = nullptr; | 353 BasicBlockProfiler::Data* profiler_data_ = nullptr; |
| 354 | 354 |
| 355 // Source position output for --trace-turbo. | 355 // Source position output for --trace-turbo. |
| 356 std::string source_position_output_; | 356 std::string source_position_output_; |
| 357 | 357 |
| 358 int CalculateFixedFrameSize(CallDescriptor* descriptor) { | 358 int CalculateFixedFrameSize(CallDescriptor* descriptor) { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 } | 511 } |
| 512 } | 512 } |
| 513 | 513 |
| 514 | 514 |
| 515 class PipelineRunScope { | 515 class PipelineRunScope { |
| 516 public: | 516 public: |
| 517 PipelineRunScope(PipelineData* data, const char* phase_name) | 517 PipelineRunScope(PipelineData* data, const char* phase_name) |
| 518 : phase_scope_( | 518 : phase_scope_( |
| 519 phase_name == nullptr ? nullptr : data->pipeline_statistics(), | 519 phase_name == nullptr ? nullptr : data->pipeline_statistics(), |
| 520 phase_name), | 520 phase_name), |
| 521 zone_scope_(data->zone_stats()) {} | 521 zone_scope_(data->zone_pool()) {} |
| 522 | 522 |
| 523 Zone* zone() { return zone_scope_.zone(); } | 523 Zone* zone() { return zone_scope_.zone(); } |
| 524 | 524 |
| 525 private: | 525 private: |
| 526 PhaseScope phase_scope_; | 526 PhaseScope phase_scope_; |
| 527 ZoneStats::Scope zone_scope_; | 527 ZonePool::Scope zone_scope_; |
| 528 }; | 528 }; |
| 529 | 529 |
| 530 PipelineStatistics* CreatePipelineStatistics(CompilationInfo* info, | 530 PipelineStatistics* CreatePipelineStatistics(CompilationInfo* info, |
| 531 ZoneStats* zone_stats) { | 531 ZonePool* zone_pool) { |
| 532 PipelineStatistics* pipeline_statistics = nullptr; | 532 PipelineStatistics* pipeline_statistics = nullptr; |
| 533 | 533 |
| 534 if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 534 if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { |
| 535 pipeline_statistics = new PipelineStatistics(info, zone_stats); | 535 pipeline_statistics = new PipelineStatistics(info, zone_pool); |
| 536 pipeline_statistics->BeginPhaseKind("initializing"); | 536 pipeline_statistics->BeginPhaseKind("initializing"); |
| 537 } | 537 } |
| 538 | 538 |
| 539 if (FLAG_trace_turbo) { | 539 if (FLAG_trace_turbo) { |
| 540 TurboJsonFile json_of(info, std::ios_base::trunc); | 540 TurboJsonFile json_of(info, std::ios_base::trunc); |
| 541 Handle<Script> script = info->script(); | 541 Handle<Script> script = info->script(); |
| 542 std::unique_ptr<char[]> function_name = info->GetDebugName(); | 542 std::unique_ptr<char[]> function_name = info->GetDebugName(); |
| 543 int pos = info->shared_info()->start_position(); | 543 int pos = info->shared_info()->start_position(); |
| 544 json_of << "{\"function\":\"" << function_name.get() | 544 json_of << "{\"function\":\"" << function_name.get() |
| 545 << "\", \"sourcePosition\":" << pos << ", \"source\":\""; | 545 << "\", \"sourcePosition\":" << pos << ", \"source\":\""; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 562 | 562 |
| 563 } // namespace | 563 } // namespace |
| 564 | 564 |
| 565 class PipelineCompilationJob final : public CompilationJob { | 565 class PipelineCompilationJob final : public CompilationJob { |
| 566 public: | 566 public: |
| 567 PipelineCompilationJob(Isolate* isolate, Handle<JSFunction> function) | 567 PipelineCompilationJob(Isolate* isolate, Handle<JSFunction> function) |
| 568 // Note that the CompilationInfo is not initialized at the time we pass it | 568 // Note that the CompilationInfo is not initialized at the time we pass it |
| 569 // to the CompilationJob constructor, but it is not dereferenced there. | 569 // to the CompilationJob constructor, but it is not dereferenced there. |
| 570 : CompilationJob(isolate, &info_, "TurboFan"), | 570 : CompilationJob(isolate, &info_, "TurboFan"), |
| 571 zone_(isolate->allocator()), | 571 zone_(isolate->allocator()), |
| 572 zone_stats_(isolate->allocator()), | 572 zone_pool_(isolate->allocator()), |
| 573 parse_info_(&zone_, function), | 573 parse_info_(&zone_, function), |
| 574 info_(&parse_info_, function), | 574 info_(&parse_info_, function), |
| 575 pipeline_statistics_(CreatePipelineStatistics(info(), &zone_stats_)), | 575 pipeline_statistics_(CreatePipelineStatistics(info(), &zone_pool_)), |
| 576 data_(&zone_stats_, info(), pipeline_statistics_.get()), | 576 data_(&zone_pool_, info(), pipeline_statistics_.get()), |
| 577 pipeline_(&data_), | 577 pipeline_(&data_), |
| 578 linkage_(nullptr) {} | 578 linkage_(nullptr) {} |
| 579 | 579 |
| 580 protected: | 580 protected: |
| 581 Status PrepareJobImpl() final; | 581 Status PrepareJobImpl() final; |
| 582 Status ExecuteJobImpl() final; | 582 Status ExecuteJobImpl() final; |
| 583 Status FinalizeJobImpl() final; | 583 Status FinalizeJobImpl() final; |
| 584 | 584 |
| 585 private: | 585 private: |
| 586 Zone zone_; | 586 Zone zone_; |
| 587 ZoneStats zone_stats_; | 587 ZonePool zone_pool_; |
| 588 ParseInfo parse_info_; | 588 ParseInfo parse_info_; |
| 589 CompilationInfo info_; | 589 CompilationInfo info_; |
| 590 std::unique_ptr<PipelineStatistics> pipeline_statistics_; | 590 std::unique_ptr<PipelineStatistics> pipeline_statistics_; |
| 591 PipelineData data_; | 591 PipelineData data_; |
| 592 PipelineImpl pipeline_; | 592 PipelineImpl pipeline_; |
| 593 Linkage* linkage_; | 593 Linkage* linkage_; |
| 594 | 594 |
| 595 DISALLOW_COPY_AND_ASSIGN(PipelineCompilationJob); | 595 DISALLOW_COPY_AND_ASSIGN(PipelineCompilationJob); |
| 596 }; | 596 }; |
| 597 | 597 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 return SUCCEEDED; | 655 return SUCCEEDED; |
| 656 } | 656 } |
| 657 | 657 |
| 658 class PipelineWasmCompilationJob final : public CompilationJob { | 658 class PipelineWasmCompilationJob final : public CompilationJob { |
| 659 public: | 659 public: |
| 660 explicit PipelineWasmCompilationJob(CompilationInfo* info, Graph* graph, | 660 explicit PipelineWasmCompilationJob(CompilationInfo* info, Graph* graph, |
| 661 CallDescriptor* descriptor, | 661 CallDescriptor* descriptor, |
| 662 SourcePositionTable* source_positions) | 662 SourcePositionTable* source_positions) |
| 663 : CompilationJob(info->isolate(), info, "TurboFan", | 663 : CompilationJob(info->isolate(), info, "TurboFan", |
| 664 State::kReadyToExecute), | 664 State::kReadyToExecute), |
| 665 zone_stats_(info->isolate()->allocator()), | 665 zone_pool_(info->isolate()->allocator()), |
| 666 data_(&zone_stats_, info, graph, source_positions), | 666 data_(&zone_pool_, info, graph, source_positions), |
| 667 pipeline_(&data_), | 667 pipeline_(&data_), |
| 668 linkage_(descriptor) {} | 668 linkage_(descriptor) {} |
| 669 | 669 |
| 670 protected: | 670 protected: |
| 671 Status PrepareJobImpl() final; | 671 Status PrepareJobImpl() final; |
| 672 Status ExecuteJobImpl() final; | 672 Status ExecuteJobImpl() final; |
| 673 Status FinalizeJobImpl() final; | 673 Status FinalizeJobImpl() final; |
| 674 | 674 |
| 675 private: | 675 private: |
| 676 ZoneStats zone_stats_; | 676 ZonePool zone_pool_; |
| 677 PipelineData data_; | 677 PipelineData data_; |
| 678 PipelineImpl pipeline_; | 678 PipelineImpl pipeline_; |
| 679 Linkage linkage_; | 679 Linkage linkage_; |
| 680 }; | 680 }; |
| 681 | 681 |
| 682 PipelineWasmCompilationJob::Status | 682 PipelineWasmCompilationJob::Status |
| 683 PipelineWasmCompilationJob::PrepareJobImpl() { | 683 PipelineWasmCompilationJob::PrepareJobImpl() { |
| 684 UNREACHABLE(); // Prepare should always be skipped for WasmCompilationJob. | 684 UNREACHABLE(); // Prepare should always be skipped for WasmCompilationJob. |
| 685 return SUCCEEDED; | 685 return SUCCEEDED; |
| 686 } | 686 } |
| (...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1664 | 1664 |
| 1665 Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate, | 1665 Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate, |
| 1666 CallDescriptor* call_descriptor, | 1666 CallDescriptor* call_descriptor, |
| 1667 Graph* graph, Schedule* schedule, | 1667 Graph* graph, Schedule* schedule, |
| 1668 Code::Flags flags, | 1668 Code::Flags flags, |
| 1669 const char* debug_name) { | 1669 const char* debug_name) { |
| 1670 CompilationInfo info(CStrVector(debug_name), isolate, graph->zone(), flags); | 1670 CompilationInfo info(CStrVector(debug_name), isolate, graph->zone(), flags); |
| 1671 if (isolate->serializer_enabled()) info.PrepareForSerializing(); | 1671 if (isolate->serializer_enabled()) info.PrepareForSerializing(); |
| 1672 | 1672 |
| 1673 // Construct a pipeline for scheduling and code generation. | 1673 // Construct a pipeline for scheduling and code generation. |
| 1674 ZoneStats zone_stats(isolate->allocator()); | 1674 ZonePool zone_pool(isolate->allocator()); |
| 1675 PipelineData data(&zone_stats, &info, graph, schedule); | 1675 PipelineData data(&zone_pool, &info, graph, schedule); |
| 1676 std::unique_ptr<PipelineStatistics> pipeline_statistics; | 1676 std::unique_ptr<PipelineStatistics> pipeline_statistics; |
| 1677 if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 1677 if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { |
| 1678 pipeline_statistics.reset(new PipelineStatistics(&info, &zone_stats)); | 1678 pipeline_statistics.reset(new PipelineStatistics(&info, &zone_pool)); |
| 1679 pipeline_statistics->BeginPhaseKind("stub codegen"); | 1679 pipeline_statistics->BeginPhaseKind("stub codegen"); |
| 1680 } | 1680 } |
| 1681 | 1681 |
| 1682 PipelineImpl pipeline(&data); | 1682 PipelineImpl pipeline(&data); |
| 1683 DCHECK_NOT_NULL(data.schedule()); | 1683 DCHECK_NOT_NULL(data.schedule()); |
| 1684 | 1684 |
| 1685 if (FLAG_trace_turbo) { | 1685 if (FLAG_trace_turbo) { |
| 1686 { | 1686 { |
| 1687 TurboJsonFile json_of(&info, std::ios_base::trunc); | 1687 TurboJsonFile json_of(&info, std::ios_base::trunc); |
| 1688 json_of << "{\"function\":\"" << info.GetDebugName().get() | 1688 json_of << "{\"function\":\"" << info.GetDebugName().get() |
| 1689 << "\", \"source\":\"\",\n\"phases\":["; | 1689 << "\", \"source\":\"\",\n\"phases\":["; |
| 1690 } | 1690 } |
| 1691 pipeline.Run<PrintGraphPhase>("Machine"); | 1691 pipeline.Run<PrintGraphPhase>("Machine"); |
| 1692 } | 1692 } |
| 1693 | 1693 |
| 1694 pipeline.Run<VerifyGraphPhase>(false, true); | 1694 pipeline.Run<VerifyGraphPhase>(false, true); |
| 1695 return pipeline.ScheduleAndGenerateCode(call_descriptor); | 1695 return pipeline.ScheduleAndGenerateCode(call_descriptor); |
| 1696 } | 1696 } |
| 1697 | 1697 |
| 1698 // static | 1698 // static |
| 1699 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) { | 1699 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) { |
| 1700 ZoneStats zone_stats(info->isolate()->allocator()); | 1700 ZonePool zone_pool(info->isolate()->allocator()); |
| 1701 std::unique_ptr<PipelineStatistics> pipeline_statistics( | 1701 std::unique_ptr<PipelineStatistics> pipeline_statistics( |
| 1702 CreatePipelineStatistics(info, &zone_stats)); | 1702 CreatePipelineStatistics(info, &zone_pool)); |
| 1703 PipelineData data(&zone_stats, info, pipeline_statistics.get()); | 1703 PipelineData data(&zone_pool, info, pipeline_statistics.get()); |
| 1704 PipelineImpl pipeline(&data); | 1704 PipelineImpl pipeline(&data); |
| 1705 | 1705 |
| 1706 Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); | 1706 Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); |
| 1707 | 1707 |
| 1708 if (!pipeline.CreateGraph()) return Handle<Code>::null(); | 1708 if (!pipeline.CreateGraph()) return Handle<Code>::null(); |
| 1709 if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); | 1709 if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); |
| 1710 return pipeline.GenerateCode(&linkage); | 1710 return pipeline.GenerateCode(&linkage); |
| 1711 } | 1711 } |
| 1712 | 1712 |
| 1713 // static | 1713 // static |
| 1714 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 1714 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, |
| 1715 Graph* graph, | 1715 Graph* graph, |
| 1716 Schedule* schedule) { | 1716 Schedule* schedule) { |
| 1717 CallDescriptor* call_descriptor = | 1717 CallDescriptor* call_descriptor = |
| 1718 Linkage::ComputeIncoming(info->zone(), info); | 1718 Linkage::ComputeIncoming(info->zone(), info); |
| 1719 return GenerateCodeForTesting(info, call_descriptor, graph, schedule); | 1719 return GenerateCodeForTesting(info, call_descriptor, graph, schedule); |
| 1720 } | 1720 } |
| 1721 | 1721 |
| 1722 // static | 1722 // static |
| 1723 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 1723 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, |
| 1724 CallDescriptor* call_descriptor, | 1724 CallDescriptor* call_descriptor, |
| 1725 Graph* graph, | 1725 Graph* graph, |
| 1726 Schedule* schedule) { | 1726 Schedule* schedule) { |
| 1727 // Construct a pipeline for scheduling and code generation. | 1727 // Construct a pipeline for scheduling and code generation. |
| 1728 ZoneStats zone_stats(info->isolate()->allocator()); | 1728 ZonePool zone_pool(info->isolate()->allocator()); |
| 1729 PipelineData data(&zone_stats, info, graph, schedule); | 1729 PipelineData data(&zone_pool, info, graph, schedule); |
| 1730 std::unique_ptr<PipelineStatistics> pipeline_statistics; | 1730 std::unique_ptr<PipelineStatistics> pipeline_statistics; |
| 1731 if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 1731 if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { |
| 1732 pipeline_statistics.reset(new PipelineStatistics(info, &zone_stats)); | 1732 pipeline_statistics.reset(new PipelineStatistics(info, &zone_pool)); |
| 1733 pipeline_statistics->BeginPhaseKind("test codegen"); | 1733 pipeline_statistics->BeginPhaseKind("test codegen"); |
| 1734 } | 1734 } |
| 1735 | 1735 |
| 1736 PipelineImpl pipeline(&data); | 1736 PipelineImpl pipeline(&data); |
| 1737 | 1737 |
| 1738 if (FLAG_trace_turbo) { | 1738 if (FLAG_trace_turbo) { |
| 1739 TurboJsonFile json_of(info, std::ios_base::trunc); | 1739 TurboJsonFile json_of(info, std::ios_base::trunc); |
| 1740 json_of << "{\"function\":\"" << info->GetDebugName().get() | 1740 json_of << "{\"function\":\"" << info->GetDebugName().get() |
| 1741 << "\", \"source\":\"\",\n\"phases\":["; | 1741 << "\", \"source\":\"\",\n\"phases\":["; |
| 1742 } | 1742 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1757 SourcePositionTable* source_positions) { | 1757 SourcePositionTable* source_positions) { |
| 1758 return new PipelineWasmCompilationJob(info, graph, descriptor, | 1758 return new PipelineWasmCompilationJob(info, graph, descriptor, |
| 1759 source_positions); | 1759 source_positions); |
| 1760 } | 1760 } |
| 1761 | 1761 |
| 1762 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, | 1762 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, |
| 1763 InstructionSequence* sequence, | 1763 InstructionSequence* sequence, |
| 1764 bool run_verifier) { | 1764 bool run_verifier) { |
| 1765 CompilationInfo info(ArrayVector("testing"), sequence->isolate(), | 1765 CompilationInfo info(ArrayVector("testing"), sequence->isolate(), |
| 1766 sequence->zone(), Code::ComputeFlags(Code::STUB)); | 1766 sequence->zone(), Code::ComputeFlags(Code::STUB)); |
| 1767 ZoneStats zone_stats(sequence->isolate()->allocator()); | 1767 ZonePool zone_pool(sequence->isolate()->allocator()); |
| 1768 PipelineData data(&zone_stats, &info, sequence); | 1768 PipelineData data(&zone_pool, &info, sequence); |
| 1769 PipelineImpl pipeline(&data); | 1769 PipelineImpl pipeline(&data); |
| 1770 pipeline.data_->InitializeFrameData(nullptr); | 1770 pipeline.data_->InitializeFrameData(nullptr); |
| 1771 pipeline.AllocateRegisters(config, nullptr, run_verifier); | 1771 pipeline.AllocateRegisters(config, nullptr, run_verifier); |
| 1772 return !data.compilation_failed(); | 1772 return !data.compilation_failed(); |
| 1773 } | 1773 } |
| 1774 | 1774 |
| 1775 bool PipelineImpl::ScheduleAndSelectInstructions(Linkage* linkage) { | 1775 bool PipelineImpl::ScheduleAndSelectInstructions(Linkage* linkage) { |
| 1776 CallDescriptor* call_descriptor = linkage->GetIncomingDescriptor(); | 1776 CallDescriptor* call_descriptor = linkage->GetIncomingDescriptor(); |
| 1777 PipelineData* data = this->data_; | 1777 PipelineData* data = this->data_; |
| 1778 | 1778 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1990 data->DeleteRegisterAllocationZone(); | 1990 data->DeleteRegisterAllocationZone(); |
| 1991 } | 1991 } |
| 1992 | 1992 |
| 1993 CompilationInfo* PipelineImpl::info() const { return data_->info(); } | 1993 CompilationInfo* PipelineImpl::info() const { return data_->info(); } |
| 1994 | 1994 |
| 1995 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } | 1995 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } |
| 1996 | 1996 |
| 1997 } // namespace compiler | 1997 } // namespace compiler |
| 1998 } // namespace internal | 1998 } // namespace internal |
| 1999 } // namespace v8 | 1999 } // namespace v8 |
| OLD | NEW |