| 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/adapters.h" | 10 #include "src/base/adapters.h" |
| (...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 }; | 865 }; |
| 866 | 866 |
| 867 | 867 |
| 868 struct TypedLoweringPhase { | 868 struct TypedLoweringPhase { |
| 869 static const char* phase_name() { return "typed lowering"; } | 869 static const char* phase_name() { return "typed lowering"; } |
| 870 | 870 |
| 871 void Run(PipelineData* data, Zone* temp_zone) { | 871 void Run(PipelineData* data, Zone* temp_zone) { |
| 872 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); | 872 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
| 873 DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), | 873 DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), |
| 874 data->common()); | 874 data->common()); |
| 875 LoadElimination load_elimination(&graph_reducer, data->graph(), | |
| 876 data->jsgraph()->simplified()); | |
| 877 JSBuiltinReducer builtin_reducer(&graph_reducer, data->jsgraph()); | 875 JSBuiltinReducer builtin_reducer(&graph_reducer, data->jsgraph()); |
| 878 MaybeHandle<LiteralsArray> literals_array = | 876 MaybeHandle<LiteralsArray> literals_array = |
| 879 data->info()->is_native_context_specializing() | 877 data->info()->is_native_context_specializing() |
| 880 ? handle(data->info()->closure()->literals(), data->isolate()) | 878 ? handle(data->info()->closure()->literals(), data->isolate()) |
| 881 : MaybeHandle<LiteralsArray>(); | 879 : MaybeHandle<LiteralsArray>(); |
| 882 JSCreateLowering create_lowering( | 880 JSCreateLowering create_lowering( |
| 883 &graph_reducer, data->info()->dependencies(), data->jsgraph(), | 881 &graph_reducer, data->info()->dependencies(), data->jsgraph(), |
| 884 literals_array, temp_zone); | 882 literals_array, temp_zone); |
| 885 JSTypedLowering::Flags typed_lowering_flags = JSTypedLowering::kNoFlags; | 883 JSTypedLowering::Flags typed_lowering_flags = JSTypedLowering::kNoFlags; |
| 886 if (data->info()->is_deoptimization_enabled()) { | 884 if (data->info()->is_deoptimization_enabled()) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 905 CheckpointElimination checkpoint_elimination(&graph_reducer); | 903 CheckpointElimination checkpoint_elimination(&graph_reducer); |
| 906 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), | 904 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), |
| 907 data->common(), data->machine()); | 905 data->common(), data->machine()); |
| 908 AddReducer(data, &graph_reducer, &dead_code_elimination); | 906 AddReducer(data, &graph_reducer, &dead_code_elimination); |
| 909 AddReducer(data, &graph_reducer, &builtin_reducer); | 907 AddReducer(data, &graph_reducer, &builtin_reducer); |
| 910 if (data->info()->is_deoptimization_enabled()) { | 908 if (data->info()->is_deoptimization_enabled()) { |
| 911 AddReducer(data, &graph_reducer, &create_lowering); | 909 AddReducer(data, &graph_reducer, &create_lowering); |
| 912 } | 910 } |
| 913 AddReducer(data, &graph_reducer, &typed_lowering); | 911 AddReducer(data, &graph_reducer, &typed_lowering); |
| 914 AddReducer(data, &graph_reducer, &intrinsic_lowering); | 912 AddReducer(data, &graph_reducer, &intrinsic_lowering); |
| 915 AddReducer(data, &graph_reducer, &load_elimination); | |
| 916 AddReducer(data, &graph_reducer, &value_numbering); | 913 AddReducer(data, &graph_reducer, &value_numbering); |
| 917 AddReducer(data, &graph_reducer, &simple_reducer); | 914 AddReducer(data, &graph_reducer, &simple_reducer); |
| 918 AddReducer(data, &graph_reducer, &checkpoint_elimination); | 915 AddReducer(data, &graph_reducer, &checkpoint_elimination); |
| 919 AddReducer(data, &graph_reducer, &common_reducer); | 916 AddReducer(data, &graph_reducer, &common_reducer); |
| 920 graph_reducer.ReduceGraph(); | 917 graph_reducer.ReduceGraph(); |
| 921 } | 918 } |
| 922 }; | 919 }; |
| 923 | 920 |
| 924 | 921 |
| 925 struct BranchEliminationPhase { | 922 struct BranchEliminationPhase { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 | 1033 |
| 1037 struct StoreStoreEliminationPhase { | 1034 struct StoreStoreEliminationPhase { |
| 1038 static const char* phase_name() { return "Store-store elimination"; } | 1035 static const char* phase_name() { return "Store-store elimination"; } |
| 1039 | 1036 |
| 1040 void Run(PipelineData* data, Zone* temp_zone) { | 1037 void Run(PipelineData* data, Zone* temp_zone) { |
| 1041 StoreStoreElimination store_store_elimination(data->jsgraph(), temp_zone); | 1038 StoreStoreElimination store_store_elimination(data->jsgraph(), temp_zone); |
| 1042 store_store_elimination.Run(); | 1039 store_store_elimination.Run(); |
| 1043 } | 1040 } |
| 1044 }; | 1041 }; |
| 1045 | 1042 |
| 1043 struct LoadEliminationPhase { |
| 1044 static const char* phase_name() { return "load elimination"; } |
| 1045 |
| 1046 void Run(PipelineData* data, Zone* temp_zone) { |
| 1047 // The memory optimizer requires the graphs to be trimmed, so trim now. |
| 1048 GraphTrimmer trimmer(temp_zone, data->graph()); |
| 1049 NodeVector roots(temp_zone); |
| 1050 data->jsgraph()->GetCachedNodes(&roots); |
| 1051 trimmer.TrimGraph(roots.begin(), roots.end()); |
| 1052 |
| 1053 // Eliminate redundant loads. |
| 1054 LoadElimination load_elimination(data->graph(), temp_zone); |
| 1055 load_elimination.Run(); |
| 1056 } |
| 1057 }; |
| 1058 |
| 1046 struct MemoryOptimizationPhase { | 1059 struct MemoryOptimizationPhase { |
| 1047 static const char* phase_name() { return "memory optimization"; } | 1060 static const char* phase_name() { return "memory optimization"; } |
| 1048 | 1061 |
| 1049 void Run(PipelineData* data, Zone* temp_zone) { | 1062 void Run(PipelineData* data, Zone* temp_zone) { |
| 1050 // The memory optimizer requires the graphs to be trimmed, so trim now. | 1063 // The memory optimizer requires the graphs to be trimmed, so trim now. |
| 1051 GraphTrimmer trimmer(temp_zone, data->graph()); | 1064 GraphTrimmer trimmer(temp_zone, data->graph()); |
| 1052 NodeVector roots(temp_zone); | 1065 NodeVector roots(temp_zone); |
| 1053 data->jsgraph()->GetCachedNodes(&roots); | 1066 data->jsgraph()->GetCachedNodes(&roots); |
| 1054 trimmer.TrimGraph(roots.begin(), roots.end()); | 1067 trimmer.TrimGraph(roots.begin(), roots.end()); |
| 1055 | 1068 |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1439 | 1452 |
| 1440 if (FLAG_turbo_stress_loop_peeling) { | 1453 if (FLAG_turbo_stress_loop_peeling) { |
| 1441 Run<StressLoopPeelingPhase>(); | 1454 Run<StressLoopPeelingPhase>(); |
| 1442 RunPrintAndVerify("Loop peeled"); | 1455 RunPrintAndVerify("Loop peeled"); |
| 1443 } | 1456 } |
| 1444 | 1457 |
| 1445 if (FLAG_turbo_escape) { | 1458 if (FLAG_turbo_escape) { |
| 1446 Run<EscapeAnalysisPhase>(); | 1459 Run<EscapeAnalysisPhase>(); |
| 1447 RunPrintAndVerify("Escape Analysed"); | 1460 RunPrintAndVerify("Escape Analysed"); |
| 1448 } | 1461 } |
| 1462 |
| 1463 if (FLAG_turbo_load_elimination) { |
| 1464 Run<LoadEliminationPhase>(); |
| 1465 RunPrintAndVerify("Load eliminated"); |
| 1466 } |
| 1449 } | 1467 } |
| 1450 | 1468 |
| 1451 // Select representations. This has to run w/o the Typer decorator, because | 1469 // Select representations. This has to run w/o the Typer decorator, because |
| 1452 // we cannot compute meaningful types anyways, and the computed types might | 1470 // we cannot compute meaningful types anyways, and the computed types might |
| 1453 // even conflict with the representation/truncation logic. | 1471 // even conflict with the representation/truncation logic. |
| 1454 Run<RepresentationSelectionPhase>(); | 1472 Run<RepresentationSelectionPhase>(); |
| 1455 RunPrintAndVerify("Representations selected", true); | 1473 RunPrintAndVerify("Representations selected", true); |
| 1456 | 1474 |
| 1457 #ifdef DEBUG | 1475 #ifdef DEBUG |
| 1458 // From now on it is invalid to look at types on the nodes, because: | 1476 // From now on it is invalid to look at types on the nodes, because: |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1833 data->DeleteRegisterAllocationZone(); | 1851 data->DeleteRegisterAllocationZone(); |
| 1834 } | 1852 } |
| 1835 | 1853 |
| 1836 CompilationInfo* PipelineImpl::info() const { return data_->info(); } | 1854 CompilationInfo* PipelineImpl::info() const { return data_->info(); } |
| 1837 | 1855 |
| 1838 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } | 1856 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } |
| 1839 | 1857 |
| 1840 } // namespace compiler | 1858 } // namespace compiler |
| 1841 } // namespace internal | 1859 } // namespace internal |
| 1842 } // namespace v8 | 1860 } // namespace v8 |
| OLD | NEW |