| 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/js-inlining.h" | 5 #include "src/compiler/js-inlining.h" |
| 6 | 6 |
| 7 #include "src/ast.h" | 7 #include "src/ast.h" |
| 8 #include "src/ast-numbering.h" | 8 #include "src/ast-numbering.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/compiler/all-nodes.h" | 10 #include "src/compiler/all-nodes.h" |
| 11 #include "src/compiler/ast-graph-builder.h" | 11 #include "src/compiler/ast-graph-builder.h" |
| 12 #include "src/compiler/common-operator.h" | 12 #include "src/compiler/common-operator.h" |
| 13 #include "src/compiler/common-operator-reducer.h" |
| 14 #include "src/compiler/dead-code-elimination.h" |
| 15 #include "src/compiler/graph-reducer.h" |
| 16 #include "src/compiler/js-global-specialization.h" |
| 13 #include "src/compiler/js-operator.h" | 17 #include "src/compiler/js-operator.h" |
| 14 #include "src/compiler/node-matchers.h" | 18 #include "src/compiler/node-matchers.h" |
| 15 #include "src/compiler/node-properties.h" | 19 #include "src/compiler/node-properties.h" |
| 16 #include "src/compiler/operator-properties.h" | 20 #include "src/compiler/operator-properties.h" |
| 17 #include "src/full-codegen/full-codegen.h" | 21 #include "src/full-codegen/full-codegen.h" |
| 18 #include "src/isolate-inl.h" | 22 #include "src/isolate-inl.h" |
| 19 #include "src/parser.h" | 23 #include "src/parser.h" |
| 20 #include "src/rewriter.h" | 24 #include "src/rewriter.h" |
| 21 #include "src/scopes.h" | 25 #include "src/scopes.h" |
| 22 | 26 |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 TRACE("Not inlining %s into %s because call is recursive\n", | 307 TRACE("Not inlining %s into %s because call is recursive\n", |
| 304 function->shared()->DebugName()->ToCString().get(), | 308 function->shared()->DebugName()->ToCString().get(), |
| 305 info_->shared_info()->DebugName()->ToCString().get()); | 309 info_->shared_info()->DebugName()->ToCString().get()); |
| 306 return NoChange(); | 310 return NoChange(); |
| 307 } | 311 } |
| 308 } | 312 } |
| 309 | 313 |
| 310 Zone zone; | 314 Zone zone; |
| 311 ParseInfo parse_info(&zone, function); | 315 ParseInfo parse_info(&zone, function); |
| 312 CompilationInfo info(&parse_info); | 316 CompilationInfo info(&parse_info); |
| 313 if (info_->is_deoptimization_enabled()) info.MarkAsDeoptimizationEnabled(); | 317 if (info_->is_deoptimization_enabled()) { |
| 318 info.MarkAsDeoptimizationEnabled(); |
| 319 } |
| 320 if (info_->is_native_context_specializing()) { |
| 321 info.MarkAsNativeContextSpecializing(); |
| 322 } |
| 323 if (info_->is_typing_enabled()) { |
| 324 info.MarkAsTypingEnabled(); |
| 325 } |
| 314 | 326 |
| 315 if (!Compiler::ParseAndAnalyze(info.parse_info())) { | 327 if (!Compiler::ParseAndAnalyze(info.parse_info())) { |
| 316 TRACE("Not inlining %s into %s because parsing failed\n", | 328 TRACE("Not inlining %s into %s because parsing failed\n", |
| 317 function->shared()->DebugName()->ToCString().get(), | 329 function->shared()->DebugName()->ToCString().get(), |
| 318 info_->shared_info()->DebugName()->ToCString().get()); | 330 info_->shared_info()->DebugName()->ToCString().get()); |
| 319 if (info_->isolate()->has_pending_exception()) { | 331 if (info_->isolate()->has_pending_exception()) { |
| 320 info_->isolate()->clear_pending_exception(); | 332 info_->isolate()->clear_pending_exception(); |
| 321 } | 333 } |
| 322 return NoChange(); | 334 return NoChange(); |
| 323 } | 335 } |
| 324 | 336 |
| 325 if (!Compiler::EnsureDeoptimizationSupport(&info)) { | 337 if (!Compiler::EnsureDeoptimizationSupport(&info)) { |
| 326 TRACE("Not inlining %s into %s because deoptimization support failed\n", | 338 TRACE("Not inlining %s into %s because deoptimization support failed\n", |
| 327 function->shared()->DebugName()->ToCString().get(), | 339 function->shared()->DebugName()->ToCString().get(), |
| 328 info_->shared_info()->DebugName()->ToCString().get()); | 340 info_->shared_info()->DebugName()->ToCString().get()); |
| 329 return NoChange(); | 341 return NoChange(); |
| 330 } | 342 } |
| 331 | 343 |
| 332 TRACE("Inlining %s into %s\n", | 344 TRACE("Inlining %s into %s\n", |
| 333 function->shared()->DebugName()->ToCString().get(), | 345 function->shared()->DebugName()->ToCString().get(), |
| 334 info_->shared_info()->DebugName()->ToCString().get()); | 346 info_->shared_info()->DebugName()->ToCString().get()); |
| 335 | 347 |
| 336 Graph graph(info.zone()); | 348 Graph graph(info.zone()); |
| 337 JSGraph jsgraph(info.isolate(), &graph, jsgraph_->common(), | 349 JSGraph jsgraph(info.isolate(), &graph, jsgraph_->common(), |
| 338 jsgraph_->javascript(), jsgraph_->machine()); | 350 jsgraph_->javascript(), jsgraph_->machine()); |
| 339 AstGraphBuilder graph_builder(local_zone_, &info, &jsgraph); | 351 AstGraphBuilder graph_builder(local_zone_, &info, &jsgraph); |
| 340 graph_builder.CreateGraph(false); | 352 graph_builder.CreateGraph(false); |
| 341 | 353 |
| 354 // TODO(mstarzinger): Unify this with the Pipeline once JSInliner refactoring |
| 355 // starts. |
| 356 if (info.is_native_context_specializing()) { |
| 357 GraphReducer graph_reducer(local_zone_, &graph, jsgraph.Dead()); |
| 358 DeadCodeElimination dead_code_elimination(&graph_reducer, &graph, |
| 359 jsgraph.common()); |
| 360 CommonOperatorReducer common_reducer(&graph_reducer, &graph, |
| 361 jsgraph.common(), jsgraph.machine()); |
| 362 JSGlobalSpecialization::Flags flags = JSGlobalSpecialization::kNoFlags; |
| 363 if (info.is_deoptimization_enabled()) { |
| 364 flags |= JSGlobalSpecialization::kDeoptimizationEnabled; |
| 365 } |
| 366 if (info.is_typing_enabled()) { |
| 367 flags |= JSGlobalSpecialization::kTypingEnabled; |
| 368 } |
| 369 JSGlobalSpecialization global_specialization( |
| 370 &graph_reducer, &jsgraph, flags, |
| 371 handle(info.global_object(), info.isolate()), info_->dependencies()); |
| 372 graph_reducer.AddReducer(&dead_code_elimination); |
| 373 graph_reducer.AddReducer(&common_reducer); |
| 374 graph_reducer.AddReducer(&global_specialization); |
| 375 graph_reducer.ReduceGraph(); |
| 376 } |
| 377 |
| 342 // The inlinee specializes to the context from the JSFunction object. | 378 // The inlinee specializes to the context from the JSFunction object. |
| 343 // TODO(turbofan): We might want to load the context from the JSFunction at | 379 // TODO(turbofan): We might want to load the context from the JSFunction at |
| 344 // runtime in case we only know the SharedFunctionInfo once we have dynamic | 380 // runtime in case we only know the SharedFunctionInfo once we have dynamic |
| 345 // type feedback in the compiler. | 381 // type feedback in the compiler. |
| 346 Node* context = jsgraph_->Constant(handle(function->context())); | 382 Node* context = jsgraph_->Constant(handle(function->context())); |
| 347 | 383 |
| 348 CopyVisitor visitor(&graph, jsgraph_->graph(), info.zone()); | 384 CopyVisitor visitor(&graph, jsgraph_->graph(), info.zone()); |
| 349 visitor.CopyGraph(); | 385 visitor.CopyGraph(); |
| 350 | 386 |
| 351 Node* start = visitor.GetCopy(graph.start()); | 387 Node* start = visitor.GetCopy(graph.start()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 367 | 403 |
| 368 // Remember that we inlined this function. | 404 // Remember that we inlined this function. |
| 369 info_->AddInlinedFunction(info.shared_info()); | 405 info_->AddInlinedFunction(info.shared_info()); |
| 370 | 406 |
| 371 return InlineCall(node, context, frame_state, start, end); | 407 return InlineCall(node, context, frame_state, start, end); |
| 372 } | 408 } |
| 373 | 409 |
| 374 } // namespace compiler | 410 } // namespace compiler |
| 375 } // namespace internal | 411 } // namespace internal |
| 376 } // namespace v8 | 412 } // namespace v8 |
| OLD | NEW |