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 17 matching lines...) Expand all Loading... |
904 CheckpointElimination checkpoint_elimination(&graph_reducer); | 902 CheckpointElimination checkpoint_elimination(&graph_reducer); |
905 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), | 903 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), |
906 data->common(), data->machine()); | 904 data->common(), data->machine()); |
907 AddReducer(data, &graph_reducer, &dead_code_elimination); | 905 AddReducer(data, &graph_reducer, &dead_code_elimination); |
908 AddReducer(data, &graph_reducer, &builtin_reducer); | 906 AddReducer(data, &graph_reducer, &builtin_reducer); |
909 if (data->info()->is_deoptimization_enabled()) { | 907 if (data->info()->is_deoptimization_enabled()) { |
910 AddReducer(data, &graph_reducer, &create_lowering); | 908 AddReducer(data, &graph_reducer, &create_lowering); |
911 } | 909 } |
912 AddReducer(data, &graph_reducer, &typed_lowering); | 910 AddReducer(data, &graph_reducer, &typed_lowering); |
913 AddReducer(data, &graph_reducer, &intrinsic_lowering); | 911 AddReducer(data, &graph_reducer, &intrinsic_lowering); |
914 AddReducer(data, &graph_reducer, &load_elimination); | |
915 AddReducer(data, &graph_reducer, &simple_reducer); | 912 AddReducer(data, &graph_reducer, &simple_reducer); |
916 AddReducer(data, &graph_reducer, &checkpoint_elimination); | 913 AddReducer(data, &graph_reducer, &checkpoint_elimination); |
917 AddReducer(data, &graph_reducer, &common_reducer); | 914 AddReducer(data, &graph_reducer, &common_reducer); |
918 graph_reducer.ReduceGraph(); | 915 graph_reducer.ReduceGraph(); |
919 } | 916 } |
920 }; | 917 }; |
921 | 918 |
922 | 919 |
923 struct BranchEliminationPhase { | 920 struct BranchEliminationPhase { |
924 static const char* phase_name() { return "branch condition elimination"; } | 921 static const char* phase_name() { return "branch condition elimination"; } |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 | 1031 |
1035 struct StoreStoreEliminationPhase { | 1032 struct StoreStoreEliminationPhase { |
1036 static const char* phase_name() { return "Store-store elimination"; } | 1033 static const char* phase_name() { return "Store-store elimination"; } |
1037 | 1034 |
1038 void Run(PipelineData* data, Zone* temp_zone) { | 1035 void Run(PipelineData* data, Zone* temp_zone) { |
1039 StoreStoreElimination store_store_elimination(data->jsgraph(), temp_zone); | 1036 StoreStoreElimination store_store_elimination(data->jsgraph(), temp_zone); |
1040 store_store_elimination.Run(); | 1037 store_store_elimination.Run(); |
1041 } | 1038 } |
1042 }; | 1039 }; |
1043 | 1040 |
| 1041 struct LoadEliminationPhase { |
| 1042 static const char* phase_name() { return "load elimination"; } |
| 1043 |
| 1044 void Run(PipelineData* data, Zone* temp_zone) { |
| 1045 // The memory optimizer requires the graphs to be trimmed, so trim now. |
| 1046 GraphTrimmer trimmer(temp_zone, data->graph()); |
| 1047 NodeVector roots(temp_zone); |
| 1048 data->jsgraph()->GetCachedNodes(&roots); |
| 1049 trimmer.TrimGraph(roots.begin(), roots.end()); |
| 1050 |
| 1051 // Eliminate redundant loads. |
| 1052 LoadElimination load_elimination(data->jsgraph(), temp_zone); |
| 1053 load_elimination.Run(); |
| 1054 } |
| 1055 }; |
| 1056 |
1044 struct MemoryOptimizationPhase { | 1057 struct MemoryOptimizationPhase { |
1045 static const char* phase_name() { return "memory optimization"; } | 1058 static const char* phase_name() { return "memory optimization"; } |
1046 | 1059 |
1047 void Run(PipelineData* data, Zone* temp_zone) { | 1060 void Run(PipelineData* data, Zone* temp_zone) { |
1048 // The memory optimizer requires the graphs to be trimmed, so trim now. | 1061 // The memory optimizer requires the graphs to be trimmed, so trim now. |
1049 GraphTrimmer trimmer(temp_zone, data->graph()); | 1062 GraphTrimmer trimmer(temp_zone, data->graph()); |
1050 NodeVector roots(temp_zone); | 1063 NodeVector roots(temp_zone); |
1051 data->jsgraph()->GetCachedNodes(&roots); | 1064 data->jsgraph()->GetCachedNodes(&roots); |
1052 trimmer.TrimGraph(roots.begin(), roots.end()); | 1065 trimmer.TrimGraph(roots.begin(), roots.end()); |
1053 | 1066 |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1437 | 1450 |
1438 if (FLAG_turbo_stress_loop_peeling) { | 1451 if (FLAG_turbo_stress_loop_peeling) { |
1439 Run<StressLoopPeelingPhase>(); | 1452 Run<StressLoopPeelingPhase>(); |
1440 RunPrintAndVerify("Loop peeled"); | 1453 RunPrintAndVerify("Loop peeled"); |
1441 } | 1454 } |
1442 | 1455 |
1443 if (FLAG_turbo_escape) { | 1456 if (FLAG_turbo_escape) { |
1444 Run<EscapeAnalysisPhase>(); | 1457 Run<EscapeAnalysisPhase>(); |
1445 RunPrintAndVerify("Escape Analysed"); | 1458 RunPrintAndVerify("Escape Analysed"); |
1446 } | 1459 } |
| 1460 |
| 1461 if (FLAG_turbo_load_elimination) { |
| 1462 Run<LoadEliminationPhase>(); |
| 1463 RunPrintAndVerify("Load eliminated"); |
| 1464 } |
1447 } | 1465 } |
1448 | 1466 |
1449 // Select representations. This has to run w/o the Typer decorator, because | 1467 // Select representations. This has to run w/o the Typer decorator, because |
1450 // we cannot compute meaningful types anyways, and the computed types might | 1468 // we cannot compute meaningful types anyways, and the computed types might |
1451 // even conflict with the representation/truncation logic. | 1469 // even conflict with the representation/truncation logic. |
1452 Run<RepresentationSelectionPhase>(); | 1470 Run<RepresentationSelectionPhase>(); |
1453 RunPrintAndVerify("Representations selected", true); | 1471 RunPrintAndVerify("Representations selected", true); |
1454 | 1472 |
1455 #ifdef DEBUG | 1473 #ifdef DEBUG |
1456 // From now on it is invalid to look at types on the nodes, because: | 1474 // 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... |
1831 data->DeleteRegisterAllocationZone(); | 1849 data->DeleteRegisterAllocationZone(); |
1832 } | 1850 } |
1833 | 1851 |
1834 CompilationInfo* PipelineImpl::info() const { return data_->info(); } | 1852 CompilationInfo* PipelineImpl::info() const { return data_->info(); } |
1835 | 1853 |
1836 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } | 1854 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } |
1837 | 1855 |
1838 } // namespace compiler | 1856 } // namespace compiler |
1839 } // namespace internal | 1857 } // namespace internal |
1840 } // namespace v8 | 1858 } // namespace v8 |
OLD | NEW |