| 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 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 } | 217 } |
| 218 | 218 |
| 219 | 219 |
| 220 // ----------------------------------------------------------------------------- | 220 // ----------------------------------------------------------------------------- |
| 221 // JSToBoolean | 221 // JSToBoolean |
| 222 | 222 |
| 223 | 223 |
| 224 TEST_F(JSTypedLoweringTest, JSToBooleanWithBoolean) { | 224 TEST_F(JSTypedLoweringTest, JSToBooleanWithBoolean) { |
| 225 Node* input = Parameter(Type::Boolean(), 0); | 225 Node* input = Parameter(Type::Boolean(), 0); |
| 226 Node* context = Parameter(Type::Any(), 1); | 226 Node* context = Parameter(Type::Any(), 1); |
| 227 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 227 Reduction r = |
| 228 context, graph()->start())); | 228 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 229 input, context, graph()->start())); |
| 229 ASSERT_TRUE(r.Changed()); | 230 ASSERT_TRUE(r.Changed()); |
| 230 EXPECT_EQ(input, r.replacement()); | 231 EXPECT_EQ(input, r.replacement()); |
| 231 } | 232 } |
| 232 | 233 |
| 233 | 234 |
| 234 TEST_F(JSTypedLoweringTest, JSToBooleanWithFalsish) { | 235 TEST_F(JSTypedLoweringTest, JSToBooleanWithFalsish) { |
| 235 Node* input = Parameter( | 236 Node* input = Parameter( |
| 236 Type::Union( | 237 Type::Union( |
| 237 Type::MinusZero(), | 238 Type::MinusZero(), |
| 238 Type::Union( | 239 Type::Union( |
| 239 Type::NaN(), | 240 Type::NaN(), |
| 240 Type::Union( | 241 Type::Union( |
| 241 Type::Null(), | 242 Type::Null(), |
| 242 Type::Union( | 243 Type::Union( |
| 243 Type::Undefined(), | 244 Type::Undefined(), |
| 244 Type::Union( | 245 Type::Union( |
| 245 Type::Undetectable(), | 246 Type::Undetectable(), |
| 246 Type::Union( | 247 Type::Union( |
| 247 Type::Constant(factory()->false_value(), zone()), | 248 Type::Constant(factory()->false_value(), zone()), |
| 248 Type::Range(0.0, 0.0, zone()), zone()), | 249 Type::Range(0.0, 0.0, zone()), zone()), |
| 249 zone()), | 250 zone()), |
| 250 zone()), | 251 zone()), |
| 251 zone()), | 252 zone()), |
| 252 zone()), | 253 zone()), |
| 253 zone()), | 254 zone()), |
| 254 0); | 255 0); |
| 255 Node* context = Parameter(Type::Any(), 1); | 256 Node* context = Parameter(Type::Any(), 1); |
| 256 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 257 Reduction r = |
| 257 context, graph()->start())); | 258 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 259 input, context, graph()->start())); |
| 258 ASSERT_TRUE(r.Changed()); | 260 ASSERT_TRUE(r.Changed()); |
| 259 EXPECT_THAT(r.replacement(), IsFalseConstant()); | 261 EXPECT_THAT(r.replacement(), IsFalseConstant()); |
| 260 } | 262 } |
| 261 | 263 |
| 262 | 264 |
| 263 TEST_F(JSTypedLoweringTest, JSToBooleanWithTruish) { | 265 TEST_F(JSTypedLoweringTest, JSToBooleanWithTruish) { |
| 264 Node* input = Parameter( | 266 Node* input = Parameter( |
| 265 Type::Union( | 267 Type::Union( |
| 266 Type::Constant(factory()->true_value(), zone()), | 268 Type::Constant(factory()->true_value(), zone()), |
| 267 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone()), | 269 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone()), |
| 268 zone()), | 270 zone()), |
| 269 0); | 271 0); |
| 270 Node* context = Parameter(Type::Any(), 1); | 272 Node* context = Parameter(Type::Any(), 1); |
| 271 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 273 Reduction r = |
| 272 context, graph()->start())); | 274 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 275 input, context, graph()->start())); |
| 273 ASSERT_TRUE(r.Changed()); | 276 ASSERT_TRUE(r.Changed()); |
| 274 EXPECT_THAT(r.replacement(), IsTrueConstant()); | 277 EXPECT_THAT(r.replacement(), IsTrueConstant()); |
| 275 } | 278 } |
| 276 | 279 |
| 277 | 280 |
| 278 TEST_F(JSTypedLoweringTest, JSToBooleanWithNonZeroPlainNumber) { | 281 TEST_F(JSTypedLoweringTest, JSToBooleanWithNonZeroPlainNumber) { |
| 279 Node* input = Parameter(Type::Range(1, V8_INFINITY, zone()), 0); | 282 Node* input = Parameter(Type::Range(1, V8_INFINITY, zone()), 0); |
| 280 Node* context = Parameter(Type::Any(), 1); | 283 Node* context = Parameter(Type::Any(), 1); |
| 281 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 284 Reduction r = |
| 282 context, graph()->start())); | 285 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 286 input, context, graph()->start())); |
| 283 ASSERT_TRUE(r.Changed()); | 287 ASSERT_TRUE(r.Changed()); |
| 284 EXPECT_THAT(r.replacement(), IsTrueConstant()); | 288 EXPECT_THAT(r.replacement(), IsTrueConstant()); |
| 285 } | 289 } |
| 286 | 290 |
| 287 | 291 |
| 288 TEST_F(JSTypedLoweringTest, JSToBooleanWithOrderedNumber) { | 292 TEST_F(JSTypedLoweringTest, JSToBooleanWithOrderedNumber) { |
| 289 Node* input = Parameter(Type::OrderedNumber(), 0); | 293 Node* input = Parameter(Type::OrderedNumber(), 0); |
| 290 Node* context = Parameter(Type::Any(), 1); | 294 Node* context = Parameter(Type::Any(), 1); |
| 291 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 295 Reduction r = |
| 292 context, graph()->start())); | 296 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 297 input, context, graph()->start())); |
| 293 ASSERT_TRUE(r.Changed()); | 298 ASSERT_TRUE(r.Changed()); |
| 294 EXPECT_THAT(r.replacement(), | 299 EXPECT_THAT(r.replacement(), |
| 295 IsBooleanNot(IsNumberEqual(input, IsNumberConstant(0.0)))); | 300 IsBooleanNot(IsNumberEqual(input, IsNumberConstant(0.0)))); |
| 296 } | 301 } |
| 297 | 302 |
| 298 | 303 |
| 299 TEST_F(JSTypedLoweringTest, JSToBooleanWithString) { | 304 TEST_F(JSTypedLoweringTest, JSToBooleanWithString) { |
| 300 Node* input = Parameter(Type::String(), 0); | 305 Node* input = Parameter(Type::String(), 0); |
| 301 Node* context = Parameter(Type::Any(), 1); | 306 Node* context = Parameter(Type::Any(), 1); |
| 302 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 307 Reduction r = |
| 303 context, graph()->start())); | 308 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 309 input, context, graph()->start())); |
| 304 ASSERT_TRUE(r.Changed()); | 310 ASSERT_TRUE(r.Changed()); |
| 305 EXPECT_THAT( | 311 EXPECT_THAT( |
| 306 r.replacement(), | 312 r.replacement(), |
| 307 IsNumberLessThan(IsNumberConstant(0.0), | 313 IsNumberLessThan(IsNumberConstant(0.0), |
| 308 IsLoadField(AccessBuilder::ForStringLength(), input, | 314 IsLoadField(AccessBuilder::ForStringLength(), input, |
| 309 graph()->start(), graph()->start()))); | 315 graph()->start(), graph()->start()))); |
| 310 } | 316 } |
| 311 | 317 |
| 312 | 318 |
| 313 TEST_F(JSTypedLoweringTest, JSToBooleanWithAny) { | 319 TEST_F(JSTypedLoweringTest, JSToBooleanWithAny) { |
| 314 Node* input = Parameter(Type::Any(), 0); | 320 Node* input = Parameter(Type::Any(), 0); |
| 315 Node* context = Parameter(Type::Any(), 1); | 321 Node* context = Parameter(Type::Any(), 1); |
| 316 Reduction r = Reduce(graph()->NewNode(javascript()->ToBoolean(), input, | 322 Reduction r = |
| 317 context, graph()->start())); | 323 Reduce(graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
| 324 input, context, graph()->start())); |
| 318 ASSERT_FALSE(r.Changed()); | 325 ASSERT_FALSE(r.Changed()); |
| 319 } | 326 } |
| 320 | 327 |
| 321 | 328 |
| 322 // ----------------------------------------------------------------------------- | 329 // ----------------------------------------------------------------------------- |
| 323 // JSToNumber | 330 // JSToNumber |
| 324 | 331 |
| 325 | 332 |
| 326 TEST_F(JSTypedLoweringTest, JSToNumberWithPlainPrimitive) { | 333 TEST_F(JSTypedLoweringTest, JSToNumberWithPlainPrimitive) { |
| 327 Node* const input = Parameter(Type::PlainPrimitive(), 0); | 334 Node* const input = Parameter(Type::PlainPrimitive(), 0); |
| (...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1191 Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context, | 1198 Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context, |
| 1192 frame_state, effect, control); | 1199 frame_state, effect, control); |
| 1193 Reduction r = Reduce(instanceOf); | 1200 Reduction r = Reduce(instanceOf); |
| 1194 ASSERT_FALSE(r.Changed()); | 1201 ASSERT_FALSE(r.Changed()); |
| 1195 ASSERT_EQ(instanceOf, dummy->InputAt(0)); | 1202 ASSERT_EQ(instanceOf, dummy->InputAt(0)); |
| 1196 } | 1203 } |
| 1197 | 1204 |
| 1198 } // namespace compiler | 1205 } // namespace compiler |
| 1199 } // namespace internal | 1206 } // namespace internal |
| 1200 } // namespace v8 | 1207 } // namespace v8 |
| OLD | NEW |