| Index: src/compiler/js-inlining.cc
|
| diff --git a/src/compiler/js-inlining.cc b/src/compiler/js-inlining.cc
|
| index d3e67b65eaead22ac94900b9d910541738fe4f8f..da22e7e59cc9d1f022a0b10540b903e5fcc37a9d 100644
|
| --- a/src/compiler/js-inlining.cc
|
| +++ b/src/compiler/js-inlining.cc
|
| @@ -6,17 +6,13 @@
|
|
|
| #include "src/ast.h"
|
| #include "src/ast-numbering.h"
|
| -#include "src/compiler/access-builder.h"
|
| #include "src/compiler/all-nodes.h"
|
| #include "src/compiler/ast-graph-builder.h"
|
| #include "src/compiler/common-operator.h"
|
| -#include "src/compiler/graph-visualizer.h"
|
| #include "src/compiler/js-operator.h"
|
| #include "src/compiler/node-matchers.h"
|
| #include "src/compiler/node-properties.h"
|
| #include "src/compiler/operator-properties.h"
|
| -#include "src/compiler/simplified-operator.h"
|
| -#include "src/compiler/typer.h"
|
| #include "src/full-codegen.h"
|
| #include "src/parser.h"
|
| #include "src/rewriter.h"
|
| @@ -103,7 +99,7 @@ class Inlinee {
|
|
|
| // Inline this graph at {call}, use {jsgraph} and its zone to create
|
| // any new nodes.
|
| - Reduction InlineAtCall(JSGraph* jsgraph, Node* call);
|
| + Reduction InlineAtCall(JSGraph* jsgraph, Node* call, Node* context);
|
|
|
| // Ensure that only a single return reaches the end node.
|
| static void UnifyReturn(JSGraph* jsgraph);
|
| @@ -216,18 +212,12 @@ class CopyVisitor {
|
| };
|
|
|
|
|
| -Reduction Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call) {
|
| +Reduction Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call, Node* context) {
|
| // The scheduler is smart enough to place our code; we just ensure {control}
|
| - // becomes the control input of the start of the inlinee.
|
| + // becomes the control input of the start of the inlinee, and {effect} becomes
|
| + // the effect input of the start of the inlinee.
|
| Node* control = NodeProperties::GetControlInput(call);
|
| -
|
| - // The inlinee uses the context from the JSFunction object. This will
|
| - // also be the effect dependency for the inlinee as it produces an effect.
|
| - SimplifiedOperatorBuilder simplified(jsgraph->zone());
|
| - Node* context = jsgraph->graph()->NewNode(
|
| - simplified.LoadField(AccessBuilder::ForJSFunctionContext()),
|
| - NodeProperties::GetValueInput(call, 0),
|
| - NodeProperties::GetEffectInput(call), control);
|
| + Node* effect = NodeProperties::GetEffectInput(call);
|
|
|
| // Context is last argument.
|
| int inlinee_context_index = static_cast<int>(total_parameters()) - 1;
|
| @@ -259,7 +249,7 @@ Reduction Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call) {
|
| }
|
| default:
|
| if (NodeProperties::IsEffectEdge(edge)) {
|
| - edge.UpdateTo(context);
|
| + edge.UpdateTo(effect);
|
| } else if (NodeProperties::IsControlEdge(edge)) {
|
| edge.UpdateTo(control);
|
| } else {
|
| @@ -269,18 +259,8 @@ Reduction Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call) {
|
| }
|
| }
|
|
|
| - for (Edge edge : call->use_edges()) {
|
| - if (NodeProperties::IsControlEdge(edge)) {
|
| - // TODO(turbofan): Handle kIfException uses.
|
| - DCHECK_EQ(IrOpcode::kIfSuccess, edge.from()->opcode());
|
| - edge.from()->ReplaceUses(control_output());
|
| - edge.UpdateTo(nullptr);
|
| - } else if (NodeProperties::IsEffectEdge(edge)) {
|
| - edge.UpdateTo(effect_output());
|
| - } else {
|
| - edge.UpdateTo(value_output());
|
| - }
|
| - }
|
| + NodeProperties::ReplaceWithValue(call, value_output(), effect_output(),
|
| + control_output());
|
|
|
| return Reducer::Replace(value_output());
|
| }
|
| @@ -387,7 +367,13 @@ Reduction JSInliner::Reduce(Node* node) {
|
| }
|
| }
|
|
|
| - return inlinee.InlineAtCall(jsgraph_, node);
|
| + // The inlinee uses the context from the JSFunction object.
|
| + // TODO(turbofan): We might want to load the context from the JSFunction at
|
| + // runtime in case we only know the SharedFunctionInfo once we have dynamic
|
| + // type feedback in the compiler.
|
| + Node* context = jsgraph_->HeapConstant(handle(function->context()));
|
| +
|
| + return inlinee.InlineAtCall(jsgraph_, node, context);
|
| }
|
|
|
| } // namespace compiler
|
|
|