OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/control-reducer.h" | 5 #include "src/compiler/control-reducer.h" |
6 #include "src/compiler/diamond.h" | 6 #include "src/compiler/diamond.h" |
7 #include "src/compiler/graph-visualizer.h" | 7 #include "src/compiler/graph-visualizer.h" |
8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
9 #include "src/compiler/js-operator.h" | 9 #include "src/compiler/js-operator.h" |
10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 ReduceGraph(); | 138 ReduceGraph(); |
139 | 139 |
140 // Branch should not be folded. | 140 // Branch should not be folded. |
141 EXPECT_THAT(phi1, | 141 EXPECT_THAT(phi1, |
142 IsPhi(kMachInt32, IsInt32Constant(111), IsInt32Constant(222), | 142 IsPhi(kMachInt32, IsInt32Constant(111), IsInt32Constant(222), |
143 IsMerge(IsIfTrue(branch1), IsIfFalse(branch1)))); | 143 IsMerge(IsIfTrue(branch1), IsIfFalse(branch1)))); |
144 EXPECT_THAT(graph()->end(), IsEnd(IsReturn(phi1, graph()->start(), merge1))); | 144 EXPECT_THAT(graph()->end(), IsEnd(IsReturn(phi1, graph()->start(), merge1))); |
145 } | 145 } |
146 | 146 |
147 | 147 |
148 TEST_F(ControlReducerTest, RangeAsInputToBranch_true1) { | |
149 Node* p0 = Parameter(Type::Range(1, 2, zone()), 0); | |
150 Node* branch1 = graph()->NewNode(common()->Branch(), p0, graph()->start()); | |
151 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); | |
152 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); | |
153 Node* merge1 = graph()->NewNode(common()->Merge(1), if_true1, if_false1); | |
154 Node* result = graph()->NewNode(common()->Phi(kMachInt32, 2), | |
155 jsgraph()->Int32Constant(11), | |
156 jsgraph()->Int32Constant(44), merge1); | |
157 | |
158 Node* ret = | |
159 graph()->NewNode(common()->Return(), result, graph()->start(), merge1); | |
160 graph()->end()->ReplaceInput(0, ret); | |
161 | |
162 ReduceGraph(); | |
163 | |
164 // Diamond should be folded away. | |
165 EXPECT_THAT( | |
166 graph()->end(), | |
167 IsEnd(IsReturn(IsInt32Constant(11), graph()->start(), graph()->start()))); | |
168 } | |
169 | |
170 | |
171 TEST_F(ControlReducerTest, RangeAsInputToBranch_true2) { | |
172 Node* p0 = Parameter(Type::Range(-2, -1, zone()), 0); | |
173 Node* branch1 = graph()->NewNode(common()->Branch(), p0, graph()->start()); | |
174 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); | |
175 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); | |
176 Node* merge1 = graph()->NewNode(common()->Merge(1), if_true1, if_false1); | |
177 Node* result = graph()->NewNode(common()->Phi(kMachInt32, 2), | |
178 jsgraph()->Int32Constant(11), | |
179 jsgraph()->Int32Constant(44), merge1); | |
180 | |
181 Node* ret = | |
182 graph()->NewNode(common()->Return(), result, graph()->start(), merge1); | |
183 graph()->end()->ReplaceInput(0, ret); | |
184 | |
185 ReduceGraph(); | |
186 | |
187 // Diamond should be folded away. | |
188 EXPECT_THAT( | |
189 graph()->end(), | |
190 IsEnd(IsReturn(IsInt32Constant(11), graph()->start(), graph()->start()))); | |
191 } | |
192 | |
193 | |
194 TEST_F(ControlReducerTest, SelectPhi) { | 148 TEST_F(ControlReducerTest, SelectPhi) { |
195 Node* p0 = Parameter(0); | 149 Node* p0 = Parameter(0); |
196 const MachineType kType = kMachInt32; | 150 const MachineType kType = kMachInt32; |
197 Diamond d(graph(), common(), p0); | 151 Diamond d(graph(), common(), p0); |
198 Node* phi = | 152 Node* phi = |
199 d.Phi(kType, jsgraph()->Int32Constant(1), jsgraph()->Int32Constant(2)); | 153 d.Phi(kType, jsgraph()->Int32Constant(1), jsgraph()->Int32Constant(2)); |
200 | 154 |
201 Node* ret = | 155 Node* ret = |
202 graph()->NewNode(common()->Return(), phi, graph()->start(), d.merge); | 156 graph()->NewNode(common()->Return(), phi, graph()->start(), d.merge); |
203 graph()->end()->ReplaceInput(0, ret); | 157 graph()->end()->ReplaceInput(0, ret); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 IsReturn(IsInt32Add( | 209 IsReturn(IsInt32Add( |
256 IsSelect(kType, p0, IsInt32Constant(1), IsInt32Constant(2)), | 210 IsSelect(kType, p0, IsInt32Constant(1), IsInt32Constant(2)), |
257 IsSelect(kType, p0, IsInt32Constant(2), IsInt32Constant(3))), | 211 IsSelect(kType, p0, IsInt32Constant(2), IsInt32Constant(3))), |
258 graph()->start(), graph()->start())); | 212 graph()->start(), graph()->start())); |
259 EXPECT_THAT(graph()->end(), IsEnd(ret)); | 213 EXPECT_THAT(graph()->end(), IsEnd(ret)); |
260 } | 214 } |
261 | 215 |
262 } // namespace compiler | 216 } // namespace compiler |
263 } // namespace internal | 217 } // namespace internal |
264 } // namespace v8 | 218 } // namespace v8 |
OLD | NEW |