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/common-operator-reducer.h" | 6 #include "src/compiler/common-operator-reducer.h" |
| 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/js-operator.h" |
| 9 #include "src/compiler/machine-operator.h" |
7 #include "src/compiler/machine-type.h" | 10 #include "src/compiler/machine-type.h" |
8 #include "src/compiler/operator.h" | 11 #include "src/compiler/operator.h" |
9 #include "test/unittests/compiler/graph-unittest.h" | 12 #include "test/unittests/compiler/graph-unittest.h" |
| 13 #include "test/unittests/compiler/node-test-utils.h" |
10 | 14 |
11 namespace v8 { | 15 namespace v8 { |
12 namespace internal { | 16 namespace internal { |
13 namespace compiler { | 17 namespace compiler { |
14 | 18 |
15 class CommonOperatorReducerTest : public GraphTest { | 19 class CommonOperatorReducerTest : public GraphTest { |
16 public: | 20 public: |
17 explicit CommonOperatorReducerTest(int num_parameters = 1) | 21 explicit CommonOperatorReducerTest(int num_parameters = 1) |
18 : GraphTest(num_parameters) {} | 22 : GraphTest(num_parameters), machine_(zone()) {} |
19 ~CommonOperatorReducerTest() OVERRIDE {} | 23 ~CommonOperatorReducerTest() OVERRIDE {} |
20 | 24 |
21 protected: | 25 protected: |
22 Reduction Reduce(Node* node) { | 26 Reduction Reduce(Node* node, MachineOperatorBuilder::Flags flags = |
23 CommonOperatorReducer reducer; | 27 MachineOperatorBuilder::kNoFlags) { |
| 28 JSOperatorBuilder javascript(zone()); |
| 29 MachineOperatorBuilder machine(zone(), kMachPtr, flags); |
| 30 JSGraph jsgraph(isolate(), graph(), common(), &javascript, &machine); |
| 31 CommonOperatorReducer reducer(&jsgraph); |
24 return reducer.Reduce(node); | 32 return reducer.Reduce(node); |
25 } | 33 } |
| 34 |
| 35 MachineOperatorBuilder* machine() { return &machine_; } |
| 36 |
| 37 private: |
| 38 MachineOperatorBuilder machine_; |
26 }; | 39 }; |
27 | 40 |
28 | 41 |
29 namespace { | 42 namespace { |
30 | 43 |
31 const BranchHint kBranchHints[] = {BranchHint::kNone, BranchHint::kFalse, | 44 const BranchHint kBranchHints[] = {BranchHint::kNone, BranchHint::kFalse, |
32 BranchHint::kTrue}; | 45 BranchHint::kTrue}; |
33 | 46 |
34 | 47 |
35 const MachineType kMachineTypes[] = { | 48 const MachineType kMachineTypes[] = { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 | 84 |
72 | 85 |
73 TEST_F(CommonOperatorReducerTest, RedundantPhi) { | 86 TEST_F(CommonOperatorReducerTest, RedundantPhi) { |
74 const int kMaxInputs = 64; | 87 const int kMaxInputs = 64; |
75 Node* inputs[kMaxInputs]; | 88 Node* inputs[kMaxInputs]; |
76 Node* const input = graph()->NewNode(&kOp0); | 89 Node* const input = graph()->NewNode(&kOp0); |
77 TRACED_FORRANGE(int, input_count, 2, kMaxInputs - 1) { | 90 TRACED_FORRANGE(int, input_count, 2, kMaxInputs - 1) { |
78 int const value_input_count = input_count - 1; | 91 int const value_input_count = input_count - 1; |
79 TRACED_FOREACH(MachineType, type, kMachineTypes) { | 92 TRACED_FOREACH(MachineType, type, kMachineTypes) { |
80 for (int i = 0; i < value_input_count; ++i) { | 93 for (int i = 0; i < value_input_count; ++i) { |
| 94 inputs[i] = graph()->start(); |
| 95 } |
| 96 Node* merge = graph()->NewNode(common()->Merge(value_input_count), |
| 97 value_input_count, inputs); |
| 98 for (int i = 0; i < value_input_count; ++i) { |
81 inputs[i] = input; | 99 inputs[i] = input; |
82 } | 100 } |
83 inputs[value_input_count] = graph()->start(); | 101 inputs[value_input_count] = merge; |
84 Reduction r = Reduce(graph()->NewNode( | 102 Reduction r = Reduce(graph()->NewNode( |
85 common()->Phi(type, value_input_count), input_count, inputs)); | 103 common()->Phi(type, value_input_count), input_count, inputs)); |
86 ASSERT_TRUE(r.Changed()); | 104 ASSERT_TRUE(r.Changed()); |
87 EXPECT_EQ(input, r.replacement()); | 105 EXPECT_EQ(input, r.replacement()); |
88 } | 106 } |
89 } | 107 } |
90 } | 108 } |
91 | 109 |
92 | 110 |
| 111 TEST_F(CommonOperatorReducerTest, PhiToFloat64MaxOrFloat64Min) { |
| 112 Node* p0 = Parameter(0); |
| 113 Node* p1 = Parameter(1); |
| 114 Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); |
| 115 Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); |
| 116 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
| 117 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); |
| 118 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); |
| 119 Reduction r1 = |
| 120 Reduce(graph()->NewNode(common()->Phi(kMachFloat64, 2), p1, p0, merge), |
| 121 MachineOperatorBuilder::kFloat64Max); |
| 122 ASSERT_TRUE(r1.Changed()); |
| 123 EXPECT_THAT(r1.replacement(), IsFloat64Max(p1, p0)); |
| 124 Reduction r2 = |
| 125 Reduce(graph()->NewNode(common()->Phi(kMachFloat64, 2), p0, p1, merge), |
| 126 MachineOperatorBuilder::kFloat64Min); |
| 127 ASSERT_TRUE(r2.Changed()); |
| 128 EXPECT_THAT(r2.replacement(), IsFloat64Min(p0, p1)); |
| 129 } |
| 130 |
| 131 |
93 // ----------------------------------------------------------------------------- | 132 // ----------------------------------------------------------------------------- |
94 // Select | 133 // Select |
95 | 134 |
96 | 135 |
97 TEST_F(CommonOperatorReducerTest, RedundantSelect) { | 136 TEST_F(CommonOperatorReducerTest, RedundantSelect) { |
98 Node* const input = graph()->NewNode(&kOp0); | 137 Node* const input = graph()->NewNode(&kOp0); |
99 TRACED_FOREACH(BranchHint, hint, kBranchHints) { | 138 TRACED_FOREACH(BranchHint, hint, kBranchHints) { |
100 TRACED_FOREACH(MachineType, type, kMachineTypes) { | 139 TRACED_FOREACH(MachineType, type, kMachineTypes) { |
101 Reduction r = Reduce( | 140 Reduction r = Reduce( |
102 graph()->NewNode(common()->Select(type, hint), input, input, input)); | 141 graph()->NewNode(common()->Select(type, hint), input, input, input)); |
103 ASSERT_TRUE(r.Changed()); | 142 ASSERT_TRUE(r.Changed()); |
104 EXPECT_EQ(input, r.replacement()); | 143 EXPECT_EQ(input, r.replacement()); |
105 } | 144 } |
106 } | 145 } |
107 } | 146 } |
108 | 147 |
| 148 |
| 149 TEST_F(CommonOperatorReducerTest, SelectToFloat64MaxOrFloat64Min) { |
| 150 Node* p0 = Parameter(0); |
| 151 Node* p1 = Parameter(1); |
| 152 Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); |
| 153 Reduction r1 = |
| 154 Reduce(graph()->NewNode(common()->Select(kMachFloat64), check, p1, p0), |
| 155 MachineOperatorBuilder::kFloat64Max); |
| 156 ASSERT_TRUE(r1.Changed()); |
| 157 EXPECT_THAT(r1.replacement(), IsFloat64Max(p1, p0)); |
| 158 Reduction r2 = |
| 159 Reduce(graph()->NewNode(common()->Select(kMachFloat64), check, p0, p1), |
| 160 MachineOperatorBuilder::kFloat64Min); |
| 161 ASSERT_TRUE(r2.Changed()); |
| 162 EXPECT_THAT(r2.replacement(), IsFloat64Min(p0, p1)); |
| 163 } |
| 164 |
109 } // namespace compiler | 165 } // namespace compiler |
110 } // namespace internal | 166 } // namespace internal |
111 } // namespace v8 | 167 } // namespace v8 |
OLD | NEW |