Index: src/crankshaft/hydrogen.cc |
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc |
index bbe121704ce18641f70dd238c8daeb56d4584b5e..22e2f7b0e5c82ffb472fcd89c6b892b1fb77c8fd 100644 |
--- a/src/crankshaft/hydrogen.cc |
+++ b/src/crankshaft/hydrogen.cc |
@@ -5513,9 +5513,8 @@ void HOptimizedGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
FastNewClosureDescriptor descriptor(isolate()); |
HValue* values[] = {context(), shared_info_value}; |
HConstant* stub_value = Add<HConstant>(stub.GetCode()); |
- instr = New<HCallWithDescriptor>(stub_value, 0, descriptor, |
- Vector<HValue*>(values, arraysize(values)), |
- NORMAL_CALL); |
+ instr = New<HCallWithDescriptor>( |
+ stub_value, 0, descriptor, Vector<HValue*>(values, arraysize(values))); |
} else { |
Add<HPushArguments>(shared_info_value); |
Runtime::FunctionId function_id = |
@@ -5796,9 +5795,9 @@ void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
context(), AddThisFunction(), Add<HConstant>(expr->literal_index()), |
Add<HConstant>(expr->pattern()), Add<HConstant>(expr->flags())}; |
HConstant* stub_value = Add<HConstant>(callable.code()); |
- HInstruction* instr = New<HCallWithDescriptor>( |
- stub_value, 0, callable.descriptor(), |
- Vector<HValue*>(values, arraysize(values)), NORMAL_CALL); |
+ HInstruction* instr = |
+ New<HCallWithDescriptor>(stub_value, 0, callable.descriptor(), |
+ Vector<HValue*>(values, arraysize(values))); |
return ast_context()->ReturnInstruction(instr, expr->id()); |
} |
@@ -6583,7 +6582,7 @@ HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess( |
info->NeedsWrappingFor(Handle<JSFunction>::cast(info->accessor()))) { |
HValue* function = Add<HConstant>(info->accessor()); |
PushArgumentsFromEnvironment(argument_count); |
- return NewCallFunction(function, argument_count, |
+ return NewCallFunction(function, argument_count, TailCallMode::kDisallow, |
ConvertReceiverMode::kNotNullOrUndefined, |
TailCallMode::kDisallow); |
} else if (FLAG_inline_accessors && can_inline_accessor) { |
@@ -6600,7 +6599,8 @@ HValue* HOptimizedGraphBuilder::BuildMonomorphicAccess( |
return nullptr; |
} |
return NewCallConstantFunction(Handle<JSFunction>::cast(info->accessor()), |
- argument_count, TailCallMode::kDisallow); |
+ argument_count, TailCallMode::kDisallow, |
+ TailCallMode::kDisallow); |
} |
DCHECK(info->IsDataConstant()); |
@@ -7999,8 +7999,8 @@ void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
} |
HInstruction* HOptimizedGraphBuilder::NewCallFunction( |
- HValue* function, int argument_count, ConvertReceiverMode convert_mode, |
- TailCallMode tail_call_mode) { |
+ HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, |
+ ConvertReceiverMode convert_mode, TailCallMode tail_call_mode) { |
HValue* arity = Add<HConstant>(argument_count - 1); |
HValue* op_vals[] = {context(), function, arity}; |
@@ -8010,12 +8010,14 @@ HInstruction* HOptimizedGraphBuilder::NewCallFunction( |
HConstant* stub = Add<HConstant>(callable.code()); |
return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), |
- Vector<HValue*>(op_vals, arraysize(op_vals))); |
+ Vector<HValue*>(op_vals, arraysize(op_vals)), |
+ syntactic_tail_call_mode); |
} |
HInstruction* HOptimizedGraphBuilder::NewCallFunctionViaIC( |
- HValue* function, int argument_count, ConvertReceiverMode convert_mode, |
- TailCallMode tail_call_mode, FeedbackVectorSlot slot) { |
+ HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, |
+ ConvertReceiverMode convert_mode, TailCallMode tail_call_mode, |
+ FeedbackVectorSlot slot) { |
int arity = argument_count - 1; |
Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); |
HValue* index_val = Add<HConstant>(vector->GetIndex(slot)); |
@@ -8028,14 +8030,16 @@ HInstruction* HOptimizedGraphBuilder::NewCallFunctionViaIC( |
HConstant* stub = Add<HConstant>(callable.code()); |
return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), |
- Vector<HValue*>(op_vals, arraysize(op_vals))); |
+ Vector<HValue*>(op_vals, arraysize(op_vals)), |
+ syntactic_tail_call_mode); |
} |
HInstruction* HOptimizedGraphBuilder::NewCallConstantFunction( |
Handle<JSFunction> function, int argument_count, |
- TailCallMode tail_call_mode) { |
+ TailCallMode syntactic_tail_call_mode, TailCallMode tail_call_mode) { |
HValue* target = Add<HConstant>(function); |
- return New<HInvokeFunction>(target, function, argument_count, tail_call_mode); |
+ return New<HInvokeFunction>(target, function, argument_count, |
+ syntactic_tail_call_mode, tail_call_mode); |
} |
@@ -8186,10 +8190,12 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed(Call* expr, |
// HWrapReceiver. |
HInstruction* call = |
needs_wrapping |
- ? NewCallFunction(function, argument_count, |
- ConvertReceiverMode::kNotNullOrUndefined, |
- tail_call_mode) |
- : NewCallConstantFunction(target, argument_count, tail_call_mode); |
+ ? NewCallFunction( |
+ function, argument_count, syntactic_tail_call_mode, |
+ ConvertReceiverMode::kNotNullOrUndefined, tail_call_mode) |
+ : NewCallConstantFunction(target, argument_count, |
+ syntactic_tail_call_mode, |
+ tail_call_mode); |
PushArgumentsFromEnvironment(argument_count); |
AddInstruction(call); |
Drop(1); // Drop the function. |
@@ -8219,8 +8225,8 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed(Call* expr, |
CHECK_ALIVE(VisitExpressions(expr->arguments())); |
HInstruction* call = NewCallFunction( |
- function, argument_count, ConvertReceiverMode::kNotNullOrUndefined, |
- tail_call_mode); |
+ function, argument_count, syntactic_tail_call_mode, |
+ ConvertReceiverMode::kNotNullOrUndefined, tail_call_mode); |
PushArgumentsFromEnvironment(argument_count); |
@@ -9106,8 +9112,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
if_inline.Else(); |
{ |
Add<HPushArguments>(receiver); |
- result = AddInstruction( |
- NewCallConstantFunction(function, 1, TailCallMode::kDisallow)); |
+ result = AddInstruction(NewCallConstantFunction( |
+ function, 1, TailCallMode::kDisallow, TailCallMode::kDisallow)); |
if (!ast_context()->IsEffect()) Push(result); |
} |
if_inline.End(); |
@@ -9371,8 +9377,9 @@ void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function, |
function_state()->ComputeTailCallMode(syntactic_tail_call_mode); |
PushArgumentsFromEnvironment(arguments_count); |
- HInvokeFunction* call = New<HInvokeFunction>(function, known_function, |
- arguments_count, tail_call_mode); |
+ HInvokeFunction* call = |
+ New<HInvokeFunction>(function, known_function, arguments_count, |
+ syntactic_tail_call_mode, tail_call_mode); |
Drop(1); // Function |
ast_context()->ReturnInstruction(call, expr->id()); |
} |
@@ -9769,14 +9776,15 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
// the receiver. |
// TODO(verwaest): Support creation of value wrappers directly in |
// HWrapReceiver. |
- call = NewCallFunction(function, argument_count, |
- ConvertReceiverMode::kNotNullOrUndefined, |
- tail_call_mode); |
+ call = NewCallFunction( |
+ function, argument_count, syntactic_tail_call_mode, |
+ ConvertReceiverMode::kNotNullOrUndefined, tail_call_mode); |
} else if (TryInlineCall(expr)) { |
return; |
} else { |
- call = NewCallConstantFunction(known_function, argument_count, |
- tail_call_mode); |
+ call = |
+ NewCallConstantFunction(known_function, argument_count, |
+ syntactic_tail_call_mode, tail_call_mode); |
} |
} else { |
@@ -9795,7 +9803,7 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
Push(receiver); |
CHECK_ALIVE(VisitExpressions(expr->arguments(), arguments_flag)); |
- call = NewCallFunction(function, argument_count, |
+ call = NewCallFunction(function, argument_count, syntactic_tail_call_mode, |
ConvertReceiverMode::kNotNullOrUndefined, |
tail_call_mode); |
} |
@@ -9845,7 +9853,7 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
PushArgumentsFromEnvironment(argument_count); |
call = NewCallConstantFunction(expr->target(), argument_count, |
- tail_call_mode); |
+ syntactic_tail_call_mode, tail_call_mode); |
} else { |
PushArgumentsFromEnvironment(argument_count); |
if (expr->is_uninitialized() && |
@@ -9853,12 +9861,13 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
// We've never seen this call before, so let's have Crankshaft learn |
// through the type vector. |
call = NewCallFunctionViaIC(function, argument_count, |
+ syntactic_tail_call_mode, |
ConvertReceiverMode::kNullOrUndefined, |
tail_call_mode, expr->CallFeedbackICSlot()); |
} else { |
- call = NewCallFunction(function, argument_count, |
- ConvertReceiverMode::kNullOrUndefined, |
- tail_call_mode); |
+ call = NewCallFunction( |
+ function, argument_count, syntactic_tail_call_mode, |
+ ConvertReceiverMode::kNullOrUndefined, tail_call_mode); |
} |
} |
} |
@@ -10500,6 +10509,7 @@ void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
CHECK_ALIVE(VisitExpressions(expr->arguments())); |
PushArgumentsFromEnvironment(argument_count); |
HInstruction* call = NewCallConstantFunction(known_function, argument_count, |
+ TailCallMode::kDisallow, |
TailCallMode::kDisallow); |
Drop(1); // Function |
return ast_context()->ReturnInstruction(call, expr->id()); |