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/access-builder.h" | 5 #include "src/compiler/access-builder.h" |
6 #include "src/compiler/js-graph.h" | 6 #include "src/compiler/js-graph.h" |
7 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
8 #include "src/compiler/simplified-operator.h" | 8 #include "src/compiler/simplified-operator.h" |
9 #include "src/compiler/simplified-operator-reducer.h" | 9 #include "src/compiler/simplified-operator-reducer.h" |
10 #include "src/conversions-inl.h" | 10 #include "src/conversions-inl.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 29755, 30554, 16476817, 605431957, 832401070, 873617242, 914205764, | 90 29755, 30554, 16476817, 605431957, 832401070, 873617242, 914205764, |
91 1062628108, 1087581664, 1488498068, 1534668023, 1661587028, 1696896187, | 91 1062628108, 1087581664, 1488498068, 1534668023, 1661587028, 1696896187, |
92 1866841746, 2032089723, 2147483647}; | 92 1866841746, 2032089723, 2147483647}; |
93 | 93 |
94 | 94 |
95 const double kNaNs[] = {-std::numeric_limits<double>::quiet_NaN(), | 95 const double kNaNs[] = {-std::numeric_limits<double>::quiet_NaN(), |
96 std::numeric_limits<double>::quiet_NaN(), | 96 std::numeric_limits<double>::quiet_NaN(), |
97 bit_cast<double>(V8_UINT64_C(0x7FFFFFFFFFFFFFFF)), | 97 bit_cast<double>(V8_UINT64_C(0x7FFFFFFFFFFFFFFF)), |
98 bit_cast<double>(V8_UINT64_C(0xFFFFFFFFFFFFFFFF))}; | 98 bit_cast<double>(V8_UINT64_C(0xFFFFFFFFFFFFFFFF))}; |
99 | 99 |
| 100 const CheckForMinusZeroMode kCheckForMinusZeroModes[] = { |
| 101 CheckForMinusZeroMode::kDontCheckForMinusZero, |
| 102 CheckForMinusZeroMode::kCheckForMinusZero}; |
| 103 |
100 } // namespace | 104 } // namespace |
101 | 105 |
102 | 106 |
103 // ----------------------------------------------------------------------------- | 107 // ----------------------------------------------------------------------------- |
104 // BooleanNot | 108 // BooleanNot |
105 | 109 |
106 | 110 |
107 TEST_F(SimplifiedOperatorReducerTest, BooleanNotWithBooleanNot) { | 111 TEST_F(SimplifiedOperatorReducerTest, BooleanNotWithBooleanNot) { |
108 Node* param0 = Parameter(0); | 112 Node* param0 = Parameter(0); |
109 Reduction reduction = Reduce( | 113 Reduction reduction = Reduce( |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 | 180 |
177 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToBitWithChangeBitToTagged) { | 181 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToBitWithChangeBitToTagged) { |
178 Node* param0 = Parameter(0); | 182 Node* param0 = Parameter(0); |
179 Reduction reduction = Reduce(graph()->NewNode( | 183 Reduction reduction = Reduce(graph()->NewNode( |
180 simplified()->ChangeTaggedToBit(), | 184 simplified()->ChangeTaggedToBit(), |
181 graph()->NewNode(simplified()->ChangeBitToTagged(), param0))); | 185 graph()->NewNode(simplified()->ChangeBitToTagged(), param0))); |
182 ASSERT_TRUE(reduction.Changed()); | 186 ASSERT_TRUE(reduction.Changed()); |
183 EXPECT_EQ(param0, reduction.replacement()); | 187 EXPECT_EQ(param0, reduction.replacement()); |
184 } | 188 } |
185 | 189 |
186 | |
187 // ----------------------------------------------------------------------------- | 190 // ----------------------------------------------------------------------------- |
188 // ChangeFloat64ToTagged | 191 // ChangeFloat64ToTagged |
189 | 192 |
190 | |
191 TEST_F(SimplifiedOperatorReducerTest, ChangeFloat64ToTaggedWithConstant) { | 193 TEST_F(SimplifiedOperatorReducerTest, ChangeFloat64ToTaggedWithConstant) { |
192 TRACED_FOREACH(double, n, kFloat64Values) { | 194 TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) { |
193 Reduction reduction = Reduce(graph()->NewNode( | 195 TRACED_FOREACH(double, n, kFloat64Values) { |
194 simplified()->ChangeFloat64ToTagged(), Float64Constant(n))); | 196 Reduction reduction = Reduce(graph()->NewNode( |
195 ASSERT_TRUE(reduction.Changed()); | 197 simplified()->ChangeFloat64ToTagged(mode), Float64Constant(n))); |
196 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(n))); | 198 ASSERT_TRUE(reduction.Changed()); |
| 199 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(n))); |
| 200 } |
197 } | 201 } |
198 } | 202 } |
199 | 203 |
200 | |
201 // ----------------------------------------------------------------------------- | 204 // ----------------------------------------------------------------------------- |
202 // ChangeInt32ToTagged | 205 // ChangeInt32ToTagged |
203 | 206 |
204 | 207 |
205 TEST_F(SimplifiedOperatorReducerTest, ChangeInt32ToTaggedWithConstant) { | 208 TEST_F(SimplifiedOperatorReducerTest, ChangeInt32ToTaggedWithConstant) { |
206 TRACED_FOREACH(int32_t, n, kInt32Values) { | 209 TRACED_FOREACH(int32_t, n, kInt32Values) { |
207 Reduction reduction = Reduce(graph()->NewNode( | 210 Reduction reduction = Reduce(graph()->NewNode( |
208 simplified()->ChangeInt32ToTagged(), Int32Constant(n))); | 211 simplified()->ChangeInt32ToTagged(), Int32Constant(n))); |
209 ASSERT_TRUE(reduction.Changed()); | 212 ASSERT_TRUE(reduction.Changed()); |
210 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(FastI2D(n)))); | 213 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(FastI2D(n)))); |
211 } | 214 } |
212 } | 215 } |
213 | 216 |
214 | 217 |
215 // ----------------------------------------------------------------------------- | 218 // ----------------------------------------------------------------------------- |
216 // ChangeTaggedToFloat64 | 219 // ChangeTaggedToFloat64 |
217 | 220 |
218 | 221 |
219 TEST_F(SimplifiedOperatorReducerTest, | 222 TEST_F(SimplifiedOperatorReducerTest, |
220 ChangeTaggedToFloat64WithChangeFloat64ToTagged) { | 223 ChangeTaggedToFloat64WithChangeFloat64ToTagged) { |
221 Node* param0 = Parameter(0); | 224 Node* param0 = Parameter(0); |
222 Reduction reduction = Reduce(graph()->NewNode( | 225 TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) { |
223 simplified()->ChangeTaggedToFloat64(), | 226 Reduction reduction = Reduce(graph()->NewNode( |
224 graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0))); | 227 simplified()->ChangeTaggedToFloat64(), |
225 ASSERT_TRUE(reduction.Changed()); | 228 graph()->NewNode(simplified()->ChangeFloat64ToTagged(mode), param0))); |
226 EXPECT_EQ(param0, reduction.replacement()); | 229 ASSERT_TRUE(reduction.Changed()); |
| 230 EXPECT_EQ(param0, reduction.replacement()); |
| 231 } |
227 } | 232 } |
228 | 233 |
229 | |
230 TEST_F(SimplifiedOperatorReducerTest, | 234 TEST_F(SimplifiedOperatorReducerTest, |
231 ChangeTaggedToFloat64WithChangeInt32ToTagged) { | 235 ChangeTaggedToFloat64WithChangeInt32ToTagged) { |
232 Node* param0 = Parameter(0); | 236 Node* param0 = Parameter(0); |
233 Reduction reduction = Reduce(graph()->NewNode( | 237 Reduction reduction = Reduce(graph()->NewNode( |
234 simplified()->ChangeTaggedToFloat64(), | 238 simplified()->ChangeTaggedToFloat64(), |
235 graph()->NewNode(simplified()->ChangeInt32ToTagged(), param0))); | 239 graph()->NewNode(simplified()->ChangeInt32ToTagged(), param0))); |
236 ASSERT_TRUE(reduction.Changed()); | 240 ASSERT_TRUE(reduction.Changed()); |
237 EXPECT_THAT(reduction.replacement(), IsChangeInt32ToFloat64(param0)); | 241 EXPECT_THAT(reduction.replacement(), IsChangeInt32ToFloat64(param0)); |
238 } | 242 } |
239 | 243 |
(...skipping 25 matching lines...) Expand all Loading... |
265 simplified()->ChangeTaggedToFloat64(), NumberConstant(nan))); | 269 simplified()->ChangeTaggedToFloat64(), NumberConstant(nan))); |
266 ASSERT_TRUE(reduction.Changed()); | 270 ASSERT_TRUE(reduction.Changed()); |
267 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(BitEq(nan))); | 271 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(BitEq(nan))); |
268 } | 272 } |
269 } | 273 } |
270 | 274 |
271 | 275 |
272 // ----------------------------------------------------------------------------- | 276 // ----------------------------------------------------------------------------- |
273 // ChangeTaggedToInt32 | 277 // ChangeTaggedToInt32 |
274 | 278 |
275 | |
276 TEST_F(SimplifiedOperatorReducerTest, | 279 TEST_F(SimplifiedOperatorReducerTest, |
277 ChangeTaggedToInt32WithChangeFloat64ToTagged) { | 280 ChangeTaggedToInt32WithChangeFloat64ToTagged) { |
278 Node* param0 = Parameter(0); | 281 Node* param0 = Parameter(0); |
279 Reduction reduction = Reduce(graph()->NewNode( | 282 TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) { |
280 simplified()->ChangeTaggedToInt32(), | 283 Reduction reduction = Reduce(graph()->NewNode( |
281 graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0))); | 284 simplified()->ChangeTaggedToInt32(), |
282 ASSERT_TRUE(reduction.Changed()); | 285 graph()->NewNode(simplified()->ChangeFloat64ToTagged(mode), param0))); |
283 EXPECT_THAT(reduction.replacement(), IsChangeFloat64ToInt32(param0)); | 286 ASSERT_TRUE(reduction.Changed()); |
| 287 EXPECT_THAT(reduction.replacement(), IsChangeFloat64ToInt32(param0)); |
| 288 } |
284 } | 289 } |
285 | 290 |
286 | |
287 TEST_F(SimplifiedOperatorReducerTest, | 291 TEST_F(SimplifiedOperatorReducerTest, |
288 ChangeTaggedToInt32WithChangeInt32ToTagged) { | 292 ChangeTaggedToInt32WithChangeInt32ToTagged) { |
289 Node* param0 = Parameter(0); | 293 Node* param0 = Parameter(0); |
290 Reduction reduction = Reduce(graph()->NewNode( | 294 Reduction reduction = Reduce(graph()->NewNode( |
291 simplified()->ChangeTaggedToInt32(), | 295 simplified()->ChangeTaggedToInt32(), |
292 graph()->NewNode(simplified()->ChangeInt32ToTagged(), param0))); | 296 graph()->NewNode(simplified()->ChangeInt32ToTagged(), param0))); |
293 ASSERT_TRUE(reduction.Changed()); | 297 ASSERT_TRUE(reduction.Changed()); |
294 EXPECT_EQ(param0, reduction.replacement()); | 298 EXPECT_EQ(param0, reduction.replacement()); |
295 } | 299 } |
296 | 300 |
297 | 301 |
298 // ----------------------------------------------------------------------------- | 302 // ----------------------------------------------------------------------------- |
299 // ChangeTaggedToUint32 | 303 // ChangeTaggedToUint32 |
300 | 304 |
301 | |
302 TEST_F(SimplifiedOperatorReducerTest, | 305 TEST_F(SimplifiedOperatorReducerTest, |
303 ChangeTaggedToUint32WithChangeFloat64ToTagged) { | 306 ChangeTaggedToUint32WithChangeFloat64ToTagged) { |
304 Node* param0 = Parameter(0); | 307 Node* param0 = Parameter(0); |
305 Reduction reduction = Reduce(graph()->NewNode( | 308 TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) { |
306 simplified()->ChangeTaggedToUint32(), | 309 Reduction reduction = Reduce(graph()->NewNode( |
307 graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0))); | 310 simplified()->ChangeTaggedToUint32(), |
308 ASSERT_TRUE(reduction.Changed()); | 311 graph()->NewNode(simplified()->ChangeFloat64ToTagged(mode), param0))); |
309 EXPECT_THAT(reduction.replacement(), IsChangeFloat64ToUint32(param0)); | 312 ASSERT_TRUE(reduction.Changed()); |
| 313 EXPECT_THAT(reduction.replacement(), IsChangeFloat64ToUint32(param0)); |
| 314 } |
310 } | 315 } |
311 | 316 |
312 | |
313 TEST_F(SimplifiedOperatorReducerTest, | 317 TEST_F(SimplifiedOperatorReducerTest, |
314 ChangeTaggedToUint32WithChangeUint32ToTagged) { | 318 ChangeTaggedToUint32WithChangeUint32ToTagged) { |
315 Node* param0 = Parameter(0); | 319 Node* param0 = Parameter(0); |
316 Reduction reduction = Reduce(graph()->NewNode( | 320 Reduction reduction = Reduce(graph()->NewNode( |
317 simplified()->ChangeTaggedToUint32(), | 321 simplified()->ChangeTaggedToUint32(), |
318 graph()->NewNode(simplified()->ChangeUint32ToTagged(), param0))); | 322 graph()->NewNode(simplified()->ChangeUint32ToTagged(), param0))); |
319 ASSERT_TRUE(reduction.Changed()); | 323 ASSERT_TRUE(reduction.Changed()); |
320 EXPECT_EQ(param0, reduction.replacement()); | 324 EXPECT_EQ(param0, reduction.replacement()); |
321 } | 325 } |
322 | 326 |
323 | 327 |
324 // ----------------------------------------------------------------------------- | 328 // ----------------------------------------------------------------------------- |
325 // TruncateTaggedToWord32 | 329 // TruncateTaggedToWord32 |
326 | 330 |
327 TEST_F(SimplifiedOperatorReducerTest, | 331 TEST_F(SimplifiedOperatorReducerTest, |
328 TruncateTaggedToWord3WithChangeFloat64ToTagged) { | 332 TruncateTaggedToWord3WithChangeFloat64ToTagged) { |
329 Node* param0 = Parameter(0); | 333 Node* param0 = Parameter(0); |
330 Reduction reduction = Reduce(graph()->NewNode( | 334 TRACED_FOREACH(CheckForMinusZeroMode, mode, kCheckForMinusZeroModes) { |
331 simplified()->TruncateTaggedToWord32(), | 335 Reduction reduction = Reduce(graph()->NewNode( |
332 graph()->NewNode(simplified()->ChangeFloat64ToTagged(), param0))); | 336 simplified()->TruncateTaggedToWord32(), |
333 ASSERT_TRUE(reduction.Changed()); | 337 graph()->NewNode(simplified()->ChangeFloat64ToTagged(mode), param0))); |
334 EXPECT_THAT(reduction.replacement(), IsTruncateFloat64ToWord32(param0)); | 338 ASSERT_TRUE(reduction.Changed()); |
| 339 EXPECT_THAT(reduction.replacement(), IsTruncateFloat64ToWord32(param0)); |
| 340 } |
335 } | 341 } |
336 | 342 |
337 TEST_F(SimplifiedOperatorReducerTest, TruncateTaggedToWord32WithConstant) { | 343 TEST_F(SimplifiedOperatorReducerTest, TruncateTaggedToWord32WithConstant) { |
338 TRACED_FOREACH(double, n, kFloat64Values) { | 344 TRACED_FOREACH(double, n, kFloat64Values) { |
339 Reduction reduction = Reduce(graph()->NewNode( | 345 Reduction reduction = Reduce(graph()->NewNode( |
340 simplified()->TruncateTaggedToWord32(), NumberConstant(n))); | 346 simplified()->TruncateTaggedToWord32(), NumberConstant(n))); |
341 ASSERT_TRUE(reduction.Changed()); | 347 ASSERT_TRUE(reduction.Changed()); |
342 EXPECT_THAT(reduction.replacement(), IsInt32Constant(DoubleToInt32(n))); | 348 EXPECT_THAT(reduction.replacement(), IsInt32Constant(DoubleToInt32(n))); |
343 } | 349 } |
344 } | 350 } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 Reduction reduction = Reduce( | 455 Reduction reduction = Reduce( |
450 graph()->NewNode(simplified()->ObjectIsSmi(), NumberConstant(n))); | 456 graph()->NewNode(simplified()->ObjectIsSmi(), NumberConstant(n))); |
451 ASSERT_TRUE(reduction.Changed()); | 457 ASSERT_TRUE(reduction.Changed()); |
452 EXPECT_THAT(reduction.replacement(), IsBooleanConstant(IsSmiDouble(n))); | 458 EXPECT_THAT(reduction.replacement(), IsBooleanConstant(IsSmiDouble(n))); |
453 } | 459 } |
454 } | 460 } |
455 | 461 |
456 } // namespace compiler | 462 } // namespace compiler |
457 } // namespace internal | 463 } // namespace internal |
458 } // namespace v8 | 464 } // namespace v8 |
OLD | NEW |