| Index: src/compiler/js-inlining.cc
|
| diff --git a/src/compiler/js-inlining.cc b/src/compiler/js-inlining.cc
|
| index 519b5db6f498f0a3603e8434f6e074cbb88a695c..376448e08aab71443c8ae3d08442f5318e4cfc24 100644
|
| --- a/src/compiler/js-inlining.cc
|
| +++ b/src/compiler/js-inlining.cc
|
| @@ -11,6 +11,7 @@
|
| #include "src/compiler/all-nodes.h"
|
| #include "src/compiler/ast-graph-builder.h"
|
| #include "src/compiler/ast-loop-assignment-analyzer.h"
|
| +#include "src/compiler/bytecode-graph-builder.h"
|
| #include "src/compiler/common-operator.h"
|
| #include "src/compiler/graph-reducer.h"
|
| #include "src/compiler/js-operator.h"
|
| @@ -475,8 +476,18 @@ Reduction JSInliner::ReduceJSCall(Node* node, Handle<JSFunction> function) {
|
| CompilationInfo info(&parse_info, function);
|
| if (info_->is_deoptimization_enabled()) info.MarkAsDeoptimizationEnabled();
|
| if (info_->is_type_feedback_enabled()) info.MarkAsTypeFeedbackEnabled();
|
| + if (info_->is_optimizing_from_bytecode()) info.MarkAsOptimizeFromBytecode();
|
|
|
| - if (!Compiler::ParseAndAnalyze(info.parse_info())) {
|
| + if (info.is_optimizing_from_bytecode() && !Compiler::EnsureBytecode(&info)) {
|
| + TRACE("Not inlining %s into %s because bytecode generation failed\n",
|
| + shared_info->DebugName()->ToCString().get(),
|
| + info_->shared_info()->DebugName()->ToCString().get());
|
| + DCHECK(!info_->isolate()->has_pending_exception());
|
| + return NoChange();
|
| + }
|
| +
|
| + if (!info.is_optimizing_from_bytecode() &&
|
| + !Compiler::ParseAndAnalyze(info.parse_info())) {
|
| TRACE("Not inlining %s into %s because parsing failed\n",
|
| shared_info->DebugName()->ToCString().get(),
|
| info_->shared_info()->DebugName()->ToCString().get());
|
| @@ -486,7 +497,8 @@ Reduction JSInliner::ReduceJSCall(Node* node, Handle<JSFunction> function) {
|
| return NoChange();
|
| }
|
|
|
| - if (!Compiler::EnsureDeoptimizationSupport(&info)) {
|
| + if (!info.is_optimizing_from_bytecode() &&
|
| + !Compiler::EnsureDeoptimizationSupport(&info)) {
|
| TRACE("Not inlining %s into %s because deoptimization support failed\n",
|
| shared_info->DebugName()->ToCString().get(),
|
| info_->shared_info()->DebugName()->ToCString().get());
|
| @@ -512,7 +524,17 @@ Reduction JSInliner::ReduceJSCall(Node* node, Handle<JSFunction> function) {
|
| // Create the subgraph for the inlinee.
|
| Node* start;
|
| Node* end;
|
| - {
|
| + if (info.is_optimizing_from_bytecode()) {
|
| + // Run the BytecodeGraphBuilder to create the subgraph.
|
| + Graph::SubgraphScope scope(graph());
|
| + BytecodeGraphBuilder graph_builder(&zone, &info, jsgraph(),
|
| + call.frequency());
|
| + graph_builder.CreateGraph();
|
| +
|
| + // Extract the inlinee start/end nodes.
|
| + start = graph()->start();
|
| + end = graph()->end();
|
| + } else {
|
| // Run the loop assignment analyzer on the inlinee.
|
| AstLoopAssignmentAnalyzer loop_assignment_analyzer(&zone, &info);
|
| LoopAssignmentAnalysis* loop_assignment =
|
| @@ -616,7 +638,7 @@ Reduction JSInliner::ReduceJSCall(Node* node, Handle<JSFunction> function) {
|
| // in that frame state tho, as the conversion of the receiver can be repeated
|
| // any number of times, it's not observable.
|
| if (node->opcode() == IrOpcode::kJSCallFunction &&
|
| - is_sloppy(parse_info.language_mode()) && !shared_info->native()) {
|
| + is_sloppy(shared_info->language_mode()) && !shared_info->native()) {
|
| Node* effect = NodeProperties::GetEffectInput(node);
|
| if (NeedsConvertReceiver(call.receiver(), effect)) {
|
| const CallFunctionParameters& p = CallFunctionParametersOf(node->op());
|
| @@ -647,7 +669,7 @@ Reduction JSInliner::ReduceJSCall(Node* node, Handle<JSFunction> function) {
|
| // count (i.e. value outputs of start node minus target, receiver, new target,
|
| // arguments count and context) have to match the number of arguments passed
|
| // to the call.
|
| - int parameter_count = info.literal()->parameter_count();
|
| + int parameter_count = shared_info->internal_formal_parameter_count();
|
| DCHECK_EQ(parameter_count, start->op()->ValueOutputCount() - 5);
|
| if (call.formal_arguments() != parameter_count) {
|
| frame_state = CreateArtificialFrameState(
|
|
|