| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/compiler/common-operator.h" |
| #include "src/compiler/diamond.h" |
| #include "test/unittests/compiler/graph-unittest.h" |
| #include "test/unittests/compiler/node-test-utils.h" |
| #include "testing/gmock-support.h" |
| |
| using testing::AllOf; |
| using testing::Capture; |
| using testing::CaptureEq; |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| class DiamondTest : public GraphTest { |
| public: |
| DiamondTest() : GraphTest(5) {} |
| }; |
| |
| |
| TEST_F(DiamondTest, SimpleDiamond) { |
| Node* p = Parameter(0); |
| Diamond d(graph(), common(), p); |
| EXPECT_THAT(d.branch, IsBranch(p, graph()->start())); |
| EXPECT_THAT(d.if_true, IsIfTrue(d.branch)); |
| EXPECT_THAT(d.if_false, IsIfFalse(d.branch)); |
| EXPECT_THAT(d.merge, IsMerge(d.if_true, d.if_false)); |
| } |
| |
| |
| TEST_F(DiamondTest, DiamondChainDiamond) { |
| Node* p0 = Parameter(0); |
| Node* p1 = Parameter(1); |
| Diamond d0(graph(), common(), p0); |
| Diamond d1(graph(), common(), p1); |
| d1.Chain(d0); |
| EXPECT_THAT(d1.branch, IsBranch(p1, d0.merge)); |
| EXPECT_THAT(d0.branch, IsBranch(p0, graph()->start())); |
| } |
| |
| |
| TEST_F(DiamondTest, DiamondChainNode) { |
| Node* p1 = Parameter(1); |
| Diamond d1(graph(), common(), p1); |
| Node* other = graph()->NewNode(common()->Merge(0)); |
| d1.Chain(other); |
| EXPECT_THAT(d1.branch, IsBranch(p1, other)); |
| } |
| |
| |
| TEST_F(DiamondTest, DiamondChainN) { |
| Node* params[5] = {Parameter(0), Parameter(1), Parameter(2), Parameter(3), |
| Parameter(4)}; |
| Diamond d[5] = {Diamond(graph(), common(), params[0]), |
| Diamond(graph(), common(), params[1]), |
| Diamond(graph(), common(), params[2]), |
| Diamond(graph(), common(), params[3]), |
| Diamond(graph(), common(), params[4])}; |
| |
| for (int i = 1; i < 5; i++) { |
| d[i].Chain(d[i - 1]); |
| EXPECT_THAT(d[i].branch, IsBranch(params[i], d[i - 1].merge)); |
| } |
| } |
| |
| |
| TEST_F(DiamondTest, DiamondNested_true) { |
| Node* p0 = Parameter(0); |
| Node* p1 = Parameter(1); |
| Diamond d0(graph(), common(), p0); |
| Diamond d1(graph(), common(), p1); |
| |
| d1.Nest(d0, true); |
| |
| EXPECT_THAT(d0.branch, IsBranch(p0, graph()->start())); |
| EXPECT_THAT(d0.if_true, IsIfTrue(d0.branch)); |
| EXPECT_THAT(d0.if_false, IsIfFalse(d0.branch)); |
| EXPECT_THAT(d0.merge, IsMerge(d1.merge, d0.if_false)); |
| |
| EXPECT_THAT(d1.branch, IsBranch(p1, d0.if_true)); |
| EXPECT_THAT(d1.if_true, IsIfTrue(d1.branch)); |
| EXPECT_THAT(d1.if_false, IsIfFalse(d1.branch)); |
| EXPECT_THAT(d1.merge, IsMerge(d1.if_true, d1.if_false)); |
| } |
| |
| |
| TEST_F(DiamondTest, DiamondNested_false) { |
| Node* p0 = Parameter(0); |
| Node* p1 = Parameter(1); |
| Diamond d0(graph(), common(), p0); |
| Diamond d1(graph(), common(), p1); |
| |
| d1.Nest(d0, false); |
| |
| EXPECT_THAT(d0.branch, IsBranch(p0, graph()->start())); |
| EXPECT_THAT(d0.if_true, IsIfTrue(d0.branch)); |
| EXPECT_THAT(d0.if_false, IsIfFalse(d0.branch)); |
| EXPECT_THAT(d0.merge, IsMerge(d0.if_true, d1.merge)); |
| |
| EXPECT_THAT(d1.branch, IsBranch(p1, d0.if_false)); |
| EXPECT_THAT(d1.if_true, IsIfTrue(d1.branch)); |
| EXPECT_THAT(d1.if_false, IsIfFalse(d1.branch)); |
| EXPECT_THAT(d1.merge, IsMerge(d1.if_true, d1.if_false)); |
| } |
| |
| |
| TEST_F(DiamondTest, DiamondPhis) { |
| Node* p0 = Parameter(0); |
| Node* p1 = Parameter(1); |
| Node* p2 = Parameter(2); |
| Diamond d(graph(), common(), p0); |
| |
| MachineRepresentation types[] = {MachineRepresentation::kTagged, |
| MachineRepresentation::kWord32}; |
| |
| for (size_t i = 0; i < arraysize(types); i++) { |
| Node* phi = d.Phi(types[i], p1, p2); |
| |
| EXPECT_THAT(d.branch, IsBranch(p0, graph()->start())); |
| EXPECT_THAT(d.if_true, IsIfTrue(d.branch)); |
| EXPECT_THAT(d.if_false, IsIfFalse(d.branch)); |
| EXPECT_THAT(d.merge, IsMerge(d.if_true, d.if_false)); |
| EXPECT_THAT(phi, IsPhi(types[i], p1, p2, d.merge)); |
| } |
| } |
| |
| |
| TEST_F(DiamondTest, BranchHint) { |
| Diamond dn(graph(), common(), Parameter(0)); |
| CHECK_EQ(BranchHint::kNone, BranchHintOf(dn.branch->op())); |
| |
| Diamond dt(graph(), common(), Parameter(0), BranchHint::kTrue); |
| CHECK_EQ(BranchHint::kTrue, BranchHintOf(dt.branch->op())); |
| |
| Diamond df(graph(), common(), Parameter(0), BranchHint::kFalse); |
| CHECK_EQ(BranchHint::kFalse, BranchHintOf(df.branch->op())); |
| } |
| |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |