| 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/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/compiler/access-builder.h" | 6 #include "src/compiler/access-builder.h" |
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/js-operator.h" | 8 #include "src/compiler/js-operator.h" |
| 9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" |
| 10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| (...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 factory()->NewJSTypedArray(type, buffer, 0, kLength); | 596 factory()->NewJSTypedArray(type, buffer, 0, kLength); |
| 597 int const element_size = static_cast<int>(array->element_size()); | 597 int const element_size = static_cast<int>(array->element_size()); |
| 598 | 598 |
| 599 Node* key = Parameter( | 599 Node* key = Parameter( |
| 600 Type::Range(kMinInt / element_size, kMaxInt / element_size, zone())); | 600 Type::Range(kMinInt / element_size, kMaxInt / element_size, zone())); |
| 601 Node* base = HeapConstant(array); | 601 Node* base = HeapConstant(array); |
| 602 Node* vector = UndefinedConstant(); | 602 Node* vector = UndefinedConstant(); |
| 603 Node* context = UndefinedConstant(); | 603 Node* context = UndefinedConstant(); |
| 604 Node* effect = graph()->start(); | 604 Node* effect = graph()->start(); |
| 605 Node* control = graph()->start(); | 605 Node* control = graph()->start(); |
| 606 Reduction r = Reduce(graph()->NewNode( | 606 Reduction r = Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), |
| 607 javascript()->LoadProperty(feedback), base, key, vector, context, | 607 base, key, vector, context, |
| 608 EmptyFrameState(), EmptyFrameState(), effect, control)); | 608 EmptyFrameState(), effect, control)); |
| 609 | 609 |
| 610 Matcher<Node*> offset_matcher = | 610 Matcher<Node*> offset_matcher = |
| 611 element_size == 1 | 611 element_size == 1 |
| 612 ? key | 612 ? key |
| 613 : IsWord32Shl(key, IsInt32Constant(WhichPowerOf2(element_size))); | 613 : IsWord32Shl(key, IsInt32Constant(WhichPowerOf2(element_size))); |
| 614 | 614 |
| 615 ASSERT_TRUE(r.Changed()); | 615 ASSERT_TRUE(r.Changed()); |
| 616 EXPECT_THAT( | 616 EXPECT_THAT( |
| 617 r.replacement(), | 617 r.replacement(), |
| 618 IsLoadBuffer(BufferAccess(type), | 618 IsLoadBuffer(BufferAccess(type), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 637 | 637 |
| 638 int min = random_number_generator()->NextInt(static_cast<int>(kLength)); | 638 int min = random_number_generator()->NextInt(static_cast<int>(kLength)); |
| 639 int max = random_number_generator()->NextInt(static_cast<int>(kLength)); | 639 int max = random_number_generator()->NextInt(static_cast<int>(kLength)); |
| 640 if (min > max) std::swap(min, max); | 640 if (min > max) std::swap(min, max); |
| 641 Node* key = Parameter(Type::Range(min, max, zone())); | 641 Node* key = Parameter(Type::Range(min, max, zone())); |
| 642 Node* base = HeapConstant(array); | 642 Node* base = HeapConstant(array); |
| 643 Node* vector = UndefinedConstant(); | 643 Node* vector = UndefinedConstant(); |
| 644 Node* context = UndefinedConstant(); | 644 Node* context = UndefinedConstant(); |
| 645 Node* effect = graph()->start(); | 645 Node* effect = graph()->start(); |
| 646 Node* control = graph()->start(); | 646 Node* control = graph()->start(); |
| 647 Reduction r = Reduce(graph()->NewNode( | 647 Reduction r = Reduce(graph()->NewNode(javascript()->LoadProperty(feedback), |
| 648 javascript()->LoadProperty(feedback), base, key, vector, context, | 648 base, key, vector, context, |
| 649 EmptyFrameState(), EmptyFrameState(), effect, control)); | 649 EmptyFrameState(), effect, control)); |
| 650 | 650 |
| 651 ASSERT_TRUE(r.Changed()); | 651 ASSERT_TRUE(r.Changed()); |
| 652 EXPECT_THAT( | 652 EXPECT_THAT( |
| 653 r.replacement(), | 653 r.replacement(), |
| 654 IsLoadElement(access, | 654 IsLoadElement(access, |
| 655 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 655 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 656 key, effect, control)); | 656 key, effect, control)); |
| 657 } | 657 } |
| 658 } | 658 } |
| 659 | 659 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 678 Node* base = HeapConstant(array); | 678 Node* base = HeapConstant(array); |
| 679 Node* value = | 679 Node* value = |
| 680 Parameter(AccessBuilder::ForTypedArrayElement(type, true).type); | 680 Parameter(AccessBuilder::ForTypedArrayElement(type, true).type); |
| 681 Node* vector = UndefinedConstant(); | 681 Node* vector = UndefinedConstant(); |
| 682 Node* context = UndefinedConstant(); | 682 Node* context = UndefinedConstant(); |
| 683 Node* effect = graph()->start(); | 683 Node* effect = graph()->start(); |
| 684 Node* control = graph()->start(); | 684 Node* control = graph()->start(); |
| 685 VectorSlotPair feedback; | 685 VectorSlotPair feedback; |
| 686 const Operator* op = javascript()->StoreProperty(language_mode, feedback); | 686 const Operator* op = javascript()->StoreProperty(language_mode, feedback); |
| 687 Node* node = graph()->NewNode(op, base, key, value, vector, context, | 687 Node* node = graph()->NewNode(op, base, key, value, vector, context, |
| 688 EmptyFrameState(), EmptyFrameState(), | 688 EmptyFrameState(), effect, control); |
| 689 effect, control); | |
| 690 Reduction r = Reduce(node); | 689 Reduction r = Reduce(node); |
| 691 | 690 |
| 692 Matcher<Node*> offset_matcher = | 691 Matcher<Node*> offset_matcher = |
| 693 element_size == 1 | 692 element_size == 1 |
| 694 ? key | 693 ? key |
| 695 : IsWord32Shl(key, IsInt32Constant(WhichPowerOf2(element_size))); | 694 : IsWord32Shl(key, IsInt32Constant(WhichPowerOf2(element_size))); |
| 696 | 695 |
| 697 ASSERT_TRUE(r.Changed()); | 696 ASSERT_TRUE(r.Changed()); |
| 698 EXPECT_THAT( | 697 EXPECT_THAT( |
| 699 r.replacement(), | 698 r.replacement(), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 719 int const element_size = static_cast<int>(array->element_size()); | 718 int const element_size = static_cast<int>(array->element_size()); |
| 720 | 719 |
| 721 Node* key = Parameter( | 720 Node* key = Parameter( |
| 722 Type::Range(kMinInt / element_size, kMaxInt / element_size, zone())); | 721 Type::Range(kMinInt / element_size, kMaxInt / element_size, zone())); |
| 723 Node* base = HeapConstant(array); | 722 Node* base = HeapConstant(array); |
| 724 Node* value = Parameter(Type::Any()); | 723 Node* value = Parameter(Type::Any()); |
| 725 Node* vector = UndefinedConstant(); | 724 Node* vector = UndefinedConstant(); |
| 726 Node* context = UndefinedConstant(); | 725 Node* context = UndefinedConstant(); |
| 727 Node* effect = graph()->start(); | 726 Node* effect = graph()->start(); |
| 728 Node* control = graph()->start(); | 727 Node* control = graph()->start(); |
| 728 // TODO(mstarzinger): Once the effect-control-linearizer provides a frame |
| 729 // state we can get rid of this checkpoint again. The reducer won't care. |
| 730 Node* checkpoint = graph()->NewNode(common()->Checkpoint(), |
| 731 EmptyFrameState(), effect, control); |
| 729 VectorSlotPair feedback; | 732 VectorSlotPair feedback; |
| 730 const Operator* op = javascript()->StoreProperty(language_mode, feedback); | 733 const Operator* op = javascript()->StoreProperty(language_mode, feedback); |
| 731 Node* node = graph()->NewNode(op, base, key, value, vector, context, | 734 Node* node = graph()->NewNode(op, base, key, value, vector, context, |
| 732 EmptyFrameState(), EmptyFrameState(), | 735 EmptyFrameState(), checkpoint, control); |
| 733 effect, control); | |
| 734 Reduction r = Reduce(node); | 736 Reduction r = Reduce(node); |
| 735 | 737 |
| 736 Matcher<Node*> offset_matcher = | 738 Matcher<Node*> offset_matcher = |
| 737 element_size == 1 | 739 element_size == 1 |
| 738 ? key | 740 ? key |
| 739 : IsWord32Shl(key, IsInt32Constant(WhichPowerOf2(element_size))); | 741 : IsWord32Shl(key, IsInt32Constant(WhichPowerOf2(element_size))); |
| 740 | 742 |
| 741 Matcher<Node*> value_matcher = | 743 Matcher<Node*> value_matcher = |
| 742 IsToNumber(value, context, effect, control); | 744 IsToNumber(value, context, checkpoint, control); |
| 743 Matcher<Node*> effect_matcher = value_matcher; | 745 Matcher<Node*> effect_matcher = value_matcher; |
| 744 | 746 |
| 745 ASSERT_TRUE(r.Changed()); | 747 ASSERT_TRUE(r.Changed()); |
| 746 EXPECT_THAT( | 748 EXPECT_THAT( |
| 747 r.replacement(), | 749 r.replacement(), |
| 748 IsStoreBuffer(BufferAccess(type), | 750 IsStoreBuffer(BufferAccess(type), |
| 749 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 751 IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 750 offset_matcher, | 752 offset_matcher, |
| 751 IsNumberConstant(array->byte_length()->Number()), | 753 IsNumberConstant(array->byte_length()->Number()), |
| 752 value_matcher, effect_matcher, control)); | 754 value_matcher, effect_matcher, control)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 772 Node* key = Parameter(Type::Range(min, max, zone())); | 774 Node* key = Parameter(Type::Range(min, max, zone())); |
| 773 Node* base = HeapConstant(array); | 775 Node* base = HeapConstant(array); |
| 774 Node* value = Parameter(access.type); | 776 Node* value = Parameter(access.type); |
| 775 Node* vector = UndefinedConstant(); | 777 Node* vector = UndefinedConstant(); |
| 776 Node* context = UndefinedConstant(); | 778 Node* context = UndefinedConstant(); |
| 777 Node* effect = graph()->start(); | 779 Node* effect = graph()->start(); |
| 778 Node* control = graph()->start(); | 780 Node* control = graph()->start(); |
| 779 VectorSlotPair feedback; | 781 VectorSlotPair feedback; |
| 780 const Operator* op = javascript()->StoreProperty(language_mode, feedback); | 782 const Operator* op = javascript()->StoreProperty(language_mode, feedback); |
| 781 Node* node = graph()->NewNode(op, base, key, value, vector, context, | 783 Node* node = graph()->NewNode(op, base, key, value, vector, context, |
| 782 EmptyFrameState(), EmptyFrameState(), | 784 EmptyFrameState(), effect, control); |
| 783 effect, control); | |
| 784 Reduction r = Reduce(node); | 785 Reduction r = Reduce(node); |
| 785 | 786 |
| 786 ASSERT_TRUE(r.Changed()); | 787 ASSERT_TRUE(r.Changed()); |
| 787 EXPECT_THAT( | 788 EXPECT_THAT( |
| 788 r.replacement(), | 789 r.replacement(), |
| 789 IsStoreElement( | 790 IsStoreElement( |
| 790 access, IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 791 access, IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 791 key, value, effect, control)); | 792 key, value, effect, control)); |
| 792 } | 793 } |
| 793 } | 794 } |
| 794 } | 795 } |
| 795 | 796 |
| 796 | 797 |
| 797 // ----------------------------------------------------------------------------- | 798 // ----------------------------------------------------------------------------- |
| 798 // JSLoadNamed | 799 // JSLoadNamed |
| 799 | 800 |
| 800 | 801 |
| 801 TEST_F(JSTypedLoweringTest, JSLoadNamedStringLength) { | 802 TEST_F(JSTypedLoweringTest, JSLoadNamedStringLength) { |
| 802 VectorSlotPair feedback; | 803 VectorSlotPair feedback; |
| 803 Handle<Name> name = factory()->length_string(); | 804 Handle<Name> name = factory()->length_string(); |
| 804 Node* const receiver = Parameter(Type::String(), 0); | 805 Node* const receiver = Parameter(Type::String(), 0); |
| 805 Node* const vector = Parameter(Type::Internal(), 1); | 806 Node* const vector = Parameter(Type::Internal(), 1); |
| 806 Node* const context = UndefinedConstant(); | 807 Node* const context = UndefinedConstant(); |
| 807 Node* const effect = graph()->start(); | 808 Node* const effect = graph()->start(); |
| 808 Node* const control = graph()->start(); | 809 Node* const control = graph()->start(); |
| 809 Reduction const r = Reduce(graph()->NewNode( | 810 Reduction const r = Reduce( |
| 810 javascript()->LoadNamed(name, feedback), receiver, vector, context, | 811 graph()->NewNode(javascript()->LoadNamed(name, feedback), receiver, |
| 811 EmptyFrameState(), EmptyFrameState(), effect, control)); | 812 vector, context, EmptyFrameState(), effect, control)); |
| 812 ASSERT_TRUE(r.Changed()); | 813 ASSERT_TRUE(r.Changed()); |
| 813 EXPECT_THAT(r.replacement(), IsLoadField(AccessBuilder::ForStringLength(), | 814 EXPECT_THAT(r.replacement(), IsLoadField(AccessBuilder::ForStringLength(), |
| 814 receiver, effect, control)); | 815 receiver, effect, control)); |
| 815 } | 816 } |
| 816 | 817 |
| 817 | 818 |
| 818 // ----------------------------------------------------------------------------- | 819 // ----------------------------------------------------------------------------- |
| 819 // JSAdd | 820 // JSAdd |
| 820 | 821 |
| 821 | 822 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context, | 946 Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context, |
| 946 frame_state, effect, control); | 947 frame_state, effect, control); |
| 947 Reduction r = Reduce(instanceOf); | 948 Reduction r = Reduce(instanceOf); |
| 948 ASSERT_FALSE(r.Changed()); | 949 ASSERT_FALSE(r.Changed()); |
| 949 ASSERT_EQ(instanceOf, dummy->InputAt(0)); | 950 ASSERT_EQ(instanceOf, dummy->InputAt(0)); |
| 950 } | 951 } |
| 951 | 952 |
| 952 } // namespace compiler | 953 } // namespace compiler |
| 953 } // namespace internal | 954 } // namespace internal |
| 954 } // namespace v8 | 955 } // namespace v8 |
| OLD | NEW |