| 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/access-builder.h" | 5 #include "src/compiler/access-builder.h" |
| 6 #include "src/compiler/js-graph.h" | 6 #include "src/compiler/js-graph.h" |
| 7 #include "src/compiler/js-operator.h" | 7 #include "src/compiler/js-operator.h" |
| 8 #include "src/compiler/js-typed-lowering.h" | 8 #include "src/compiler/js-typed-lowering.h" |
| 9 #include "src/compiler/machine-operator.h" | 9 #include "src/compiler/machine-operator.h" |
| 10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 | 71 |
| 72 private: | 72 private: |
| 73 JSOperatorBuilder javascript_; | 73 JSOperatorBuilder javascript_; |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 | 76 |
| 77 // ----------------------------------------------------------------------------- | 77 // ----------------------------------------------------------------------------- |
| 78 // JSToBoolean | 78 // JSToBoolean |
| 79 | 79 |
| 80 | 80 |
| 81 TEST_F(JSTypedLoweringTest, JSToBooleanWithBoolean) { |
| 82 Node* input = Parameter(Type::Boolean()); |
| 83 Node* context = UndefinedConstant(); |
| 84 |
| 85 Reduction r = |
| 86 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 87 ASSERT_TRUE(r.Changed()); |
| 88 EXPECT_EQ(input, r.replacement()); |
| 89 } |
| 90 |
| 91 |
| 92 TEST_F(JSTypedLoweringTest, JSToBooleanWithUndefined) { |
| 93 Node* input = Parameter(Type::Undefined()); |
| 94 Node* context = UndefinedConstant(); |
| 95 |
| 96 Reduction r = |
| 97 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 98 ASSERT_TRUE(r.Changed()); |
| 99 EXPECT_THAT(r.replacement(), IsFalseConstant()); |
| 100 } |
| 101 |
| 102 |
| 103 TEST_F(JSTypedLoweringTest, JSToBooleanWithNull) { |
| 104 Node* input = Parameter(Type::Null()); |
| 105 Node* context = UndefinedConstant(); |
| 106 |
| 107 Reduction r = |
| 108 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 109 ASSERT_TRUE(r.Changed()); |
| 110 EXPECT_THAT(r.replacement(), IsFalseConstant()); |
| 111 } |
| 112 |
| 113 |
| 114 TEST_F(JSTypedLoweringTest, JSToBooleanWithDetectableReceiver) { |
| 115 Node* input = Parameter(Type::DetectableReceiver()); |
| 116 Node* context = UndefinedConstant(); |
| 117 |
| 118 Reduction r = |
| 119 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 120 ASSERT_TRUE(r.Changed()); |
| 121 EXPECT_THAT(r.replacement(), IsTrueConstant()); |
| 122 } |
| 123 |
| 124 |
| 125 TEST_F(JSTypedLoweringTest, JSToBooleanWithUndetectable) { |
| 126 Node* input = Parameter(Type::Undetectable()); |
| 127 Node* context = UndefinedConstant(); |
| 128 |
| 129 Reduction r = |
| 130 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 131 ASSERT_TRUE(r.Changed()); |
| 132 EXPECT_THAT(r.replacement(), IsFalseConstant()); |
| 133 } |
| 134 |
| 135 |
| 136 TEST_F(JSTypedLoweringTest, JSToBooleanWithOrderedNumber) { |
| 137 Node* input = Parameter(Type::OrderedNumber()); |
| 138 Node* context = UndefinedConstant(); |
| 139 |
| 140 Reduction r = |
| 141 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 142 ASSERT_TRUE(r.Changed()); |
| 143 EXPECT_THAT(r.replacement(), |
| 144 IsBooleanNot(IsNumberEqual(input, IsNumberConstant(0)))); |
| 145 } |
| 146 |
| 147 |
| 81 TEST_F(JSTypedLoweringTest, JSToBooleanWithString) { | 148 TEST_F(JSTypedLoweringTest, JSToBooleanWithString) { |
| 82 Node* input = Parameter(Type::String()); | 149 Node* input = Parameter(Type::String()); |
| 83 Node* context = UndefinedConstant(); | 150 Node* context = UndefinedConstant(); |
| 84 Node* effect = graph()->start(); | |
| 85 Node* control = graph()->start(); | |
| 86 | 151 |
| 87 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 152 Reduction r = |
| 88 context, effect, control)); | 153 Reduce(graph()->NewNode(javascript()->ToBoolean(), input, context)); |
| 89 ASSERT_TRUE(r.Changed()); | 154 ASSERT_TRUE(r.Changed()); |
| 90 EXPECT_THAT(r.replacement(), | 155 EXPECT_THAT(r.replacement(), |
| 91 IsBooleanNot(IsNumberEqual( | 156 IsBooleanNot(IsNumberEqual( |
| 92 IsLoadField(AccessBuilder::ForStringLength(), input, | 157 IsLoadField(AccessBuilder::ForStringLength(), input, |
| 93 graph()->start(), graph()->start()), | 158 graph()->start(), graph()->start()), |
| 94 IsNumberConstant(0)))); | 159 IsNumberConstant(0)))); |
| 95 } | 160 } |
| 96 | 161 |
| 97 | 162 |
| 98 TEST_F(JSTypedLoweringTest, JSToBooleanWithOrderedNumberAndBoolean) { | 163 TEST_F(JSTypedLoweringTest, JSToBooleanWithPhi) { |
| 99 Node* p0 = Parameter(Type::OrderedNumber(), 0); | 164 Node* p0 = Parameter(Type::OrderedNumber(), 0); |
| 100 Node* p1 = Parameter(Type::Boolean(), 1); | 165 Node* p1 = Parameter(Type::Boolean(), 1); |
| 101 Node* context = UndefinedConstant(); | 166 Node* context = UndefinedConstant(); |
| 102 Node* effect = graph()->start(); | |
| 103 Node* control = graph()->start(); | 167 Node* control = graph()->start(); |
| 104 | 168 |
| 105 Reduction r = Reduce(graph()->NewNode( | 169 Reduction r = Reduce(graph()->NewNode( |
| 106 javascript()->ToBoolean(), | 170 javascript()->ToBoolean(), |
| 107 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), p0, p1, control), | 171 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), p0, p1, control), |
| 108 context, effect, control)); | 172 context)); |
| 109 ASSERT_TRUE(r.Changed()); | 173 ASSERT_TRUE(r.Changed()); |
| 110 EXPECT_THAT( | 174 EXPECT_THAT( |
| 111 r.replacement(), | 175 r.replacement(), |
| 112 IsPhi(kMachAnyTagged, | 176 IsPhi(kMachAnyTagged, |
| 113 IsBooleanNot(IsNumberEqual(p0, IsNumberConstant(0))), p1, control)); | 177 IsBooleanNot(IsNumberEqual(p0, IsNumberConstant(0))), p1, control)); |
| 114 } | 178 } |
| 115 | 179 |
| 116 | 180 |
| 181 TEST_F(JSTypedLoweringTest, JSToBooleanWithSelect) { |
| 182 Node* p0 = Parameter(Type::Boolean(), 0); |
| 183 Node* p1 = Parameter(Type::DetectableReceiver(), 1); |
| 184 Node* p2 = Parameter(Type::OrderedNumber(), 2); |
| 185 Node* context = UndefinedConstant(); |
| 186 |
| 187 Reduction r = Reduce(graph()->NewNode( |
| 188 javascript()->ToBoolean(), |
| 189 graph()->NewNode(common()->Select(kMachAnyTagged, BranchHint::kTrue), p0, |
| 190 p1, p2), |
| 191 context)); |
| 192 ASSERT_TRUE(r.Changed()); |
| 193 EXPECT_THAT(r.replacement(), |
| 194 IsSelect(kMachAnyTagged, p0, IsTrueConstant(), |
| 195 IsBooleanNot(IsNumberEqual(p2, IsNumberConstant(0))))); |
| 196 } |
| 197 |
| 198 |
| 117 // ----------------------------------------------------------------------------- | 199 // ----------------------------------------------------------------------------- |
| 118 // JSStrictEqual | 200 // JSStrictEqual |
| 119 | 201 |
| 120 | 202 |
| 121 TEST_F(JSTypedLoweringTest, JSStrictEqualWithTheHole) { | 203 TEST_F(JSTypedLoweringTest, JSStrictEqualWithTheHole) { |
| 122 Node* const the_hole = HeapConstant(factory()->the_hole_value()); | 204 Node* const the_hole = HeapConstant(factory()->the_hole_value()); |
| 123 Node* const context = UndefinedConstant(); | 205 Node* const context = UndefinedConstant(); |
| 124 Node* const effect = graph()->start(); | 206 Node* const effect = graph()->start(); |
| 125 Node* const control = graph()->start(); | 207 Node* const control = graph()->start(); |
| 126 TRACED_FOREACH(Type*, type, kJSTypes) { | 208 TRACED_FOREACH(Type*, type, kJSTypes) { |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 IsStoreElement( | 615 IsStoreElement( |
| 534 access, IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), | 616 access, IsIntPtrConstant(bit_cast<intptr_t>(&backing_store[0])), |
| 535 key, value, effect, control)); | 617 key, value, effect, control)); |
| 536 } | 618 } |
| 537 } | 619 } |
| 538 } | 620 } |
| 539 | 621 |
| 540 } // namespace compiler | 622 } // namespace compiler |
| 541 } // namespace internal | 623 } // namespace internal |
| 542 } // namespace v8 | 624 } // namespace v8 |
| OLD | NEW |