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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 ZonePool::Scope instruction_zone_scope_; | 240 ZonePool::Scope instruction_zone_scope_; |
241 Zone* instruction_zone_; | 241 Zone* instruction_zone_; |
242 InstructionSequence* sequence_; | 242 InstructionSequence* sequence_; |
243 Frame* frame_; | 243 Frame* frame_; |
244 RegisterAllocator* register_allocator_; | 244 RegisterAllocator* register_allocator_; |
245 | 245 |
246 DISALLOW_COPY_AND_ASSIGN(PipelineData); | 246 DISALLOW_COPY_AND_ASSIGN(PipelineData); |
247 }; | 247 }; |
248 | 248 |
249 | 249 |
250 static inline bool VerifyGraphs() { | |
251 #ifdef DEBUG | |
252 return true; | |
253 #else | |
254 return FLAG_turbo_verify; | |
255 #endif | |
256 } | |
257 | |
258 | |
259 struct TurboCfgFile : public std::ofstream { | 250 struct TurboCfgFile : public std::ofstream { |
260 explicit TurboCfgFile(Isolate* isolate) | 251 explicit TurboCfgFile(Isolate* isolate) |
261 : std::ofstream(isolate->GetTurboCfgFileName().c_str(), | 252 : std::ofstream(isolate->GetTurboCfgFileName().c_str(), |
262 std::ios_base::app) {} | 253 std::ios_base::app) {} |
263 }; | 254 }; |
264 | 255 |
265 | 256 |
266 static void TraceSchedule(Schedule* schedule) { | 257 static void TraceSchedule(Schedule* schedule) { |
267 if (!FLAG_trace_turbo_graph && !FLAG_trace_turbo_scheduler) return; | 258 if (!FLAG_trace_turbo_graph && !FLAG_trace_turbo_scheduler) return; |
268 OFStream os(stdout); | 259 OFStream os(stdout); |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 } | 518 } |
528 }; | 519 }; |
529 | 520 |
530 | 521 |
531 struct ComputeSchedulePhase { | 522 struct ComputeSchedulePhase { |
532 static const char* phase_name() { return "scheduling"; } | 523 static const char* phase_name() { return "scheduling"; } |
533 | 524 |
534 void Run(PipelineData* data, Zone* temp_zone) { | 525 void Run(PipelineData* data, Zone* temp_zone) { |
535 Schedule* schedule = Scheduler::ComputeSchedule(temp_zone, data->graph()); | 526 Schedule* schedule = Scheduler::ComputeSchedule(temp_zone, data->graph()); |
536 TraceSchedule(schedule); | 527 TraceSchedule(schedule); |
537 if (VerifyGraphs()) ScheduleVerifier::Run(schedule); | 528 if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule); |
538 data->set_schedule(schedule); | 529 data->set_schedule(schedule); |
539 } | 530 } |
540 }; | 531 }; |
541 | 532 |
542 | 533 |
543 struct InstructionSelectionPhase { | 534 struct InstructionSelectionPhase { |
544 static const char* phase_name() { return "select instructions"; } | 535 static const char* phase_name() { return "select instructions"; } |
545 | 536 |
546 void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) { | 537 void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) { |
547 InstructionSelector selector(temp_zone, data->graph()->NodeCount(), linkage, | 538 InstructionSelector selector(temp_zone, data->graph()->NodeCount(), linkage, |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 if (data_->pipeline_statistics() != NULL) { | 737 if (data_->pipeline_statistics() != NULL) { |
747 data_->pipeline_statistics()->BeginPhaseKind(phase_kind_name); | 738 data_->pipeline_statistics()->BeginPhaseKind(phase_kind_name); |
748 } | 739 } |
749 } | 740 } |
750 | 741 |
751 | 742 |
752 void Pipeline::RunPrintAndVerify(const char* phase, bool untyped) { | 743 void Pipeline::RunPrintAndVerify(const char* phase, bool untyped) { |
753 if (FLAG_trace_turbo) { | 744 if (FLAG_trace_turbo) { |
754 Run<PrintGraphPhase>(phase); | 745 Run<PrintGraphPhase>(phase); |
755 } | 746 } |
756 if (VerifyGraphs()) { | 747 if (FLAG_turbo_verify) { |
757 Run<VerifyGraphPhase>(untyped); | 748 Run<VerifyGraphPhase>(untyped); |
758 } | 749 } |
759 } | 750 } |
760 | 751 |
761 | 752 |
762 Handle<Code> Pipeline::GenerateCode() { | 753 Handle<Code> Pipeline::GenerateCode() { |
763 // This list must be kept in sync with DisableTurbofan in ast-numbering.cc. | 754 // This list must be kept in sync with DisableTurbofan in ast-numbering.cc. |
764 if (info()->function()->dont_optimize_reason() == kTryCatchStatement || | 755 if (info()->function()->dont_optimize_reason() == kTryCatchStatement || |
765 info()->function()->dont_optimize_reason() == kTryFinallyStatement || | 756 info()->function()->dont_optimize_reason() == kTryFinallyStatement || |
766 // TODO(turbofan): Make super work and remove this bailout. | 757 // TODO(turbofan): Make super work and remove this bailout. |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
983 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { | 974 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { |
984 TurboCfgFile tcf(isolate()); | 975 TurboCfgFile tcf(isolate()); |
985 tcf << AsC1V("CodeGen", data->schedule(), data->source_positions(), | 976 tcf << AsC1V("CodeGen", data->schedule(), data->source_positions(), |
986 data->sequence()); | 977 data->sequence()); |
987 } | 978 } |
988 | 979 |
989 data->DeleteGraphZone(); | 980 data->DeleteGraphZone(); |
990 | 981 |
991 BeginPhaseKind("register allocation"); | 982 BeginPhaseKind("register allocation"); |
992 | 983 |
993 bool run_verifier = false; | 984 bool run_verifier = FLAG_turbo_verify_allocation; |
994 #ifdef DEBUG | |
995 run_verifier = true; | |
996 #endif | |
997 // Allocate registers. | 985 // Allocate registers. |
998 AllocateRegisters(RegisterConfiguration::ArchDefault(), run_verifier); | 986 AllocateRegisters(RegisterConfiguration::ArchDefault(), run_verifier); |
999 if (data->compilation_failed()) { | 987 if (data->compilation_failed()) { |
1000 info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc); | 988 info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc); |
1001 return; | 989 return; |
1002 } | 990 } |
1003 | 991 |
1004 BeginPhaseKind("code generation"); | 992 BeginPhaseKind("code generation"); |
1005 | 993 |
1006 // Optimimize jumps. | 994 // Optimimize jumps. |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1095 } | 1083 } |
1096 | 1084 |
1097 | 1085 |
1098 void Pipeline::TearDown() { | 1086 void Pipeline::TearDown() { |
1099 InstructionOperand::TearDownCaches(); | 1087 InstructionOperand::TearDownCaches(); |
1100 } | 1088 } |
1101 | 1089 |
1102 } // namespace compiler | 1090 } // namespace compiler |
1103 } // namespace internal | 1091 } // namespace internal |
1104 } // namespace v8 | 1092 } // namespace v8 |
OLD | NEW |