| 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 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 if (data->info()->is_deoptimization_enabled()) { | 793 if (data->info()->is_deoptimization_enabled()) { |
| 794 call_reducer_flags |= JSCallReducer::kDeoptimizationEnabled; | 794 call_reducer_flags |= JSCallReducer::kDeoptimizationEnabled; |
| 795 } | 795 } |
| 796 JSCallReducer call_reducer(&graph_reducer, data->jsgraph(), | 796 JSCallReducer call_reducer(&graph_reducer, data->jsgraph(), |
| 797 call_reducer_flags, data->native_context()); | 797 call_reducer_flags, data->native_context()); |
| 798 JSContextSpecialization context_specialization( | 798 JSContextSpecialization context_specialization( |
| 799 &graph_reducer, data->jsgraph(), | 799 &graph_reducer, data->jsgraph(), |
| 800 data->info()->is_function_context_specializing() | 800 data->info()->is_function_context_specializing() |
| 801 ? handle(data->info()->context()) | 801 ? handle(data->info()->context()) |
| 802 : MaybeHandle<Context>()); | 802 : MaybeHandle<Context>()); |
| 803 JSFrameSpecialization frame_specialization(data->info()->osr_frame(), | 803 JSFrameSpecialization frame_specialization( |
| 804 data->jsgraph()); | 804 &graph_reducer, data->info()->osr_frame(), data->jsgraph()); |
| 805 JSGlobalObjectSpecialization global_object_specialization( | 805 JSGlobalObjectSpecialization global_object_specialization( |
| 806 &graph_reducer, data->jsgraph(), data->native_context(), | 806 &graph_reducer, data->jsgraph(), data->native_context(), |
| 807 data->info()->dependencies()); | 807 data->info()->dependencies()); |
| 808 JSNativeContextSpecialization::Flags flags = | 808 JSNativeContextSpecialization::Flags flags = |
| 809 JSNativeContextSpecialization::kNoFlags; | 809 JSNativeContextSpecialization::kNoFlags; |
| 810 if (data->info()->is_accessor_inlining_enabled()) { | 810 if (data->info()->is_accessor_inlining_enabled()) { |
| 811 flags |= JSNativeContextSpecialization::kAccessorInliningEnabled; | 811 flags |= JSNativeContextSpecialization::kAccessorInliningEnabled; |
| 812 } | 812 } |
| 813 if (data->info()->is_bailout_on_uninitialized()) { | 813 if (data->info()->is_bailout_on_uninitialized()) { |
| 814 flags |= JSNativeContextSpecialization::kBailoutOnUninitialized; | 814 flags |= JSNativeContextSpecialization::kBailoutOnUninitialized; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 void Run(PipelineData* data, Zone* temp_zone, Typer* typer) { | 853 void Run(PipelineData* data, Zone* temp_zone, Typer* typer) { |
| 854 NodeVector roots(temp_zone); | 854 NodeVector roots(temp_zone); |
| 855 data->jsgraph()->GetCachedNodes(&roots); | 855 data->jsgraph()->GetCachedNodes(&roots); |
| 856 LoopVariableOptimizer induction_vars(data->jsgraph()->graph(), | 856 LoopVariableOptimizer induction_vars(data->jsgraph()->graph(), |
| 857 data->common(), temp_zone); | 857 data->common(), temp_zone); |
| 858 if (FLAG_turbo_loop_variable) induction_vars.Run(); | 858 if (FLAG_turbo_loop_variable) induction_vars.Run(); |
| 859 typer->Run(roots, &induction_vars); | 859 typer->Run(roots, &induction_vars); |
| 860 } | 860 } |
| 861 }; | 861 }; |
| 862 | 862 |
| 863 #ifdef DEBUG | 863 struct OsrTyperPhase { |
| 864 static const char* phase_name() { return "osr typer"; } |
| 865 |
| 866 void Run(PipelineData* data, Zone* temp_zone) { |
| 867 NodeVector roots(temp_zone); |
| 868 data->jsgraph()->GetCachedNodes(&roots); |
| 869 // Dummy induction variable optimizer: at the moment, we do not try |
| 870 // to compute loop variable bounds on OSR. |
| 871 LoopVariableOptimizer induction_vars(data->jsgraph()->graph(), |
| 872 data->common(), temp_zone); |
| 873 Typer typer(data->isolate(), data->graph()); |
| 874 typer.Run(roots, &induction_vars); |
| 875 } |
| 876 }; |
| 864 | 877 |
| 865 struct UntyperPhase { | 878 struct UntyperPhase { |
| 866 static const char* phase_name() { return "untyper"; } | 879 static const char* phase_name() { return "untyper"; } |
| 867 | 880 |
| 868 void Run(PipelineData* data, Zone* temp_zone) { | 881 void Run(PipelineData* data, Zone* temp_zone) { |
| 869 class RemoveTypeReducer final : public Reducer { | 882 class RemoveTypeReducer final : public Reducer { |
| 870 public: | 883 public: |
| 871 Reduction Reduce(Node* node) final { | 884 Reduction Reduce(Node* node) final { |
| 872 if (NodeProperties::IsTyped(node)) { | 885 if (NodeProperties::IsTyped(node)) { |
| 873 NodeProperties::RemoveType(node); | 886 NodeProperties::RemoveType(node); |
| 874 return Changed(node); | 887 return Changed(node); |
| 875 } | 888 } |
| 876 return NoChange(); | 889 return NoChange(); |
| 877 } | 890 } |
| 878 }; | 891 }; |
| 879 | 892 |
| 893 NodeVector roots(temp_zone); |
| 894 data->jsgraph()->GetCachedNodes(&roots); |
| 895 for (Node* node : roots) { |
| 896 NodeProperties::RemoveType(node); |
| 897 } |
| 898 |
| 880 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); | 899 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
| 881 RemoveTypeReducer remove_type_reducer; | 900 RemoveTypeReducer remove_type_reducer; |
| 882 AddReducer(data, &graph_reducer, &remove_type_reducer); | 901 AddReducer(data, &graph_reducer, &remove_type_reducer); |
| 883 graph_reducer.ReduceGraph(); | 902 graph_reducer.ReduceGraph(); |
| 884 } | 903 } |
| 885 }; | 904 }; |
| 886 | 905 |
| 887 #endif // DEBUG | |
| 888 | |
| 889 struct OsrDeconstructionPhase { | 906 struct OsrDeconstructionPhase { |
| 890 static const char* phase_name() { return "OSR deconstruction"; } | 907 static const char* phase_name() { return "OSR deconstruction"; } |
| 891 | 908 |
| 892 void Run(PipelineData* data, Zone* temp_zone) { | 909 void Run(PipelineData* data, Zone* temp_zone) { |
| 910 GraphTrimmer trimmer(temp_zone, data->graph()); |
| 911 NodeVector roots(temp_zone); |
| 912 data->jsgraph()->GetCachedNodes(&roots); |
| 913 trimmer.TrimGraph(roots.begin(), roots.end()); |
| 914 |
| 893 OsrHelper osr_helper(data->info()); | 915 OsrHelper osr_helper(data->info()); |
| 894 osr_helper.Deconstruct(data->jsgraph(), data->common(), temp_zone); | 916 osr_helper.Deconstruct(data->jsgraph(), data->common(), temp_zone); |
| 895 } | 917 } |
| 896 }; | 918 }; |
| 897 | 919 |
| 898 | 920 |
| 899 struct TypedLoweringPhase { | 921 struct TypedLoweringPhase { |
| 900 static const char* phase_name() { return "typed lowering"; } | 922 static const char* phase_name() { return "typed lowering"; } |
| 901 | 923 |
| 902 void Run(PipelineData* data, Zone* temp_zone) { | 924 void Run(PipelineData* data, Zone* temp_zone) { |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 | 1511 |
| 1490 Run<GraphBuilderPhase>(); | 1512 Run<GraphBuilderPhase>(); |
| 1491 if (data->compilation_failed()) { | 1513 if (data->compilation_failed()) { |
| 1492 data->EndPhaseKind(); | 1514 data->EndPhaseKind(); |
| 1493 return false; | 1515 return false; |
| 1494 } | 1516 } |
| 1495 RunPrintAndVerify("Initial untyped", true); | 1517 RunPrintAndVerify("Initial untyped", true); |
| 1496 | 1518 |
| 1497 // Perform OSR deconstruction. | 1519 // Perform OSR deconstruction. |
| 1498 if (info()->is_osr()) { | 1520 if (info()->is_osr()) { |
| 1521 Run<OsrTyperPhase>(); |
| 1522 |
| 1499 Run<OsrDeconstructionPhase>(); | 1523 Run<OsrDeconstructionPhase>(); |
| 1524 |
| 1525 Run<UntyperPhase>(); |
| 1500 RunPrintAndVerify("OSR deconstruction", true); | 1526 RunPrintAndVerify("OSR deconstruction", true); |
| 1501 } | 1527 } |
| 1502 | 1528 |
| 1503 // Perform function context specialization and inlining (if enabled). | 1529 // Perform function context specialization and inlining (if enabled). |
| 1504 Run<InliningPhase>(); | 1530 Run<InliningPhase>(); |
| 1505 RunPrintAndVerify("Inlined", true); | 1531 RunPrintAndVerify("Inlined", true); |
| 1506 | 1532 |
| 1507 // Remove dead->live edges from the graph. | 1533 // Remove dead->live edges from the graph. |
| 1508 Run<EarlyGraphTrimmingPhase>(); | 1534 Run<EarlyGraphTrimmingPhase>(); |
| 1509 RunPrintAndVerify("Early trimmed", true); | 1535 RunPrintAndVerify("Early trimmed", true); |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1956 data->DeleteRegisterAllocationZone(); | 1982 data->DeleteRegisterAllocationZone(); |
| 1957 } | 1983 } |
| 1958 | 1984 |
| 1959 CompilationInfo* PipelineImpl::info() const { return data_->info(); } | 1985 CompilationInfo* PipelineImpl::info() const { return data_->info(); } |
| 1960 | 1986 |
| 1961 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } | 1987 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } |
| 1962 | 1988 |
| 1963 } // namespace compiler | 1989 } // namespace compiler |
| 1964 } // namespace internal | 1990 } // namespace internal |
| 1965 } // namespace v8 | 1991 } // namespace v8 |
| OLD | NEW |