Index: src/compiler/js-call-reducer.cc |
diff --git a/src/compiler/js-call-reducer.cc b/src/compiler/js-call-reducer.cc |
index 2be5c161f58d59d6c80f9dfecfcdef3511f10380..1f977e28c7fd8c2af07bfcf405154cba23019eb4 100644 |
--- a/src/compiler/js-call-reducer.cc |
+++ b/src/compiler/js-call-reducer.cc |
@@ -582,11 +582,44 @@ Reduction JSCallReducer::ReduceJSCall(Node* node) { |
return Changed(node); |
} |
+ // For CSA/C++ builtin {target}s, we can ensure that the number |
Benedikt Meurer
2017/04/26 16:17:57
As discussed a few weeks ago, I don't think we sho
danno
2017/04/28 06:58:10
Done.
|
+ // 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::kBooleanConstructor: |
return ReduceBooleanConstructor(node); |
case Builtins::kFunctionPrototypeApply: |