diff options
Diffstat (limited to 'deps/v8/test/unittests/compiler/common-operator-reducer-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/compiler/common-operator-reducer-unittest.cc | 200 |
1 files changed, 177 insertions, 23 deletions
diff --git a/deps/v8/test/unittests/compiler/common-operator-reducer-unittest.cc b/deps/v8/test/unittests/compiler/common-operator-reducer-unittest.cc index 3b60e5b9bd..d6822e8b09 100644 --- a/deps/v8/test/unittests/compiler/common-operator-reducer-unittest.cc +++ b/deps/v8/test/unittests/compiler/common-operator-reducer-unittest.cc @@ -20,7 +20,7 @@ class CommonOperatorReducerTest : public GraphTest { public: explicit CommonOperatorReducerTest(int num_parameters = 1) : GraphTest(num_parameters), machine_(zone()) {} - ~CommonOperatorReducerTest() OVERRIDE {} + ~CommonOperatorReducerTest() override {} protected: Reduction Reduce(Node* node, MachineOperatorBuilder::Flags flags = @@ -108,7 +108,88 @@ TEST_F(CommonOperatorReducerTest, RedundantPhi) { } -TEST_F(CommonOperatorReducerTest, PhiToFloat64MaxOrFloat64Min) { +TEST_F(CommonOperatorReducerTest, PhiToFloat32Abs) { + Node* p0 = Parameter(0); + Node* c0 = Float32Constant(0.0); + Node* check = graph()->NewNode(machine()->Float32LessThan(), c0, p0); + Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); + Node* if_true = graph()->NewNode(common()->IfTrue(), branch); + Node* vtrue = p0; + Node* if_false = graph()->NewNode(common()->IfFalse(), branch); + Node* vfalse = graph()->NewNode(machine()->Float32Sub(), c0, p0); + Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); + Node* phi = + graph()->NewNode(common()->Phi(kMachFloat32, 2), vtrue, vfalse, merge); + Reduction r = Reduce(phi); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat32Abs(p0)); +} + + +TEST_F(CommonOperatorReducerTest, PhiToFloat64Abs) { + Node* p0 = Parameter(0); + Node* c0 = Float64Constant(0.0); + Node* check = graph()->NewNode(machine()->Float64LessThan(), c0, p0); + Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); + Node* if_true = graph()->NewNode(common()->IfTrue(), branch); + Node* vtrue = p0; + Node* if_false = graph()->NewNode(common()->IfFalse(), branch); + Node* vfalse = graph()->NewNode(machine()->Float64Sub(), c0, p0); + Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); + Node* phi = + graph()->NewNode(common()->Phi(kMachFloat64, 2), vtrue, vfalse, merge); + Reduction r = Reduce(phi); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat64Abs(p0)); +} + + +TEST_F(CommonOperatorReducerTest, PhiToFloat32Max) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); + Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); + Node* if_true = graph()->NewNode(common()->IfTrue(), branch); + Node* if_false = graph()->NewNode(common()->IfFalse(), branch); + Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); + Node* phi = graph()->NewNode(common()->Phi(kMachFloat32, 2), p1, p0, merge); + Reduction r = Reduce(phi, MachineOperatorBuilder::kFloat32Max); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat32Max(p1, p0)); +} + + +TEST_F(CommonOperatorReducerTest, PhiToFloat64Max) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); + Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); + Node* if_true = graph()->NewNode(common()->IfTrue(), branch); + Node* if_false = graph()->NewNode(common()->IfFalse(), branch); + Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); + Node* phi = graph()->NewNode(common()->Phi(kMachFloat64, 2), p1, p0, merge); + Reduction r = Reduce(phi, MachineOperatorBuilder::kFloat64Max); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat64Max(p1, p0)); +} + + +TEST_F(CommonOperatorReducerTest, PhiToFloat32Min) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); + Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); + Node* if_true = graph()->NewNode(common()->IfTrue(), branch); + Node* if_false = graph()->NewNode(common()->IfFalse(), branch); + Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); + Node* phi = graph()->NewNode(common()->Phi(kMachFloat32, 2), p0, p1, merge); + Reduction r = Reduce(phi, MachineOperatorBuilder::kFloat32Min); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat32Min(p0, p1)); +} + + +TEST_F(CommonOperatorReducerTest, PhiToFloat64Min) { Node* p0 = Parameter(0); Node* p1 = Parameter(1); Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); @@ -116,16 +197,10 @@ TEST_F(CommonOperatorReducerTest, PhiToFloat64MaxOrFloat64Min) { Node* if_true = graph()->NewNode(common()->IfTrue(), branch); Node* if_false = graph()->NewNode(common()->IfFalse(), branch); Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); - Reduction r1 = - Reduce(graph()->NewNode(common()->Phi(kMachFloat64, 2), p1, p0, merge), - MachineOperatorBuilder::kFloat64Max); - ASSERT_TRUE(r1.Changed()); - EXPECT_THAT(r1.replacement(), IsFloat64Max(p1, p0)); - Reduction r2 = - Reduce(graph()->NewNode(common()->Phi(kMachFloat64, 2), p0, p1, merge), - MachineOperatorBuilder::kFloat64Min); - ASSERT_TRUE(r2.Changed()); - EXPECT_THAT(r2.replacement(), IsFloat64Min(p0, p1)); + Node* phi = graph()->NewNode(common()->Phi(kMachFloat64, 2), p0, p1, merge); + Reduction r = Reduce(phi, MachineOperatorBuilder::kFloat64Min); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat64Min(p0, p1)); } @@ -146,20 +221,99 @@ TEST_F(CommonOperatorReducerTest, RedundantSelect) { } -TEST_F(CommonOperatorReducerTest, SelectToFloat64MaxOrFloat64Min) { +TEST_F(CommonOperatorReducerTest, SelectWithFalseConstant) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* select = graph()->NewNode(common()->Select(kMachAnyTagged), + FalseConstant(), p0, p1); + Reduction r = Reduce(select); + ASSERT_TRUE(r.Changed()); + EXPECT_EQ(p1, r.replacement()); +} + + +TEST_F(CommonOperatorReducerTest, SelectWithTrueConstant) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* select = graph()->NewNode(common()->Select(kMachAnyTagged), + TrueConstant(), p0, p1); + Reduction r = Reduce(select); + ASSERT_TRUE(r.Changed()); + EXPECT_EQ(p0, r.replacement()); +} + + +TEST_F(CommonOperatorReducerTest, SelectToFloat32Abs) { + Node* p0 = Parameter(0); + Node* c0 = Float32Constant(0.0); + Node* check = graph()->NewNode(machine()->Float32LessThan(), c0, p0); + Node* select = + graph()->NewNode(common()->Select(kMachFloat32), check, p0, + graph()->NewNode(machine()->Float32Sub(), c0, p0)); + Reduction r = Reduce(select); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat32Abs(p0)); +} + + +TEST_F(CommonOperatorReducerTest, SelectToFloat64Abs) { + Node* p0 = Parameter(0); + Node* c0 = Float64Constant(0.0); + Node* check = graph()->NewNode(machine()->Float64LessThan(), c0, p0); + Node* select = + graph()->NewNode(common()->Select(kMachFloat64), check, p0, + graph()->NewNode(machine()->Float64Sub(), c0, p0)); + Reduction r = Reduce(select); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat64Abs(p0)); +} + + +TEST_F(CommonOperatorReducerTest, SelectToFloat32Max) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); + Node* select = + graph()->NewNode(common()->Select(kMachFloat32), check, p1, p0); + Reduction r = Reduce(select, MachineOperatorBuilder::kFloat32Max); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat32Max(p1, p0)); +} + + +TEST_F(CommonOperatorReducerTest, SelectToFloat64Max) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); + Node* select = + graph()->NewNode(common()->Select(kMachFloat64), check, p1, p0); + Reduction r = Reduce(select, MachineOperatorBuilder::kFloat64Max); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat64Max(p1, p0)); +} + + +TEST_F(CommonOperatorReducerTest, SelectToFloat32Min) { + Node* p0 = Parameter(0); + Node* p1 = Parameter(1); + Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); + Node* select = + graph()->NewNode(common()->Select(kMachFloat32), check, p0, p1); + Reduction r = Reduce(select, MachineOperatorBuilder::kFloat32Min); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat32Min(p0, p1)); +} + + +TEST_F(CommonOperatorReducerTest, SelectToFloat64Min) { Node* p0 = Parameter(0); Node* p1 = Parameter(1); Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); - Reduction r1 = - Reduce(graph()->NewNode(common()->Select(kMachFloat64), check, p1, p0), - MachineOperatorBuilder::kFloat64Max); - ASSERT_TRUE(r1.Changed()); - EXPECT_THAT(r1.replacement(), IsFloat64Max(p1, p0)); - Reduction r2 = - Reduce(graph()->NewNode(common()->Select(kMachFloat64), check, p0, p1), - MachineOperatorBuilder::kFloat64Min); - ASSERT_TRUE(r2.Changed()); - EXPECT_THAT(r2.replacement(), IsFloat64Min(p0, p1)); + Node* select = + graph()->NewNode(common()->Select(kMachFloat64), check, p0, p1); + Reduction r = Reduce(select, MachineOperatorBuilder::kFloat64Min); + ASSERT_TRUE(r.Changed()); + EXPECT_THAT(r.replacement(), IsFloat64Min(p0, p1)); } } // namespace compiler |