| 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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 #include "src/compiler/graph.h" | 6 #include "src/compiler/graph.h" |
| 7 #include "src/compiler/node.h" | 7 #include "src/compiler/node.h" |
| 8 #include "src/compiler/operator.h" | 8 #include "src/compiler/operator.h" |
| 9 #include "test/unittests/compiler/graph-reducer-unittest.h" | 9 #include "test/unittests/compiler/graph-reducer-unittest.h" |
| 10 #include "test/unittests/test-utils.h" | 10 #include "test/unittests/test-utils.h" |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 | 517 |
| 518 | 518 |
| 519 TEST_F(GraphReducerTest, ReduceInPlace1) { | 519 TEST_F(GraphReducerTest, ReduceInPlace1) { |
| 520 Node* n1 = graph()->NewNode(&kOpA0); | 520 Node* n1 = graph()->NewNode(&kOpA0); |
| 521 Node* end = graph()->NewNode(&kOpA1, n1); | 521 Node* end = graph()->NewNode(&kOpA1, n1); |
| 522 graph()->SetEnd(end); | 522 graph()->SetEnd(end); |
| 523 | 523 |
| 524 // Tests A* => B* with in-place updates. | 524 // Tests A* => B* with in-place updates. |
| 525 InPlaceABReducer r; | 525 InPlaceABReducer r; |
| 526 for (int i = 0; i < 3; i++) { | 526 for (int i = 0; i < 3; i++) { |
| 527 int before = graph()->NodeCount(); | 527 size_t before = graph()->NodeCount(); |
| 528 ReduceGraph(&r); | 528 ReduceGraph(&r); |
| 529 EXPECT_EQ(before, graph()->NodeCount()); | 529 EXPECT_EQ(before, graph()->NodeCount()); |
| 530 EXPECT_EQ(&kOpB0, n1->op()); | 530 EXPECT_EQ(&kOpB0, n1->op()); |
| 531 EXPECT_EQ(&kOpB1, end->op()); | 531 EXPECT_EQ(&kOpB1, end->op()); |
| 532 EXPECT_EQ(n1, end->InputAt(0)); | 532 EXPECT_EQ(n1, end->InputAt(0)); |
| 533 } | 533 } |
| 534 } | 534 } |
| 535 | 535 |
| 536 | 536 |
| 537 TEST_F(GraphReducerTest, ReduceInPlace2) { | 537 TEST_F(GraphReducerTest, ReduceInPlace2) { |
| 538 Node* n1 = graph()->NewNode(&kOpA0); | 538 Node* n1 = graph()->NewNode(&kOpA0); |
| 539 Node* n2 = graph()->NewNode(&kOpA1, n1); | 539 Node* n2 = graph()->NewNode(&kOpA1, n1); |
| 540 Node* n3 = graph()->NewNode(&kOpA1, n1); | 540 Node* n3 = graph()->NewNode(&kOpA1, n1); |
| 541 Node* end = graph()->NewNode(&kOpA2, n2, n3); | 541 Node* end = graph()->NewNode(&kOpA2, n2, n3); |
| 542 graph()->SetEnd(end); | 542 graph()->SetEnd(end); |
| 543 | 543 |
| 544 // Tests A* => B* with in-place updates. | 544 // Tests A* => B* with in-place updates. |
| 545 InPlaceABReducer r; | 545 InPlaceABReducer r; |
| 546 for (int i = 0; i < 3; i++) { | 546 for (int i = 0; i < 3; i++) { |
| 547 int before = graph()->NodeCount(); | 547 size_t before = graph()->NodeCount(); |
| 548 ReduceGraph(&r); | 548 ReduceGraph(&r); |
| 549 EXPECT_EQ(before, graph()->NodeCount()); | 549 EXPECT_EQ(before, graph()->NodeCount()); |
| 550 EXPECT_EQ(&kOpB0, n1->op()); | 550 EXPECT_EQ(&kOpB0, n1->op()); |
| 551 EXPECT_EQ(&kOpB1, n2->op()); | 551 EXPECT_EQ(&kOpB1, n2->op()); |
| 552 EXPECT_EQ(n1, n2->InputAt(0)); | 552 EXPECT_EQ(n1, n2->InputAt(0)); |
| 553 EXPECT_EQ(&kOpB1, n3->op()); | 553 EXPECT_EQ(&kOpB1, n3->op()); |
| 554 EXPECT_EQ(n1, n3->InputAt(0)); | 554 EXPECT_EQ(n1, n3->InputAt(0)); |
| 555 EXPECT_EQ(&kOpB2, end->op()); | 555 EXPECT_EQ(&kOpB2, end->op()); |
| 556 EXPECT_EQ(n2, end->InputAt(0)); | 556 EXPECT_EQ(n2, end->InputAt(0)); |
| 557 EXPECT_EQ(n3, end->InputAt(1)); | 557 EXPECT_EQ(n3, end->InputAt(1)); |
| 558 } | 558 } |
| 559 } | 559 } |
| 560 | 560 |
| 561 | 561 |
| 562 TEST_F(GraphReducerTest, ReduceNew1) { | 562 TEST_F(GraphReducerTest, ReduceNew1) { |
| 563 Node* n1 = graph()->NewNode(&kOpA0); | 563 Node* n1 = graph()->NewNode(&kOpA0); |
| 564 Node* n2 = graph()->NewNode(&kOpA1, n1); | 564 Node* n2 = graph()->NewNode(&kOpA1, n1); |
| 565 Node* n3 = graph()->NewNode(&kOpA1, n1); | 565 Node* n3 = graph()->NewNode(&kOpA1, n1); |
| 566 Node* end = graph()->NewNode(&kOpA2, n2, n3); | 566 Node* end = graph()->NewNode(&kOpA2, n2, n3); |
| 567 graph()->SetEnd(end); | 567 graph()->SetEnd(end); |
| 568 | 568 |
| 569 NewABReducer r(graph()); | 569 NewABReducer r(graph()); |
| 570 // Tests A* => B* while creating new nodes. | 570 // Tests A* => B* while creating new nodes. |
| 571 for (int i = 0; i < 3; i++) { | 571 for (int i = 0; i < 3; i++) { |
| 572 int before = graph()->NodeCount(); | 572 size_t before = graph()->NodeCount(); |
| 573 ReduceGraph(&r); | 573 ReduceGraph(&r); |
| 574 if (i == 0) { | 574 if (i == 0) { |
| 575 EXPECT_NE(before, graph()->NodeCount()); | 575 EXPECT_NE(before, graph()->NodeCount()); |
| 576 } else { | 576 } else { |
| 577 EXPECT_EQ(before, graph()->NodeCount()); | 577 EXPECT_EQ(before, graph()->NodeCount()); |
| 578 } | 578 } |
| 579 Node* nend = graph()->end(); | 579 Node* nend = graph()->end(); |
| 580 EXPECT_NE(end, nend); // end() should be updated too. | 580 EXPECT_NE(end, nend); // end() should be updated too. |
| 581 | 581 |
| 582 Node* nn2 = nend->InputAt(0); | 582 Node* nn2 = nend->InputAt(0); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 | 636 |
| 637 TEST_F(GraphReducerTest, Forwarding1) { | 637 TEST_F(GraphReducerTest, Forwarding1) { |
| 638 Node* n1 = graph()->NewNode(&kOpA0); | 638 Node* n1 = graph()->NewNode(&kOpA0); |
| 639 Node* end = graph()->NewNode(&kOpA1, n1); | 639 Node* end = graph()->NewNode(&kOpA1, n1); |
| 640 graph()->SetEnd(end); | 640 graph()->SetEnd(end); |
| 641 | 641 |
| 642 A1Forwarder r; | 642 A1Forwarder r; |
| 643 | 643 |
| 644 // Tests A1(x) => x | 644 // Tests A1(x) => x |
| 645 for (int i = 0; i < 3; i++) { | 645 for (int i = 0; i < 3; i++) { |
| 646 int before = graph()->NodeCount(); | 646 size_t before = graph()->NodeCount(); |
| 647 ReduceGraph(&r); | 647 ReduceGraph(&r); |
| 648 EXPECT_EQ(before, graph()->NodeCount()); | 648 EXPECT_EQ(before, graph()->NodeCount()); |
| 649 EXPECT_EQ(&kOpA0, n1->op()); | 649 EXPECT_EQ(&kOpA0, n1->op()); |
| 650 EXPECT_EQ(n1, graph()->end()); | 650 EXPECT_EQ(n1, graph()->end()); |
| 651 } | 651 } |
| 652 } | 652 } |
| 653 | 653 |
| 654 | 654 |
| 655 TEST_F(GraphReducerTest, Forwarding2) { | 655 TEST_F(GraphReducerTest, Forwarding2) { |
| 656 Node* n1 = graph()->NewNode(&kOpA0); | 656 Node* n1 = graph()->NewNode(&kOpA0); |
| 657 Node* n2 = graph()->NewNode(&kOpA1, n1); | 657 Node* n2 = graph()->NewNode(&kOpA1, n1); |
| 658 Node* n3 = graph()->NewNode(&kOpA1, n1); | 658 Node* n3 = graph()->NewNode(&kOpA1, n1); |
| 659 Node* end = graph()->NewNode(&kOpA2, n2, n3); | 659 Node* end = graph()->NewNode(&kOpA2, n2, n3); |
| 660 graph()->SetEnd(end); | 660 graph()->SetEnd(end); |
| 661 | 661 |
| 662 A1Forwarder r; | 662 A1Forwarder r; |
| 663 | 663 |
| 664 // Tests reducing A2(A1(x), A1(y)) => A2(x, y). | 664 // Tests reducing A2(A1(x), A1(y)) => A2(x, y). |
| 665 for (int i = 0; i < 3; i++) { | 665 for (int i = 0; i < 3; i++) { |
| 666 int before = graph()->NodeCount(); | 666 size_t before = graph()->NodeCount(); |
| 667 ReduceGraph(&r); | 667 ReduceGraph(&r); |
| 668 EXPECT_EQ(before, graph()->NodeCount()); | 668 EXPECT_EQ(before, graph()->NodeCount()); |
| 669 EXPECT_EQ(&kOpA0, n1->op()); | 669 EXPECT_EQ(&kOpA0, n1->op()); |
| 670 EXPECT_EQ(n1, end->InputAt(0)); | 670 EXPECT_EQ(n1, end->InputAt(0)); |
| 671 EXPECT_EQ(n1, end->InputAt(1)); | 671 EXPECT_EQ(n1, end->InputAt(1)); |
| 672 EXPECT_EQ(&kOpA2, end->op()); | 672 EXPECT_EQ(&kOpA2, end->op()); |
| 673 EXPECT_EQ(0, n2->UseCount()); | 673 EXPECT_EQ(0, n2->UseCount()); |
| 674 EXPECT_EQ(0, n3->UseCount()); | 674 EXPECT_EQ(0, n3->UseCount()); |
| 675 } | 675 } |
| 676 } | 676 } |
| 677 | 677 |
| 678 | 678 |
| 679 TEST_F(GraphReducerTest, Forwarding3) { | 679 TEST_F(GraphReducerTest, Forwarding3) { |
| 680 // Tests reducing a chain of A1(A1(A1(A1(x)))) => x. | 680 // Tests reducing a chain of A1(A1(A1(A1(x)))) => x. |
| 681 for (int i = 0; i < 8; i++) { | 681 for (int i = 0; i < 8; i++) { |
| 682 Node* n1 = graph()->NewNode(&kOpA0); | 682 Node* n1 = graph()->NewNode(&kOpA0); |
| 683 Node* end = n1; | 683 Node* end = n1; |
| 684 for (int j = 0; j < i; j++) { | 684 for (int j = 0; j < i; j++) { |
| 685 end = graph()->NewNode(&kOpA1, end); | 685 end = graph()->NewNode(&kOpA1, end); |
| 686 } | 686 } |
| 687 graph()->SetEnd(end); | 687 graph()->SetEnd(end); |
| 688 | 688 |
| 689 A1Forwarder r; | 689 A1Forwarder r; |
| 690 | 690 |
| 691 for (int i = 0; i < 3; i++) { | 691 for (size_t i = 0; i < 3; i++) { |
| 692 int before = graph()->NodeCount(); | 692 size_t before = graph()->NodeCount(); |
| 693 ReduceGraph(&r); | 693 ReduceGraph(&r); |
| 694 EXPECT_EQ(before, graph()->NodeCount()); | 694 EXPECT_EQ(before, graph()->NodeCount()); |
| 695 EXPECT_EQ(&kOpA0, n1->op()); | 695 EXPECT_EQ(&kOpA0, n1->op()); |
| 696 EXPECT_EQ(n1, graph()->end()); | 696 EXPECT_EQ(n1, graph()->end()); |
| 697 } | 697 } |
| 698 } | 698 } |
| 699 } | 699 } |
| 700 | 700 |
| 701 | 701 |
| 702 TEST_F(GraphReducerTest, ReduceForward1) { | 702 TEST_F(GraphReducerTest, ReduceForward1) { |
| 703 Node* n1 = graph()->NewNode(&kOpA0); | 703 Node* n1 = graph()->NewNode(&kOpA0); |
| 704 Node* n2 = graph()->NewNode(&kOpA1, n1); | 704 Node* n2 = graph()->NewNode(&kOpA1, n1); |
| 705 Node* n3 = graph()->NewNode(&kOpA1, n1); | 705 Node* n3 = graph()->NewNode(&kOpA1, n1); |
| 706 Node* end = graph()->NewNode(&kOpA2, n2, n3); | 706 Node* end = graph()->NewNode(&kOpA2, n2, n3); |
| 707 graph()->SetEnd(end); | 707 graph()->SetEnd(end); |
| 708 | 708 |
| 709 InPlaceABReducer r; | 709 InPlaceABReducer r; |
| 710 B1Forwarder f; | 710 B1Forwarder f; |
| 711 | 711 |
| 712 // Tests first reducing A => B, then B1(x) => x. | 712 // Tests first reducing A => B, then B1(x) => x. |
| 713 for (int i = 0; i < 3; i++) { | 713 for (size_t i = 0; i < 3; i++) { |
| 714 int before = graph()->NodeCount(); | 714 size_t before = graph()->NodeCount(); |
| 715 ReduceGraph(&r, &f); | 715 ReduceGraph(&r, &f); |
| 716 EXPECT_EQ(before, graph()->NodeCount()); | 716 EXPECT_EQ(before, graph()->NodeCount()); |
| 717 EXPECT_EQ(&kOpB0, n1->op()); | 717 EXPECT_EQ(&kOpB0, n1->op()); |
| 718 EXPECT_TRUE(n2->IsDead()); | 718 EXPECT_TRUE(n2->IsDead()); |
| 719 EXPECT_EQ(n1, end->InputAt(0)); | 719 EXPECT_EQ(n1, end->InputAt(0)); |
| 720 EXPECT_TRUE(n3->IsDead()); | 720 EXPECT_TRUE(n3->IsDead()); |
| 721 EXPECT_EQ(n1, end->InputAt(0)); | 721 EXPECT_EQ(n1, end->InputAt(0)); |
| 722 EXPECT_EQ(&kOpB2, end->op()); | 722 EXPECT_EQ(&kOpB2, end->op()); |
| 723 EXPECT_EQ(0, n2->UseCount()); | 723 EXPECT_EQ(0, n2->UseCount()); |
| 724 EXPECT_EQ(0, n3->UseCount()); | 724 EXPECT_EQ(0, n3->UseCount()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 736 | 736 |
| 737 if (i == 0) end = graph()->NewNode(&kOpA2, n2, n3); | 737 if (i == 0) end = graph()->NewNode(&kOpA2, n2, n3); |
| 738 if (i == 1) end = graph()->NewNode(&kOpA2, n3, n2); | 738 if (i == 1) end = graph()->NewNode(&kOpA2, n3, n2); |
| 739 if (i == 2) end = graph()->NewNode(&kOpA2, n2, n1); | 739 if (i == 2) end = graph()->NewNode(&kOpA2, n2, n1); |
| 740 if (i == 3) end = graph()->NewNode(&kOpA2, n1, n2); | 740 if (i == 3) end = graph()->NewNode(&kOpA2, n1, n2); |
| 741 if (i == 4) end = graph()->NewNode(&kOpA2, n3, n1); | 741 if (i == 4) end = graph()->NewNode(&kOpA2, n3, n1); |
| 742 if (i == 5) end = graph()->NewNode(&kOpA2, n1, n3); | 742 if (i == 5) end = graph()->NewNode(&kOpA2, n1, n3); |
| 743 | 743 |
| 744 graph()->SetEnd(end); | 744 graph()->SetEnd(end); |
| 745 | 745 |
| 746 int before = graph()->NodeCount(); | 746 size_t before = graph()->NodeCount(); |
| 747 ReduceGraph(&r); | 747 ReduceGraph(&r); |
| 748 EXPECT_EQ(before, graph()->NodeCount()); | 748 EXPECT_EQ(before, graph()->NodeCount()); |
| 749 EXPECT_EQ(&kOpA0, n1->op()); | 749 EXPECT_EQ(&kOpA0, n1->op()); |
| 750 EXPECT_EQ(&kOpA1, n2->op()); | 750 EXPECT_EQ(&kOpA1, n2->op()); |
| 751 EXPECT_EQ(&kOpA1, n3->op()); | 751 EXPECT_EQ(&kOpA1, n3->op()); |
| 752 EXPECT_EQ(&kOpA2, end->op()); | 752 EXPECT_EQ(&kOpA2, end->op()); |
| 753 EXPECT_EQ(end, graph()->end()); | 753 EXPECT_EQ(end, graph()->end()); |
| 754 EXPECT_LE(end->InputAt(0)->id(), end->InputAt(1)->id()); | 754 EXPECT_LE(end->InputAt(0)->id(), end->InputAt(1)->id()); |
| 755 } | 755 } |
| 756 } | 756 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 // rerun for changed nodes. | 831 // rerun for changed nodes. |
| 832 for (int i = 0; i < 2; i++) { | 832 for (int i = 0; i < 2; i++) { |
| 833 Node* n1 = graph()->NewNode(&kOpA0); | 833 Node* n1 = graph()->NewNode(&kOpA0); |
| 834 Node* end = graph()->NewNode(&kOpA1, n1); | 834 Node* end = graph()->NewNode(&kOpA1, n1); |
| 835 graph()->SetEnd(end); | 835 graph()->SetEnd(end); |
| 836 | 836 |
| 837 InPlaceABReducer abr; | 837 InPlaceABReducer abr; |
| 838 InPlaceBCReducer bcr; | 838 InPlaceBCReducer bcr; |
| 839 | 839 |
| 840 // Tests A* => C* with in-place updates. | 840 // Tests A* => C* with in-place updates. |
| 841 for (int j = 0; j < 3; j++) { | 841 for (size_t j = 0; j < 3; j++) { |
| 842 int before = graph()->NodeCount(); | 842 size_t before = graph()->NodeCount(); |
| 843 if (i == 0) { | 843 if (i == 0) { |
| 844 ReduceGraph(&abr, &bcr); | 844 ReduceGraph(&abr, &bcr); |
| 845 } else { | 845 } else { |
| 846 ReduceGraph(&bcr, &abr); | 846 ReduceGraph(&bcr, &abr); |
| 847 } | 847 } |
| 848 | 848 |
| 849 EXPECT_EQ(before, graph()->NodeCount()); | 849 EXPECT_EQ(before, graph()->NodeCount()); |
| 850 EXPECT_EQ(&kOpC0, n1->op()); | 850 EXPECT_EQ(&kOpC0, n1->op()); |
| 851 EXPECT_EQ(&kOpC1, end->op()); | 851 EXPECT_EQ(&kOpC1, end->op()); |
| 852 EXPECT_EQ(n1, end->InputAt(0)); | 852 EXPECT_EQ(n1, end->InputAt(0)); |
| 853 } | 853 } |
| 854 } | 854 } |
| 855 } | 855 } |
| 856 | 856 |
| 857 } // namespace compiler | 857 } // namespace compiler |
| 858 } // namespace internal | 858 } // namespace internal |
| 859 } // namespace v8 | 859 } // namespace v8 |
| OLD | NEW |