| 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 public: | 86 public: |
| 87 // For main entry point. | 87 // For main entry point. |
| 88 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, | 88 PipelineData(ZoneStats* zone_stats, 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_stats_(zone_stats), |
| 95 pipeline_statistics_(pipeline_statistics), | 95 pipeline_statistics_(pipeline_statistics), |
| 96 graph_zone_scope_(zone_stats_), | 96 graph_zone_scope_(zone_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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(ZoneStats* zone_stats, 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_stats_(zone_stats), |
| 123 graph_zone_scope_(zone_stats_), | 123 graph_zone_scope_(zone_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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(ZoneStats* zone_stats, 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_stats_(zone_stats), |
| 138 graph_zone_scope_(zone_stats_), | 138 graph_zone_scope_(zone_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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(ZoneStats* zone_stats, 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_stats_(zone_stats), |
| 154 graph_zone_scope_(zone_stats_), | 154 graph_zone_scope_(zone_stats_, ZONE_NAME), |
| 155 instruction_zone_scope_(zone_stats_), | 155 instruction_zone_scope_(zone_stats_, ZONE_NAME), |
| 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_stats_, ZONE_NAME), |
| 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_; } |
| (...skipping 342 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_stats(), ZONE_NAME) {} |
| 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 ZoneStats::Scope zone_scope_; |
| 528 }; | 528 }; |
| 529 | 529 |
| 530 PipelineStatistics* CreatePipelineStatistics(CompilationInfo* info, | 530 PipelineStatistics* CreatePipelineStatistics(CompilationInfo* info, |
| 531 ZoneStats* zone_stats) { | 531 ZoneStats* zone_stats) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 561 } | 561 } |
| 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(), ZONE_NAME), |
| 572 zone_stats_(isolate->allocator()), | 572 zone_stats_(isolate->allocator()), |
| 573 parse_info_(&zone_, handle(function->shared())), | 573 parse_info_(&zone_, handle(function->shared())), |
| 574 info_(&parse_info_, function), | 574 info_(&parse_info_, function), |
| 575 pipeline_statistics_(CreatePipelineStatistics(info(), &zone_stats_)), | 575 pipeline_statistics_(CreatePipelineStatistics(info(), &zone_stats_)), |
| 576 data_(&zone_stats_, info(), pipeline_statistics_.get()), | 576 data_(&zone_stats_, 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; |
| (...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1780 | 1780 |
| 1781 if (FLAG_turbo_profiling) { | 1781 if (FLAG_turbo_profiling) { |
| 1782 data->set_profiler_data(BasicBlockInstrumentor::Instrument( | 1782 data->set_profiler_data(BasicBlockInstrumentor::Instrument( |
| 1783 info(), data->graph(), data->schedule())); | 1783 info(), data->graph(), data->schedule())); |
| 1784 } | 1784 } |
| 1785 | 1785 |
| 1786 if (FLAG_turbo_verify_machine_graph != nullptr && | 1786 if (FLAG_turbo_verify_machine_graph != nullptr && |
| 1787 (!strcmp(FLAG_turbo_verify_machine_graph, "*") || | 1787 (!strcmp(FLAG_turbo_verify_machine_graph, "*") || |
| 1788 !strcmp(FLAG_turbo_verify_machine_graph, | 1788 !strcmp(FLAG_turbo_verify_machine_graph, |
| 1789 data->info()->GetDebugName().get()))) { | 1789 data->info()->GetDebugName().get()))) { |
| 1790 Zone temp_zone(data->isolate()->allocator()); | 1790 Zone temp_zone(data->isolate()->allocator(), ZONE_NAME); |
| 1791 MachineGraphVerifier::Run(data->graph(), data->schedule(), linkage, | 1791 MachineGraphVerifier::Run(data->graph(), data->schedule(), linkage, |
| 1792 &temp_zone); | 1792 &temp_zone); |
| 1793 } | 1793 } |
| 1794 | 1794 |
| 1795 data->InitializeInstructionSequence(call_descriptor); | 1795 data->InitializeInstructionSequence(call_descriptor); |
| 1796 | 1796 |
| 1797 data->InitializeFrameData(call_descriptor); | 1797 data->InitializeFrameData(call_descriptor); |
| 1798 // Select and schedule instructions covering the scheduled graph. | 1798 // Select and schedule instructions covering the scheduled graph. |
| 1799 Run<InstructionSelectionPhase>(linkage); | 1799 Run<InstructionSelectionPhase>(linkage); |
| 1800 if (data->compilation_failed()) { | 1800 if (data->compilation_failed()) { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1904 } | 1904 } |
| 1905 | 1905 |
| 1906 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config, | 1906 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config, |
| 1907 CallDescriptor* descriptor, | 1907 CallDescriptor* descriptor, |
| 1908 bool run_verifier) { | 1908 bool run_verifier) { |
| 1909 PipelineData* data = this->data_; | 1909 PipelineData* data = this->data_; |
| 1910 // Don't track usage for this zone in compiler stats. | 1910 // Don't track usage for this zone in compiler stats. |
| 1911 std::unique_ptr<Zone> verifier_zone; | 1911 std::unique_ptr<Zone> verifier_zone; |
| 1912 RegisterAllocatorVerifier* verifier = nullptr; | 1912 RegisterAllocatorVerifier* verifier = nullptr; |
| 1913 if (run_verifier) { | 1913 if (run_verifier) { |
| 1914 verifier_zone.reset(new Zone(isolate()->allocator())); | 1914 verifier_zone.reset(new Zone(isolate()->allocator(), ZONE_NAME)); |
| 1915 verifier = new (verifier_zone.get()) RegisterAllocatorVerifier( | 1915 verifier = new (verifier_zone.get()) RegisterAllocatorVerifier( |
| 1916 verifier_zone.get(), config, data->sequence()); | 1916 verifier_zone.get(), config, data->sequence()); |
| 1917 } | 1917 } |
| 1918 | 1918 |
| 1919 #ifdef DEBUG | 1919 #ifdef DEBUG |
| 1920 data_->sequence()->ValidateEdgeSplitForm(); | 1920 data_->sequence()->ValidateEdgeSplitForm(); |
| 1921 data_->sequence()->ValidateDeferredBlockEntryPaths(); | 1921 data_->sequence()->ValidateDeferredBlockEntryPaths(); |
| 1922 data_->sequence()->ValidateDeferredBlockExitPaths(); | 1922 data_->sequence()->ValidateDeferredBlockExitPaths(); |
| 1923 #endif | 1923 #endif |
| 1924 | 1924 |
| (...skipping 65 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 |