| 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 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 // JSShiftLeft | 416 // JSShiftLeft |
| 417 | 417 |
| 418 | 418 |
| 419 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndConstant) { | 419 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndConstant) { |
| 420 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 420 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 421 Node* const lhs = Parameter(Type::Signed32()); | 421 Node* const lhs = Parameter(Type::Signed32()); |
| 422 Node* const context = UndefinedConstant(); | 422 Node* const context = UndefinedConstant(); |
| 423 Node* const effect = graph()->start(); | 423 Node* const effect = graph()->start(); |
| 424 Node* const control = graph()->start(); | 424 Node* const control = graph()->start(); |
| 425 TRACED_FORRANGE(double, rhs, 0, 31) { | 425 TRACED_FORRANGE(double, rhs, 0, 31) { |
| 426 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | 426 Reduction r = Reduce(graph()->NewNode( |
| 427 Reduction r = Reduce( | 427 javascript()->ShiftLeft(hints), lhs, NumberConstant(rhs), context, |
| 428 graph()->NewNode(javascript()->ShiftLeft(language_mode, hints), lhs, | 428 EmptyFrameState(), EmptyFrameState(), effect, control)); |
| 429 NumberConstant(rhs), context, EmptyFrameState(), | 429 ASSERT_TRUE(r.Changed()); |
| 430 EmptyFrameState(), effect, control)); | 430 EXPECT_THAT(r.replacement(), |
| 431 ASSERT_TRUE(r.Changed()); | 431 IsNumberShiftLeft(lhs, IsNumberConstant(BitEq(rhs)))); |
| 432 EXPECT_THAT(r.replacement(), | |
| 433 IsNumberShiftLeft(lhs, IsNumberConstant(BitEq(rhs)))); | |
| 434 } | |
| 435 } | 432 } |
| 436 } | 433 } |
| 437 | 434 |
| 438 | 435 |
| 439 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndUnsigned32) { | 436 TEST_F(JSTypedLoweringTest, JSShiftLeftWithSigned32AndUnsigned32) { |
| 440 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 437 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 441 Node* const lhs = Parameter(Type::Signed32()); | 438 Node* const lhs = Parameter(Type::Signed32()); |
| 442 Node* const rhs = Parameter(Type::Unsigned32()); | 439 Node* const rhs = Parameter(Type::Unsigned32()); |
| 443 Node* const context = UndefinedConstant(); | 440 Node* const context = UndefinedConstant(); |
| 444 Node* const effect = graph()->start(); | 441 Node* const effect = graph()->start(); |
| 445 Node* const control = graph()->start(); | 442 Node* const control = graph()->start(); |
| 446 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | 443 Reduction r = Reduce(graph()->NewNode(javascript()->ShiftLeft(hints), lhs, |
| 447 Reduction r = Reduce(graph()->NewNode( | 444 rhs, context, EmptyFrameState(), |
| 448 javascript()->ShiftLeft(language_mode, hints), lhs, rhs, context, | 445 EmptyFrameState(), effect, control)); |
| 449 EmptyFrameState(), EmptyFrameState(), effect, control)); | 446 ASSERT_TRUE(r.Changed()); |
| 450 ASSERT_TRUE(r.Changed()); | 447 EXPECT_THAT(r.replacement(), IsNumberShiftLeft(lhs, rhs)); |
| 451 EXPECT_THAT(r.replacement(), IsNumberShiftLeft(lhs, rhs)); | |
| 452 } | |
| 453 } | 448 } |
| 454 | 449 |
| 455 | 450 |
| 456 // ----------------------------------------------------------------------------- | 451 // ----------------------------------------------------------------------------- |
| 457 // JSShiftRight | 452 // JSShiftRight |
| 458 | 453 |
| 459 | 454 |
| 460 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndConstant) { | 455 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndConstant) { |
| 461 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 456 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 462 Node* const lhs = Parameter(Type::Signed32()); | 457 Node* const lhs = Parameter(Type::Signed32()); |
| 463 Node* const context = UndefinedConstant(); | 458 Node* const context = UndefinedConstant(); |
| 464 Node* const effect = graph()->start(); | 459 Node* const effect = graph()->start(); |
| 465 Node* const control = graph()->start(); | 460 Node* const control = graph()->start(); |
| 466 TRACED_FORRANGE(double, rhs, 0, 31) { | 461 TRACED_FORRANGE(double, rhs, 0, 31) { |
| 467 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | 462 Reduction r = Reduce(graph()->NewNode( |
| 468 Reduction r = Reduce( | 463 javascript()->ShiftRight(hints), lhs, NumberConstant(rhs), context, |
| 469 graph()->NewNode(javascript()->ShiftRight(language_mode, hints), lhs, | 464 EmptyFrameState(), EmptyFrameState(), effect, control)); |
| 470 NumberConstant(rhs), context, EmptyFrameState(), | 465 ASSERT_TRUE(r.Changed()); |
| 471 EmptyFrameState(), effect, control)); | 466 EXPECT_THAT(r.replacement(), |
| 472 ASSERT_TRUE(r.Changed()); | 467 IsNumberShiftRight(lhs, IsNumberConstant(BitEq(rhs)))); |
| 473 EXPECT_THAT(r.replacement(), | |
| 474 IsNumberShiftRight(lhs, IsNumberConstant(BitEq(rhs)))); | |
| 475 } | |
| 476 } | 468 } |
| 477 } | 469 } |
| 478 | 470 |
| 479 | 471 |
| 480 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndUnsigned32) { | 472 TEST_F(JSTypedLoweringTest, JSShiftRightWithSigned32AndUnsigned32) { |
| 481 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 473 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 482 Node* const lhs = Parameter(Type::Signed32()); | 474 Node* const lhs = Parameter(Type::Signed32()); |
| 483 Node* const rhs = Parameter(Type::Unsigned32()); | 475 Node* const rhs = Parameter(Type::Unsigned32()); |
| 484 Node* const context = UndefinedConstant(); | 476 Node* const context = UndefinedConstant(); |
| 485 Node* const effect = graph()->start(); | 477 Node* const effect = graph()->start(); |
| 486 Node* const control = graph()->start(); | 478 Node* const control = graph()->start(); |
| 487 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | 479 Reduction r = Reduce(graph()->NewNode(javascript()->ShiftRight(hints), lhs, |
| 488 Reduction r = Reduce(graph()->NewNode( | 480 rhs, context, EmptyFrameState(), |
| 489 javascript()->ShiftRight(language_mode, hints), lhs, rhs, context, | 481 EmptyFrameState(), effect, control)); |
| 490 EmptyFrameState(), EmptyFrameState(), effect, control)); | 482 ASSERT_TRUE(r.Changed()); |
| 491 ASSERT_TRUE(r.Changed()); | 483 EXPECT_THAT(r.replacement(), IsNumberShiftRight(lhs, rhs)); |
| 492 EXPECT_THAT(r.replacement(), IsNumberShiftRight(lhs, rhs)); | |
| 493 } | |
| 494 } | 484 } |
| 495 | 485 |
| 496 | 486 |
| 497 // ----------------------------------------------------------------------------- | 487 // ----------------------------------------------------------------------------- |
| 498 // JSShiftRightLogical | 488 // JSShiftRightLogical |
| 499 | 489 |
| 500 | 490 |
| 501 TEST_F(JSTypedLoweringTest, | 491 TEST_F(JSTypedLoweringTest, |
| 502 JSShiftRightLogicalWithUnsigned32AndConstant) { | 492 JSShiftRightLogicalWithUnsigned32AndConstant) { |
| 503 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 493 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 504 Node* const lhs = Parameter(Type::Unsigned32()); | 494 Node* const lhs = Parameter(Type::Unsigned32()); |
| 505 Node* const context = UndefinedConstant(); | 495 Node* const context = UndefinedConstant(); |
| 506 Node* const effect = graph()->start(); | 496 Node* const effect = graph()->start(); |
| 507 Node* const control = graph()->start(); | 497 Node* const control = graph()->start(); |
| 508 TRACED_FORRANGE(double, rhs, 0, 31) { | 498 TRACED_FORRANGE(double, rhs, 0, 31) { |
| 509 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | 499 Reduction r = Reduce(graph()->NewNode( |
| 510 Reduction r = Reduce(graph()->NewNode( | 500 javascript()->ShiftRightLogical(hints), lhs, NumberConstant(rhs), |
| 511 javascript()->ShiftRightLogical(language_mode, hints), lhs, | 501 context, EmptyFrameState(), EmptyFrameState(), effect, control)); |
| 512 NumberConstant(rhs), context, EmptyFrameState(), EmptyFrameState(), | 502 ASSERT_TRUE(r.Changed()); |
| 513 effect, control)); | 503 EXPECT_THAT(r.replacement(), |
| 514 ASSERT_TRUE(r.Changed()); | 504 IsNumberShiftRightLogical(lhs, IsNumberConstant(BitEq(rhs)))); |
| 515 EXPECT_THAT(r.replacement(), | |
| 516 IsNumberShiftRightLogical(lhs, IsNumberConstant(BitEq(rhs)))); | |
| 517 } | |
| 518 } | 505 } |
| 519 } | 506 } |
| 520 | 507 |
| 521 | 508 |
| 522 TEST_F(JSTypedLoweringTest, JSShiftRightLogicalWithUnsigned32AndUnsigned32) { | 509 TEST_F(JSTypedLoweringTest, JSShiftRightLogicalWithUnsigned32AndUnsigned32) { |
| 523 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 510 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 524 Node* const lhs = Parameter(Type::Unsigned32()); | 511 Node* const lhs = Parameter(Type::Unsigned32()); |
| 525 Node* const rhs = Parameter(Type::Unsigned32()); | 512 Node* const rhs = Parameter(Type::Unsigned32()); |
| 526 Node* const context = UndefinedConstant(); | 513 Node* const context = UndefinedConstant(); |
| 527 Node* const effect = graph()->start(); | 514 Node* const effect = graph()->start(); |
| 528 Node* const control = graph()->start(); | 515 Node* const control = graph()->start(); |
| 529 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | 516 Reduction r = Reduce(graph()->NewNode(javascript()->ShiftRightLogical(hints), |
| 530 Reduction r = Reduce(graph()->NewNode( | 517 lhs, rhs, context, EmptyFrameState(), |
| 531 javascript()->ShiftRightLogical(language_mode, hints), lhs, rhs, | 518 EmptyFrameState(), effect, control)); |
| 532 context, EmptyFrameState(), EmptyFrameState(), effect, control)); | 519 ASSERT_TRUE(r.Changed()); |
| 533 ASSERT_TRUE(r.Changed()); | 520 EXPECT_THAT(r.replacement(), IsNumberShiftRightLogical(lhs, rhs)); |
| 534 EXPECT_THAT(r.replacement(), IsNumberShiftRightLogical(lhs, rhs)); | |
| 535 } | |
| 536 } | 521 } |
| 537 | 522 |
| 538 | 523 |
| 539 // ----------------------------------------------------------------------------- | 524 // ----------------------------------------------------------------------------- |
| 540 // JSLoadContext | 525 // JSLoadContext |
| 541 | 526 |
| 542 | 527 |
| 543 TEST_F(JSTypedLoweringTest, JSLoadContext) { | 528 TEST_F(JSTypedLoweringTest, JSLoadContext) { |
| 544 Node* const context = Parameter(Type::Any()); | 529 Node* const context = Parameter(Type::Any()); |
| 545 Node* const effect = graph()->start(); | 530 Node* const effect = graph()->start(); |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 } | 852 } |
| 868 } | 853 } |
| 869 | 854 |
| 870 | 855 |
| 871 // ----------------------------------------------------------------------------- | 856 // ----------------------------------------------------------------------------- |
| 872 // JSAdd | 857 // JSAdd |
| 873 | 858 |
| 874 | 859 |
| 875 TEST_F(JSTypedLoweringTest, JSAddWithString) { | 860 TEST_F(JSTypedLoweringTest, JSAddWithString) { |
| 876 BinaryOperationHints const hints = BinaryOperationHints::Any(); | 861 BinaryOperationHints const hints = BinaryOperationHints::Any(); |
| 877 TRACED_FOREACH(LanguageMode, language_mode, kLanguageModes) { | |
| 878 Node* lhs = Parameter(Type::String(), 0); | 862 Node* lhs = Parameter(Type::String(), 0); |
| 879 Node* rhs = Parameter(Type::String(), 1); | 863 Node* rhs = Parameter(Type::String(), 1); |
| 880 Node* context = Parameter(Type::Any(), 2); | 864 Node* context = Parameter(Type::Any(), 2); |
| 881 Node* frame_state0 = EmptyFrameState(); | 865 Node* frame_state0 = EmptyFrameState(); |
| 882 Node* frame_state1 = EmptyFrameState(); | 866 Node* frame_state1 = EmptyFrameState(); |
| 883 Node* effect = graph()->start(); | 867 Node* effect = graph()->start(); |
| 884 Node* control = graph()->start(); | 868 Node* control = graph()->start(); |
| 885 Reduction r = Reduce( | 869 Reduction r = |
| 886 graph()->NewNode(javascript()->Add(language_mode, hints), lhs, rhs, | 870 Reduce(graph()->NewNode(javascript()->Add(hints), lhs, rhs, context, |
| 887 context, frame_state0, frame_state1, effect, control)); | 871 frame_state0, frame_state1, effect, control)); |
| 888 ASSERT_TRUE(r.Changed()); | 872 ASSERT_TRUE(r.Changed()); |
| 889 EXPECT_THAT(r.replacement(), | 873 EXPECT_THAT(r.replacement(), |
| 890 IsCall(_, IsHeapConstant(CodeFactory::StringAdd( | 874 IsCall(_, IsHeapConstant(CodeFactory::StringAdd( |
| 891 isolate(), STRING_ADD_CHECK_NONE, | 875 isolate(), STRING_ADD_CHECK_NONE, |
| 892 NOT_TENURED).code()), | 876 NOT_TENURED).code()), |
| 893 lhs, rhs, context, frame_state0, effect, control)); | 877 lhs, rhs, context, frame_state0, effect, control)); |
| 894 } | |
| 895 } | 878 } |
| 896 | 879 |
| 897 | 880 |
| 898 // ----------------------------------------------------------------------------- | 881 // ----------------------------------------------------------------------------- |
| 899 // JSInstanceOf | 882 // JSInstanceOf |
| 900 // Test that instanceOf is reduced if and only if the right-hand side is a | 883 // Test that instanceOf is reduced if and only if the right-hand side is a |
| 901 // function constant. Functional correctness is ensured elsewhere. | 884 // function constant. Functional correctness is ensured elsewhere. |
| 902 | 885 |
| 903 | 886 |
| 904 TEST_F(JSTypedLoweringTest, JSInstanceOfSpecializationWithoutSmiCheck) { | 887 TEST_F(JSTypedLoweringTest, JSInstanceOfSpecializationWithoutSmiCheck) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context, | 937 Node* dummy = graph()->NewNode(javascript()->ToObject(), instanceOf, context, |
| 955 frame_state, effect, control); | 938 frame_state, effect, control); |
| 956 Reduction r = Reduce(instanceOf); | 939 Reduction r = Reduce(instanceOf); |
| 957 ASSERT_FALSE(r.Changed()); | 940 ASSERT_FALSE(r.Changed()); |
| 958 ASSERT_EQ(instanceOf, dummy->InputAt(0)); | 941 ASSERT_EQ(instanceOf, dummy->InputAt(0)); |
| 959 } | 942 } |
| 960 | 943 |
| 961 } // namespace compiler | 944 } // namespace compiler |
| 962 } // namespace internal | 945 } // namespace internal |
| 963 } // namespace v8 | 946 } // namespace v8 |
| OLD | NEW |