| Index: src/compiler/js-call-reducer.cc
|
| diff --git a/src/compiler/js-call-reducer.cc b/src/compiler/js-call-reducer.cc
|
| index f4b0d7b603d4ed3ac1bac47e7a1e890d9606c2f2..6c71983f8b9ec8c2862146124efbd6e92fd04d21 100644
|
| --- a/src/compiler/js-call-reducer.cc
|
| +++ b/src/compiler/js-call-reducer.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "src/compiler/js-graph.h"
|
| #include "src/compiler/node-matchers.h"
|
| +#include "src/compiler/simplified-operator.h"
|
| #include "src/objects-inl.h"
|
| #include "src/type-feedback-vector-inl.h"
|
|
|
| @@ -220,7 +221,6 @@ Reduction JSCallReducer::ReduceJSCallFunction(Node* node) {
|
| Node* context = NodeProperties::GetContextInput(node);
|
| Node* control = NodeProperties::GetControlInput(node);
|
| Node* effect = NodeProperties::GetEffectInput(node);
|
| - Node* frame_state = NodeProperties::FindFrameStateBefore(node);
|
|
|
| // Try to specialize JSCallFunction {node}s with constant {target}s.
|
| HeapObjectMatcher m(target);
|
| @@ -323,16 +323,13 @@ Reduction JSCallReducer::ReduceJSCallFunction(Node* node) {
|
| }
|
|
|
| // Check that the {target} is still the {array_function}.
|
| - Node* check = graph()->NewNode(
|
| - javascript()->StrictEqual(CompareOperationHints::Any()), target,
|
| - array_function, context);
|
| - control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check,
|
| - frame_state, effect, control);
|
| + Node* check = graph()->NewNode(simplified()->ReferenceEqual(Type::Any()),
|
| + target, array_function);
|
| + effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control);
|
|
|
| // Turn the {node} into a {JSCreateArray} call.
|
| NodeProperties::ReplaceValueInput(node, array_function, 0);
|
| NodeProperties::ReplaceEffectInput(node, effect);
|
| - NodeProperties::ReplaceControlInput(node, control);
|
| return ReduceArrayConstructor(node);
|
| } else if (feedback->IsWeakCell()) {
|
| Handle<WeakCell> cell = Handle<WeakCell>::cast(feedback);
|
| @@ -341,16 +338,14 @@ Reduction JSCallReducer::ReduceJSCallFunction(Node* node) {
|
| jsgraph()->Constant(handle(cell->value(), isolate()));
|
|
|
| // Check that the {target} is still the {target_function}.
|
| - Node* check = graph()->NewNode(
|
| - javascript()->StrictEqual(CompareOperationHints::Any()), target,
|
| - target_function, context);
|
| - control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check,
|
| - frame_state, effect, control);
|
| + Node* check = graph()->NewNode(simplified()->ReferenceEqual(Type::Any()),
|
| + target, target_function);
|
| + effect =
|
| + graph()->NewNode(simplified()->CheckIf(), check, effect, control);
|
|
|
| // Specialize the JSCallFunction node to the {target_function}.
|
| NodeProperties::ReplaceValueInput(node, target_function, 0);
|
| NodeProperties::ReplaceEffectInput(node, effect);
|
| - NodeProperties::ReplaceControlInput(node, control);
|
|
|
| // Try to further reduce the JSCallFunction {node}.
|
| Reduction const reduction = ReduceJSCallFunction(node);
|
| @@ -371,7 +366,6 @@ Reduction JSCallReducer::ReduceJSCallConstruct(Node* node) {
|
| Node* context = NodeProperties::GetContextInput(node);
|
| Node* effect = NodeProperties::GetEffectInput(node);
|
| Node* control = NodeProperties::GetControlInput(node);
|
| - Node* frame_state = NodeProperties::FindFrameStateBefore(node);
|
|
|
| // Try to specialize JSCallConstruct {node}s with constant {target}s.
|
| HeapObjectMatcher m(target);
|
| @@ -445,15 +439,12 @@ Reduction JSCallReducer::ReduceJSCallConstruct(Node* node) {
|
| }
|
|
|
| // Check that the {target} is still the {array_function}.
|
| - Node* check = graph()->NewNode(
|
| - javascript()->StrictEqual(CompareOperationHints::Any()), target,
|
| - array_function, context);
|
| - control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check,
|
| - frame_state, effect, control);
|
| + Node* check = graph()->NewNode(simplified()->ReferenceEqual(Type::Any()),
|
| + target, array_function);
|
| + effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control);
|
|
|
| // Turn the {node} into a {JSCreateArray} call.
|
| NodeProperties::ReplaceEffectInput(node, effect);
|
| - NodeProperties::ReplaceControlInput(node, control);
|
| for (int i = arity; i > 0; --i) {
|
| NodeProperties::ReplaceValueInput(
|
| node, NodeProperties::GetValueInput(node, i), i + 1);
|
| @@ -468,16 +459,14 @@ Reduction JSCallReducer::ReduceJSCallConstruct(Node* node) {
|
| jsgraph()->Constant(handle(cell->value(), isolate()));
|
|
|
| // Check that the {target} is still the {target_function}.
|
| - Node* check = graph()->NewNode(
|
| - javascript()->StrictEqual(CompareOperationHints::Any()), target,
|
| - target_function, context);
|
| - control = effect = graph()->NewNode(common()->DeoptimizeUnless(), check,
|
| - frame_state, effect, control);
|
| + Node* check = graph()->NewNode(simplified()->ReferenceEqual(Type::Any()),
|
| + target, target_function);
|
| + effect =
|
| + graph()->NewNode(simplified()->CheckIf(), check, effect, control);
|
|
|
| // Specialize the JSCallConstruct node to the {target_function}.
|
| NodeProperties::ReplaceValueInput(node, target_function, 0);
|
| NodeProperties::ReplaceEffectInput(node, effect);
|
| - NodeProperties::ReplaceControlInput(node, control);
|
| if (target == new_target) {
|
| NodeProperties::ReplaceValueInput(node, target_function, arity + 1);
|
| }
|
| @@ -514,6 +503,10 @@ JSOperatorBuilder* JSCallReducer::javascript() const {
|
| return jsgraph()->javascript();
|
| }
|
|
|
| +SimplifiedOperatorBuilder* JSCallReducer::simplified() const {
|
| + return jsgraph()->simplified();
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|