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 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 | 499 |
500 if (info()->shared_info()->asm_function()) { | 500 if (info()->shared_info()->asm_function()) { |
501 if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); | 501 if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); |
502 info()->MarkAsFunctionContextSpecializing(); | 502 info()->MarkAsFunctionContextSpecializing(); |
503 } else { | 503 } else { |
504 if (!FLAG_always_opt) { | 504 if (!FLAG_always_opt) { |
505 info()->MarkAsBailoutOnUninitialized(); | 505 info()->MarkAsBailoutOnUninitialized(); |
506 } | 506 } |
507 if (FLAG_native_context_specialization) { | 507 if (FLAG_native_context_specialization) { |
508 info()->MarkAsNativeContextSpecializing(); | 508 info()->MarkAsNativeContextSpecializing(); |
509 info()->MarkAsTypingEnabled(); | |
510 } | 509 } |
511 } | 510 } |
512 if (!info()->shared_info()->asm_function() || FLAG_turbo_asm_deoptimization) { | 511 if (!info()->shared_info()->asm_function() || FLAG_turbo_asm_deoptimization) { |
513 info()->MarkAsDeoptimizationEnabled(); | 512 info()->MarkAsDeoptimizationEnabled(); |
514 } | 513 } |
515 | 514 |
516 Pipeline pipeline(info()); | 515 Pipeline pipeline(info()); |
517 pipeline.GenerateCode(); | 516 pipeline.GenerateCode(); |
518 if (isolate()->has_pending_exception()) return FAILED; // Stack overflowed. | 517 if (isolate()->has_pending_exception()) return FAILED; // Stack overflowed. |
519 if (info()->code().is_null()) return AbortOptimization(kGraphBuildingFailed); | 518 if (info()->code().is_null()) return AbortOptimization(kGraphBuildingFailed); |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 | 873 |
875 struct GenericLoweringPhase { | 874 struct GenericLoweringPhase { |
876 static const char* phase_name() { return "generic lowering"; } | 875 static const char* phase_name() { return "generic lowering"; } |
877 | 876 |
878 void Run(PipelineData* data, Zone* temp_zone) { | 877 void Run(PipelineData* data, Zone* temp_zone) { |
879 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); | 878 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
880 DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), | 879 DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), |
881 data->common()); | 880 data->common()); |
882 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), | 881 CommonOperatorReducer common_reducer(&graph_reducer, data->graph(), |
883 data->common(), data->machine()); | 882 data->common(), data->machine()); |
884 JSGenericLowering generic_lowering(data->info()->is_typing_enabled(), | 883 JSGenericLowering generic_lowering(data->jsgraph()); |
885 data->jsgraph()); | |
886 SelectLowering select_lowering(data->jsgraph()->graph(), | 884 SelectLowering select_lowering(data->jsgraph()->graph(), |
887 data->jsgraph()->common()); | 885 data->jsgraph()->common()); |
888 TailCallOptimization tco(data->common(), data->graph()); | 886 TailCallOptimization tco(data->common(), data->graph()); |
889 AddReducer(data, &graph_reducer, &dead_code_elimination); | 887 AddReducer(data, &graph_reducer, &dead_code_elimination); |
890 AddReducer(data, &graph_reducer, &common_reducer); | 888 AddReducer(data, &graph_reducer, &common_reducer); |
891 AddReducer(data, &graph_reducer, &generic_lowering); | 889 AddReducer(data, &graph_reducer, &generic_lowering); |
892 AddReducer(data, &graph_reducer, &select_lowering); | 890 AddReducer(data, &graph_reducer, &select_lowering); |
893 AddReducer(data, &graph_reducer, &tco); | 891 AddReducer(data, &graph_reducer, &tco); |
894 graph_reducer.ReduceGraph(); | 892 graph_reducer.ReduceGraph(); |
895 } | 893 } |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 os << AsRPO(*graph); | 1123 os << AsRPO(*graph); |
1126 } | 1124 } |
1127 } | 1125 } |
1128 }; | 1126 }; |
1129 | 1127 |
1130 | 1128 |
1131 struct VerifyGraphPhase { | 1129 struct VerifyGraphPhase { |
1132 static const char* phase_name() { return nullptr; } | 1130 static const char* phase_name() { return nullptr; } |
1133 | 1131 |
1134 void Run(PipelineData* data, Zone* temp_zone, const bool untyped) { | 1132 void Run(PipelineData* data, Zone* temp_zone, const bool untyped) { |
1135 Verifier::Run(data->graph(), FLAG_turbo_types && !untyped | 1133 Verifier::Run(data->graph(), |
1136 ? Verifier::TYPED | 1134 !untyped ? Verifier::TYPED : Verifier::UNTYPED); |
1137 : Verifier::UNTYPED); | |
1138 } | 1135 } |
1139 }; | 1136 }; |
1140 | 1137 |
1141 | 1138 |
1142 void Pipeline::BeginPhaseKind(const char* phase_kind_name) { | 1139 void Pipeline::BeginPhaseKind(const char* phase_kind_name) { |
1143 if (data_->pipeline_statistics() != nullptr) { | 1140 if (data_->pipeline_statistics() != nullptr) { |
1144 data_->pipeline_statistics()->BeginPhaseKind(phase_kind_name); | 1141 data_->pipeline_statistics()->BeginPhaseKind(phase_kind_name); |
1145 } | 1142 } |
1146 } | 1143 } |
1147 | 1144 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1202 TurboCfgFile tcf(isolate()); | 1199 TurboCfgFile tcf(isolate()); |
1203 tcf << AsC1VCompilation(info()); | 1200 tcf << AsC1VCompilation(info()); |
1204 } | 1201 } |
1205 | 1202 |
1206 data.source_positions()->AddDecorator(); | 1203 data.source_positions()->AddDecorator(); |
1207 | 1204 |
1208 if (FLAG_loop_assignment_analysis) { | 1205 if (FLAG_loop_assignment_analysis) { |
1209 Run<LoopAssignmentAnalysisPhase>(); | 1206 Run<LoopAssignmentAnalysisPhase>(); |
1210 } | 1207 } |
1211 | 1208 |
1212 if (info()->is_typing_enabled()) { | 1209 Run<TypeHintAnalysisPhase>(); |
1213 Run<TypeHintAnalysisPhase>(); | |
1214 } | |
1215 | 1210 |
1216 Run<GraphBuilderPhase>(); | 1211 Run<GraphBuilderPhase>(); |
1217 if (data.compilation_failed()) return Handle<Code>::null(); | 1212 if (data.compilation_failed()) return Handle<Code>::null(); |
1218 RunPrintAndVerify("Initial untyped", true); | 1213 RunPrintAndVerify("Initial untyped", true); |
1219 | 1214 |
1220 // Perform OSR deconstruction. | 1215 // Perform OSR deconstruction. |
1221 if (info()->is_osr()) { | 1216 if (info()->is_osr()) { |
1222 Run<OsrDeconstructionPhase>(); | 1217 Run<OsrDeconstructionPhase>(); |
1223 RunPrintAndVerify("OSR deconstruction", true); | 1218 RunPrintAndVerify("OSR deconstruction", true); |
1224 } | 1219 } |
1225 | 1220 |
1226 // Perform function context specialization and inlining (if enabled). | 1221 // Perform function context specialization and inlining (if enabled). |
1227 Run<InliningPhase>(); | 1222 Run<InliningPhase>(); |
1228 RunPrintAndVerify("Inlined", true); | 1223 RunPrintAndVerify("Inlined", true); |
1229 | 1224 |
1230 // Remove dead->live edges from the graph. | 1225 // Remove dead->live edges from the graph. |
1231 Run<EarlyGraphTrimmingPhase>(); | 1226 Run<EarlyGraphTrimmingPhase>(); |
1232 RunPrintAndVerify("Early trimmed", true); | 1227 RunPrintAndVerify("Early trimmed", true); |
1233 | 1228 |
1234 if (FLAG_print_turbo_replay) { | 1229 if (FLAG_print_turbo_replay) { |
1235 // Print a replay of the initial graph. | 1230 // Print a replay of the initial graph. |
1236 GraphReplayPrinter::PrintReplay(data.graph()); | 1231 GraphReplayPrinter::PrintReplay(data.graph()); |
1237 } | 1232 } |
1238 | 1233 |
| 1234 // Type the graph. |
1239 base::SmartPointer<Typer> typer; | 1235 base::SmartPointer<Typer> typer; |
1240 if (info()->is_typing_enabled()) { | 1236 typer.Reset(new Typer(isolate(), data.graph(), |
1241 // Type the graph. | 1237 info()->is_deoptimization_enabled() |
1242 typer.Reset(new Typer(isolate(), data.graph(), | 1238 ? Typer::kDeoptimizationEnabled |
1243 info()->is_deoptimization_enabled() | 1239 : Typer::kNoFlags, |
1244 ? Typer::kDeoptimizationEnabled | 1240 info()->dependencies())); |
1245 : Typer::kNoFlags, | 1241 Run<TyperPhase>(typer.get()); |
1246 info()->dependencies())); | 1242 RunPrintAndVerify("Typed"); |
1247 Run<TyperPhase>(typer.get()); | |
1248 RunPrintAndVerify("Typed"); | |
1249 } | |
1250 | 1243 |
1251 BeginPhaseKind("lowering"); | 1244 BeginPhaseKind("lowering"); |
1252 | 1245 |
1253 if (info()->is_typing_enabled()) { | 1246 // Lower JSOperators where we can determine types. |
1254 // Lower JSOperators where we can determine types. | 1247 Run<TypedLoweringPhase>(); |
1255 Run<TypedLoweringPhase>(); | 1248 RunPrintAndVerify("Lowered typed"); |
1256 RunPrintAndVerify("Lowered typed"); | |
1257 | 1249 |
1258 if (FLAG_turbo_stress_loop_peeling) { | 1250 if (FLAG_turbo_stress_loop_peeling) { |
1259 Run<StressLoopPeelingPhase>(); | 1251 Run<StressLoopPeelingPhase>(); |
1260 RunPrintAndVerify("Loop peeled"); | 1252 RunPrintAndVerify("Loop peeled"); |
1261 } | 1253 } |
1262 | 1254 |
1263 if (FLAG_turbo_escape) { | 1255 if (FLAG_turbo_escape) { |
1264 Run<EscapeAnalysisPhase>(); | 1256 Run<EscapeAnalysisPhase>(); |
1265 RunPrintAndVerify("Escape Analysed"); | 1257 RunPrintAndVerify("Escape Analysed"); |
1266 } | 1258 } |
1267 | 1259 |
1268 // Lower simplified operators and insert changes. | 1260 // Lower simplified operators and insert changes. |
1269 Run<SimplifiedLoweringPhase>(); | 1261 Run<SimplifiedLoweringPhase>(); |
1270 RunPrintAndVerify("Lowered simplified"); | 1262 RunPrintAndVerify("Lowered simplified"); |
1271 | 1263 |
1272 Run<BranchEliminationPhase>(); | 1264 Run<BranchEliminationPhase>(); |
1273 RunPrintAndVerify("Branch conditions eliminated"); | 1265 RunPrintAndVerify("Branch conditions eliminated"); |
1274 | 1266 |
1275 // Optimize control flow. | 1267 // Optimize control flow. |
1276 if (FLAG_turbo_cf_optimization) { | 1268 if (FLAG_turbo_cf_optimization) { |
1277 Run<ControlFlowOptimizationPhase>(); | 1269 Run<ControlFlowOptimizationPhase>(); |
1278 RunPrintAndVerify("Control flow optimized"); | 1270 RunPrintAndVerify("Control flow optimized"); |
1279 } | 1271 } |
1280 | 1272 |
1281 // Lower changes that have been inserted before. | 1273 // Lower changes that have been inserted before. |
1282 Run<ChangeLoweringPhase>(); | 1274 Run<ChangeLoweringPhase>(); |
1283 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. | 1275 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
1284 RunPrintAndVerify("Lowered changes", true); | 1276 RunPrintAndVerify("Lowered changes", true); |
1285 } | |
1286 | 1277 |
1287 // Lower any remaining generic JSOperators. | 1278 // Lower any remaining generic JSOperators. |
1288 Run<GenericLoweringPhase>(); | 1279 Run<GenericLoweringPhase>(); |
1289 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. | 1280 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
1290 RunPrintAndVerify("Lowered generic", true); | 1281 RunPrintAndVerify("Lowered generic", true); |
1291 | 1282 |
1292 Run<LateGraphTrimmingPhase>(); | 1283 Run<LateGraphTrimmingPhase>(); |
1293 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. | 1284 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. |
1294 RunPrintAndVerify("Late trimmed", true); | 1285 RunPrintAndVerify("Late trimmed", true); |
1295 | 1286 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1586 } | 1577 } |
1587 | 1578 |
1588 data->DeleteRegisterAllocationZone(); | 1579 data->DeleteRegisterAllocationZone(); |
1589 } | 1580 } |
1590 | 1581 |
1591 Isolate* Pipeline::isolate() const { return info()->isolate(); } | 1582 Isolate* Pipeline::isolate() const { return info()->isolate(); } |
1592 | 1583 |
1593 } // namespace compiler | 1584 } // namespace compiler |
1594 } // namespace internal | 1585 } // namespace internal |
1595 } // namespace v8 | 1586 } // namespace v8 |
OLD | NEW |