Index: src/compiler/pipeline.cc |
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc |
index 9683a83d68dc7b5c6c6132ce98b30d934476f05f..1a3f106257e65852f75e25b704a7d40c57b6c77d 100644 |
--- a/src/compiler/pipeline.cc |
+++ b/src/compiler/pipeline.cc |
@@ -1032,12 +1032,29 @@ struct EffectControlLinearizationPhase { |
} |
}; |
+struct CommonOperatorReducerPhase { |
+ static const char* phase_name() { return "common operator reducer"; } |
+ |
+ void Run(PipelineData* data, Zone* temp_zone) { |
+ // Run the common operator reducer. |
+ JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
+ DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), |
+ data->common()); |
+ CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), |
+ data->common(), data->machine()); |
+ AddReducer(data, &graph_reducer, &dead_code_elimination); |
+ AddReducer(data, &graph_reducer, &common_reducer); |
+ graph_reducer.ReduceGraph(); |
+ } |
+}; |
+ |
struct StoreStoreEliminationPhase { |
- static const char* phase_name() { return "Store-store elimination"; } |
+ static const char* phase_name() { return "store-store elimination"; } |
void Run(PipelineData* data, Zone* temp_zone) { |
- StoreStoreElimination store_store_elimination(data->jsgraph(), temp_zone); |
- store_store_elimination.Run(); |
+ GraphTrimmer(temp_zone, data->graph()).TrimGraph(); |
+ |
+ StoreStoreElimination::Run(data->jsgraph(), temp_zone); |
} |
}; |
@@ -1518,6 +1535,9 @@ bool PipelineImpl::OptimizeGraph(Linkage* linkage) { |
Run<EffectControlLinearizationPhase>(); |
RunPrintAndVerify("Effect and control linearized", true); |
+ Run<CommonOperatorReducerPhase>(); |
Jarin
2016/07/20 11:43:33
Just curious - why is this necessary? (I assume it
bgeron
2016/07/20 16:27:16
To eliminate dead conditional deopts. This is done
|
+ RunPrintAndVerify("Common operator reducer", true); |
+ |
if (FLAG_turbo_store_elimination) { |
Run<StoreStoreEliminationPhase>(); |
RunPrintAndVerify("Store-store elimination", true); |