Index: src/compiler/js-call-reducer.cc |
diff --git a/src/compiler/js-call-reducer.cc b/src/compiler/js-call-reducer.cc |
index 21148b3d20d6351d82cbbc3913745762129b52b1..b2b9bf717c920ee401ec7eaca89267922e1daa62 100644 |
--- a/src/compiler/js-call-reducer.cc |
+++ b/src/compiler/js-call-reducer.cc |
@@ -520,11 +520,44 @@ Reduction JSCallReducer::ReduceJSCall(Node* node) { |
return Changed(node); |
} |
+ // For CSA/C++ builtin {target}s, we can ensure that the number |
+ // of parameters we pass to the {target} matches exactly the |
+ // number of formal parameters expected by the builtin, and thus |
+ // avoid creating an ArgumentsAdaptorFrame. This is safe because |
+ // all CSA/C++ builtins that care about variable arguments are |
+ // declared with the kDontAdaptArgumentsSentinel marker. |
+ int builtin_index = shared->code()->builtin_index(); |
+ if (builtin_index != -1 && shared->native() && !shared->IsInterpreted()) { |
+ // Check if we have an arguments mismatch for {target}. |
+ int arity = static_cast<int>(p.arity() - 2); |
+ int num_parameters = shared->internal_formal_parameter_count(); |
+ if (num_parameters != arity && |
+ num_parameters != SharedFunctionInfo::kDontAdaptArgumentsSentinel) { |
+ // Fill up missing parameters with undefined. |
+ while (arity < num_parameters) { |
+ node->InsertInput(graph()->zone(), arity + 2, |
+ jsgraph()->UndefinedConstant()); |
+ arity++; |
+ } |
+ // Remove additional parameters. |
+ while (arity > num_parameters) { |
+ node->RemoveInput(arity + 1); |
+ arity--; |
+ } |
+ NodeProperties::ChangeOp( |
+ node, javascript()->Call(arity + 2, p.frequency(), p.feedback(), |
+ p.convert_mode(), p.tail_call_mode())); |
+ // Try to further reduce the JSCall {node}. |
+ Reduction const reduction = ReduceJSCall(node); |
+ return reduction.Changed() ? reduction : Changed(node); |
+ } |
+ } |
+ |
// Don't inline cross native context. |
if (function->native_context() != *native_context()) return NoChange(); |
// Check for known builtin functions. |
- switch (shared->code()->builtin_index()) { |
+ switch (builtin_index) { |
case Builtins::kFunctionPrototypeApply: |
return ReduceFunctionPrototypeApply(node); |
case Builtins::kFunctionPrototypeCall: |