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