Index: src/compiler/js-inlining.cc |
diff --git a/src/compiler/js-inlining.cc b/src/compiler/js-inlining.cc |
index 4166acee624c99517500d25b84b00906663bd8a6..b908ae81f7a2cf88cf9c2488f141758859ab79d0 100644 |
--- a/src/compiler/js-inlining.cc |
+++ b/src/compiler/js-inlining.cc |
@@ -15,7 +15,6 @@ |
#include "src/compiler/node-properties-inl.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" |
#include "src/scopes.h" |
@@ -55,6 +54,7 @@ void JSInliner::Inline() { |
// test cases, where similar code is currently duplicated). |
static void Parse(Handle<JSFunction> function, CompilationInfoWithZone* info) { |
CHECK(Parser::Parse(info)); |
+ info->SetOptimizing(BailoutId::None(), Handle<Code>(function->code())); |
CHECK(Rewriter::Rewrite(info)); |
CHECK(Scope::Analyze(info)); |
CHECK_NE(NULL, info->scope()); |
@@ -90,16 +90,6 @@ class Inlinee { |
DCHECK_EQ(IrOpcode::kReturn, unique_return->opcode()); |
return unique_return; |
} |
- |
- // Counts JSFunction, Receiver, arguments, context but not effect, control. |
- size_t total_parameters() { return start_->op()->OutputCount(); } |
- |
- // Counts only formal parameters. |
- size_t formal_parameters() { |
- DCHECK_GE(total_parameters(), 3); |
- return total_parameters() - 3; |
- } |
- |
// Inline this graph at {call}, use {jsgraph} and its zone to create |
// any new nodes. |
void InlineAtCall(JSGraph* jsgraph, Node* call); |
@@ -206,7 +196,7 @@ class CopyVisitor : public NullNodeVisitor { |
private: |
void ReplaceSentinels() { |
- for (NodeId id = 0; id < source_graph_->NodeCount(); ++id) { |
+ for (int id = 0; id < source_graph_->NodeCount(); ++id) { |
Node* sentinel = sentinels_[id]; |
if (sentinel == NULL) continue; |
Node* copy = copies_[id]; |
@@ -245,8 +235,11 @@ void Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call) { |
NodeProperties::GetValueInput(call, 0), |
NodeProperties::GetEffectInput(call)); |
+ // {inlinee_inputs} counts JSFunction, Receiver, arguments, context, |
+ // but not effect, control. |
+ int inlinee_inputs = start_->op()->OutputCount(); |
// Context is last argument. |
- int inlinee_context_index = static_cast<int>(total_parameters()) - 1; |
+ int inlinee_context_index = inlinee_inputs - 1; |
// {inliner_inputs} counts JSFunction, Receiver, arguments, but not |
// context, effect, control. |
int inliner_inputs = OperatorProperties::GetValueInputCount(call->op()); |
@@ -306,74 +299,10 @@ void Inlinee::InlineAtCall(JSGraph* jsgraph, Node* call) { |
} |
-// TODO(turbofan) Provide such accessors for every node, possibly even |
-// generate them. |
-class JSCallFunctionAccessor { |
- public: |
- explicit JSCallFunctionAccessor(Node* call) : call_(call) { |
- DCHECK_EQ(IrOpcode::kJSCallFunction, call->opcode()); |
- } |
- |
- Node* jsfunction() { return call_->InputAt(0); } |
- |
- Node* receiver() { return call_->InputAt(1); } |
- |
- Node* formal_argument(size_t index) { |
- DCHECK(index < formal_arguments()); |
- return call_->InputAt(static_cast<int>(2 + index)); |
- } |
- |
- size_t formal_arguments() { |
- // {value_inputs} includes jsfunction and receiver. |
- size_t value_inputs = OperatorProperties::GetValueInputCount(call_->op()); |
- DCHECK_GE(call_->InputCount(), 2); |
- return value_inputs - 2; |
- } |
- |
- Node* frame_state() { return NodeProperties::GetFrameStateInput(call_); } |
- |
- private: |
- Node* call_; |
-}; |
- |
- |
-void JSInliner::AddClosureToFrameState(Node* frame_state, |
- Handle<JSFunction> jsfunction) { |
- FrameStateCallInfo call_info = OpParameter<FrameStateCallInfo>(frame_state); |
- const Operator* op = jsgraph_->common()->FrameState( |
- FrameStateType::JS_FRAME, call_info.bailout_id(), |
- call_info.state_combine(), jsfunction); |
- frame_state->set_op(op); |
-} |
- |
- |
-Node* JSInliner::CreateArgumentsAdaptorFrameState(JSCallFunctionAccessor* call, |
- Handle<JSFunction> jsfunction, |
- Zone* temp_zone) { |
- const Operator* op = |
- jsgraph_->common()->FrameState(FrameStateType::ARGUMENTS_ADAPTOR, |
- BailoutId(-1), kIgnoreOutput, jsfunction); |
- const Operator* op0 = jsgraph_->common()->StateValues(0); |
- Node* node0 = jsgraph_->graph()->NewNode(op0); |
- NodeVector params(temp_zone); |
- params.push_back(call->receiver()); |
- for (size_t argument = 0; argument != call->formal_arguments(); ++argument) { |
- params.push_back(call->formal_argument(argument)); |
- } |
- const Operator* op_param = |
- jsgraph_->common()->StateValues(static_cast<int>(params.size())); |
- Node* params_node = jsgraph_->graph()->NewNode( |
- op_param, static_cast<int>(params.size()), ¶ms.front()); |
- return jsgraph_->graph()->NewNode(op, params_node, node0, node0, |
- jsgraph_->UndefinedConstant(), |
- call->frame_state()); |
-} |
- |
+void JSInliner::TryInlineCall(Node* call) { |
+ DCHECK_EQ(IrOpcode::kJSCallFunction, call->opcode()); |
-void JSInliner::TryInlineCall(Node* call_node) { |
- JSCallFunctionAccessor call(call_node); |
- |
- HeapObjectMatcher<JSFunction> match(call.jsfunction()); |
+ HeapObjectMatcher<JSFunction> match(call->InputAt(0)); |
if (!match.HasValue()) { |
return; |
} |
@@ -393,18 +322,6 @@ void JSInliner::TryInlineCall(Node* call_node) { |
CompilationInfoWithZone info(function); |
Parse(function, &info); |
- if (!function->shared()->has_deoptimization_support()) { |
- // TODO(turbofan) In the future, unoptimized code with deopt support could |
- // be generated lazily once deopt is triggered. |
- info.EnableDeoptimizationSupport(); |
- if (!FullCodeGenerator::MakeCode(&info)) { |
- DCHECK(false); |
- return; |
- } |
- function->shared()->EnableDeoptimizationSupport(*info.code()); |
- function->shared()->set_feedback_vector(*info.feedback_vector()); |
- } |
- |
if (info.scope()->arguments() != NULL) { |
// For now do not inline functions that use their arguments array. |
SmartArrayPointer<char> name = function->shared()->DebugName()->ToCString(); |
@@ -436,24 +353,7 @@ void JSInliner::TryInlineCall(Node* call_node) { |
visitor.CopyGraph(); |
Inlinee inlinee(visitor.GetCopy(graph.start()), visitor.GetCopy(graph.end())); |
- |
- Node* outer_frame_state = call.frame_state(); |
- // Insert argument adaptor frame if required. |
- if (call.formal_arguments() != inlinee.formal_parameters()) { |
- outer_frame_state = |
- CreateArgumentsAdaptorFrameState(&call, function, info.zone()); |
- } |
- |
- for (NodeVectorConstIter it = visitor.copies().begin(); |
- it != visitor.copies().end(); ++it) { |
- Node* node = *it; |
- if (node != NULL && node->opcode() == IrOpcode::kFrameState) { |
- AddClosureToFrameState(node, function); |
- NodeProperties::ReplaceFrameStateInput(node, outer_frame_state); |
- } |
- } |
- |
- inlinee.InlineAtCall(jsgraph_, call_node); |
+ inlinee.InlineAtCall(jsgraph_, call); |
} |
} |
} |