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 10 matching lines...) Expand all Loading... |
21 #include "src/compiler/instruction-selector.h" | 21 #include "src/compiler/instruction-selector.h" |
22 #include "src/compiler/js-builtin-reducer.h" | 22 #include "src/compiler/js-builtin-reducer.h" |
23 #include "src/compiler/js-context-specialization.h" | 23 #include "src/compiler/js-context-specialization.h" |
24 #include "src/compiler/js-generic-lowering.h" | 24 #include "src/compiler/js-generic-lowering.h" |
25 #include "src/compiler/js-inlining.h" | 25 #include "src/compiler/js-inlining.h" |
26 #include "src/compiler/js-typed-lowering.h" | 26 #include "src/compiler/js-typed-lowering.h" |
27 #include "src/compiler/jump-threading.h" | 27 #include "src/compiler/jump-threading.h" |
28 #include "src/compiler/load-elimination.h" | 28 #include "src/compiler/load-elimination.h" |
29 #include "src/compiler/machine-operator-reducer.h" | 29 #include "src/compiler/machine-operator-reducer.h" |
30 #include "src/compiler/move-optimizer.h" | 30 #include "src/compiler/move-optimizer.h" |
| 31 #include "src/compiler/osr.h" |
31 #include "src/compiler/pipeline-statistics.h" | 32 #include "src/compiler/pipeline-statistics.h" |
32 #include "src/compiler/register-allocator.h" | 33 #include "src/compiler/register-allocator.h" |
33 #include "src/compiler/register-allocator-verifier.h" | 34 #include "src/compiler/register-allocator-verifier.h" |
34 #include "src/compiler/schedule.h" | 35 #include "src/compiler/schedule.h" |
35 #include "src/compiler/scheduler.h" | 36 #include "src/compiler/scheduler.h" |
36 #include "src/compiler/select-lowering.h" | 37 #include "src/compiler/select-lowering.h" |
37 #include "src/compiler/simplified-lowering.h" | 38 #include "src/compiler/simplified-lowering.h" |
38 #include "src/compiler/simplified-operator-reducer.h" | 39 #include "src/compiler/simplified-operator-reducer.h" |
39 #include "src/compiler/typer.h" | 40 #include "src/compiler/typer.h" |
40 #include "src/compiler/value-numbering-reducer.h" | 41 #include "src/compiler/value-numbering-reducer.h" |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 }; | 405 }; |
405 | 406 |
406 | 407 |
407 struct TyperPhase { | 408 struct TyperPhase { |
408 static const char* phase_name() { return "typer"; } | 409 static const char* phase_name() { return "typer"; } |
409 | 410 |
410 void Run(PipelineData* data, Zone* temp_zone) { data->typer()->Run(); } | 411 void Run(PipelineData* data, Zone* temp_zone) { data->typer()->Run(); } |
411 }; | 412 }; |
412 | 413 |
413 | 414 |
| 415 struct OsrDeconstructionPhase { |
| 416 static const char* phase_name() { return "OSR deconstruction"; } |
| 417 |
| 418 void Run(PipelineData* data, Zone* temp_zone) { |
| 419 SourcePositionTable::Scope pos(data->source_positions(), |
| 420 SourcePosition::Unknown()); |
| 421 OsrHelper osr_helper(data->info()); |
| 422 osr_helper.Deconstruct(data->jsgraph(), data->common(), temp_zone); |
| 423 } |
| 424 }; |
| 425 |
| 426 |
414 struct TypedLoweringPhase { | 427 struct TypedLoweringPhase { |
415 static const char* phase_name() { return "typed lowering"; } | 428 static const char* phase_name() { return "typed lowering"; } |
416 | 429 |
417 void Run(PipelineData* data, Zone* temp_zone) { | 430 void Run(PipelineData* data, Zone* temp_zone) { |
418 SourcePositionTable::Scope pos(data->source_positions(), | 431 SourcePositionTable::Scope pos(data->source_positions(), |
419 SourcePosition::Unknown()); | 432 SourcePosition::Unknown()); |
420 ValueNumberingReducer vn_reducer(temp_zone); | 433 ValueNumberingReducer vn_reducer(temp_zone); |
421 LoadElimination load_elimination; | 434 LoadElimination load_elimination; |
422 JSBuiltinReducer builtin_reducer(data->jsgraph()); | 435 JSBuiltinReducer builtin_reducer(data->jsgraph()); |
423 JSTypedLowering typed_lowering(data->jsgraph(), temp_zone); | 436 JSTypedLowering typed_lowering(data->jsgraph(), temp_zone); |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 Handle<Code> Pipeline::GenerateCode() { | 762 Handle<Code> Pipeline::GenerateCode() { |
750 // This list must be kept in sync with DONT_TURBOFAN_NODE in ast.cc. | 763 // This list must be kept in sync with DONT_TURBOFAN_NODE in ast.cc. |
751 if (info()->function()->dont_optimize_reason() == kTryCatchStatement || | 764 if (info()->function()->dont_optimize_reason() == kTryCatchStatement || |
752 info()->function()->dont_optimize_reason() == kTryFinallyStatement || | 765 info()->function()->dont_optimize_reason() == kTryFinallyStatement || |
753 // TODO(turbofan): Make ES6 for-of work and remove this bailout. | 766 // TODO(turbofan): Make ES6 for-of work and remove this bailout. |
754 info()->function()->dont_optimize_reason() == kForOfStatement || | 767 info()->function()->dont_optimize_reason() == kForOfStatement || |
755 // TODO(turbofan): Make super work and remove this bailout. | 768 // TODO(turbofan): Make super work and remove this bailout. |
756 info()->function()->dont_optimize_reason() == kSuperReference || | 769 info()->function()->dont_optimize_reason() == kSuperReference || |
757 // TODO(turbofan): Make class literals work and remove this bailout. | 770 // TODO(turbofan): Make class literals work and remove this bailout. |
758 info()->function()->dont_optimize_reason() == kClassLiteral || | 771 info()->function()->dont_optimize_reason() == kClassLiteral || |
759 // TODO(turbofan): Make OSR work and remove this bailout. | 772 // TODO(turbofan): Make OSR work with inner loops and remove this bailout. |
760 info()->is_osr()) { | 773 (info()->is_osr() && !FLAG_turbo_osr)) { |
761 return Handle<Code>::null(); | 774 return Handle<Code>::null(); |
762 } | 775 } |
763 | 776 |
764 ZonePool zone_pool(isolate()); | 777 ZonePool zone_pool(isolate()); |
765 SmartPointer<PipelineStatistics> pipeline_statistics; | 778 SmartPointer<PipelineStatistics> pipeline_statistics; |
766 | 779 |
767 if (FLAG_turbo_stats) { | 780 if (FLAG_turbo_stats) { |
768 pipeline_statistics.Reset(new PipelineStatistics(info(), &zone_pool)); | 781 pipeline_statistics.Reset(new PipelineStatistics(info(), &zone_pool)); |
769 pipeline_statistics->BeginPhaseKind("initializing"); | 782 pipeline_statistics->BeginPhaseKind("initializing"); |
770 } | 783 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
822 RunPrintAndVerify("Typed"); | 835 RunPrintAndVerify("Typed"); |
823 } | 836 } |
824 | 837 |
825 BeginPhaseKind("lowering"); | 838 BeginPhaseKind("lowering"); |
826 | 839 |
827 if (info()->is_typing_enabled()) { | 840 if (info()->is_typing_enabled()) { |
828 // Lower JSOperators where we can determine types. | 841 // Lower JSOperators where we can determine types. |
829 Run<TypedLoweringPhase>(); | 842 Run<TypedLoweringPhase>(); |
830 RunPrintAndVerify("Lowered typed"); | 843 RunPrintAndVerify("Lowered typed"); |
831 | 844 |
| 845 if (info()->is_osr()) { |
| 846 Run<OsrDeconstructionPhase>(); |
| 847 RunPrintAndVerify("OSR deconstruction"); |
| 848 } |
| 849 |
832 // Lower simplified operators and insert changes. | 850 // Lower simplified operators and insert changes. |
833 Run<SimplifiedLoweringPhase>(); | 851 Run<SimplifiedLoweringPhase>(); |
834 RunPrintAndVerify("Lowered simplified"); | 852 RunPrintAndVerify("Lowered simplified"); |
835 | 853 |
836 // Lower changes that have been inserted before. | 854 // Lower changes that have been inserted before. |
837 Run<ChangeLoweringPhase>(); | 855 Run<ChangeLoweringPhase>(); |
838 // // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. | 856 // // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
839 RunPrintAndVerify("Lowered changes", true); | 857 RunPrintAndVerify("Lowered changes", true); |
840 | 858 |
841 Run<LateControlReductionPhase>(); | 859 Run<LateControlReductionPhase>(); |
842 RunPrintAndVerify("Late Control reduced"); | 860 RunPrintAndVerify("Late Control reduced"); |
| 861 } else { |
| 862 if (info()->is_osr()) { |
| 863 Run<OsrDeconstructionPhase>(); |
| 864 RunPrintAndVerify("OSR deconstruction"); |
| 865 } |
843 } | 866 } |
844 | 867 |
845 // Lower any remaining generic JSOperators. | 868 // Lower any remaining generic JSOperators. |
846 Run<GenericLoweringPhase>(); | 869 Run<GenericLoweringPhase>(); |
847 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. | 870 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
848 RunPrintAndVerify("Lowered generic", true); | 871 RunPrintAndVerify("Lowered generic", true); |
849 | 872 |
850 BeginPhaseKind("block building"); | 873 BeginPhaseKind("block building"); |
851 | 874 |
852 data.source_positions()->RemoveDecorator(); | 875 data.source_positions()->RemoveDecorator(); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 } | 1037 } |
1015 | 1038 |
1016 SmartArrayPointer<char> debug_name; | 1039 SmartArrayPointer<char> debug_name; |
1017 #ifdef DEBUG | 1040 #ifdef DEBUG |
1018 debug_name = GetDebugName(data->info()); | 1041 debug_name = GetDebugName(data->info()); |
1019 #endif | 1042 #endif |
1020 | 1043 |
1021 ZonePool::Scope zone_scope(data->zone_pool()); | 1044 ZonePool::Scope zone_scope(data->zone_pool()); |
1022 data->InitializeRegisterAllocator(zone_scope.zone(), config, | 1045 data->InitializeRegisterAllocator(zone_scope.zone(), config, |
1023 debug_name.get()); | 1046 debug_name.get()); |
| 1047 if (info()->is_osr()) { |
| 1048 OsrHelper osr_helper(info()); |
| 1049 osr_helper.SetupFrame(data->frame()); |
| 1050 } |
1024 | 1051 |
1025 Run<MeetRegisterConstraintsPhase>(); | 1052 Run<MeetRegisterConstraintsPhase>(); |
1026 Run<ResolvePhisPhase>(); | 1053 Run<ResolvePhisPhase>(); |
1027 Run<BuildLiveRangesPhase>(); | 1054 Run<BuildLiveRangesPhase>(); |
1028 if (FLAG_trace_turbo_graph) { | 1055 if (FLAG_trace_turbo_graph) { |
1029 OFStream os(stdout); | 1056 OFStream os(stdout); |
1030 PrintableInstructionSequence printable = {config, data->sequence()}; | 1057 PrintableInstructionSequence printable = {config, data->sequence()}; |
1031 os << "----- Instruction sequence before register allocation -----\n" | 1058 os << "----- Instruction sequence before register allocation -----\n" |
1032 << printable; | 1059 << printable; |
1033 } | 1060 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1070 } | 1097 } |
1071 | 1098 |
1072 | 1099 |
1073 void Pipeline::TearDown() { | 1100 void Pipeline::TearDown() { |
1074 InstructionOperand::TearDownCaches(); | 1101 InstructionOperand::TearDownCaches(); |
1075 } | 1102 } |
1076 | 1103 |
1077 } // namespace compiler | 1104 } // namespace compiler |
1078 } // namespace internal | 1105 } // namespace internal |
1079 } // namespace v8 | 1106 } // namespace v8 |
OLD | NEW |