OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/js-builtin-reducer.h" | 5 #include "src/compiler/js-builtin-reducer.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 | 726 |
727 // ES6 section 22.1.2.2 Array.isArray ( arg ) | 727 // ES6 section 22.1.2.2 Array.isArray ( arg ) |
728 Reduction JSBuiltinReducer::ReduceArrayIsArray(Node* node) { | 728 Reduction JSBuiltinReducer::ReduceArrayIsArray(Node* node) { |
729 // We certainly know that undefined is not an array. | 729 // We certainly know that undefined is not an array. |
730 if (node->op()->ValueInputCount() < 3) { | 730 if (node->op()->ValueInputCount() < 3) { |
731 Node* value = jsgraph()->FalseConstant(); | 731 Node* value = jsgraph()->FalseConstant(); |
732 ReplaceWithValue(node, value); | 732 ReplaceWithValue(node, value); |
733 return Replace(value); | 733 return Replace(value); |
734 } | 734 } |
735 Node* value = NodeProperties::GetValueInput(node, 2); | 735 Node* value = NodeProperties::GetValueInput(node, 2); |
| 736 Type* value_type = NodeProperties::GetType(value); |
736 Node* context = NodeProperties::GetContextInput(node); | 737 Node* context = NodeProperties::GetContextInput(node); |
737 Node* frame_state = NodeProperties::GetFrameStateInput(node); | 738 Node* frame_state = NodeProperties::GetFrameStateInput(node); |
738 Node* effect = NodeProperties::GetEffectInput(node); | 739 Node* effect = NodeProperties::GetEffectInput(node); |
739 Node* control = NodeProperties::GetControlInput(node); | 740 Node* control = NodeProperties::GetControlInput(node); |
740 | 741 |
| 742 // Constant-fold based on {value} type. |
| 743 if (value_type->Is(Type::Array())) { |
| 744 Node* value = jsgraph()->TrueConstant(); |
| 745 ReplaceWithValue(node, value); |
| 746 return Replace(value); |
| 747 } else if (!value_type->Maybe(Type::ArrayOrProxy())) { |
| 748 Node* value = jsgraph()->FalseConstant(); |
| 749 ReplaceWithValue(node, value); |
| 750 return Replace(value); |
| 751 } |
| 752 |
741 int count = 0; | 753 int count = 0; |
742 Node* values[5]; | 754 Node* values[5]; |
743 Node* effects[5]; | 755 Node* effects[5]; |
744 Node* controls[4]; | 756 Node* controls[4]; |
745 | 757 |
746 // Check if the {value} is a Smi. | 758 // Check if the {value} is a Smi. |
747 Node* check = graph()->NewNode(simplified()->ObjectIsSmi(), value); | 759 Node* check = graph()->NewNode(simplified()->ObjectIsSmi(), value); |
748 control = | 760 control = |
749 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); | 761 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); |
750 | 762 |
(...skipping 1581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2332 return jsgraph()->simplified(); | 2344 return jsgraph()->simplified(); |
2333 } | 2345 } |
2334 | 2346 |
2335 JSOperatorBuilder* JSBuiltinReducer::javascript() const { | 2347 JSOperatorBuilder* JSBuiltinReducer::javascript() const { |
2336 return jsgraph()->javascript(); | 2348 return jsgraph()->javascript(); |
2337 } | 2349 } |
2338 | 2350 |
2339 } // namespace compiler | 2351 } // namespace compiler |
2340 } // namespace internal | 2352 } // namespace internal |
2341 } // namespace v8 | 2353 } // namespace v8 |
OLD | NEW |