| 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/base/bits.h" | 5 #include "src/base/bits.h" |
| 6 #include "src/base/division-by-constant.h" | 6 #include "src/base/division-by-constant.h" |
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/machine-operator-reducer.h" | 8 #include "src/compiler/machine-operator-reducer.h" |
| 9 #include "src/compiler/typer.h" | 9 #include "src/compiler/typer.h" |
| 10 #include "test/unittests/compiler/graph-unittest.h" | 10 #include "test/unittests/compiler/graph-unittest.h" |
| 11 #include "test/unittests/compiler/node-test-utils.h" | 11 #include "test/unittests/compiler/node-test-utils.h" |
| 12 #include "testing/gmock-support.h" | 12 #include "testing/gmock-support.h" |
| 13 | 13 |
| 14 using testing::AllOf; | 14 using testing::AllOf; |
| 15 using testing::BitEq; |
| 15 using testing::Capture; | 16 using testing::Capture; |
| 16 using testing::CaptureEq; | 17 using testing::CaptureEq; |
| 17 | 18 |
| 18 namespace v8 { | 19 namespace v8 { |
| 19 namespace internal { | 20 namespace internal { |
| 20 namespace compiler { | 21 namespace compiler { |
| 21 | 22 |
| 22 class MachineOperatorReducerTest : public TypedGraphTest { | 23 class MachineOperatorReducerTest : public TypedGraphTest { |
| 23 public: | 24 public: |
| 24 explicit MachineOperatorReducerTest(int num_parameters = 2) | 25 explicit MachineOperatorReducerTest(int num_parameters = 2) |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 | 285 |
| 285 // ----------------------------------------------------------------------------- | 286 // ----------------------------------------------------------------------------- |
| 286 // ChangeFloat64ToFloat32 | 287 // ChangeFloat64ToFloat32 |
| 287 | 288 |
| 288 | 289 |
| 289 TEST_F(MachineOperatorReducerTest, ChangeFloat64ToFloat32WithConstant) { | 290 TEST_F(MachineOperatorReducerTest, ChangeFloat64ToFloat32WithConstant) { |
| 290 TRACED_FOREACH(float, x, kFloat32Values) { | 291 TRACED_FOREACH(float, x, kFloat32Values) { |
| 291 Reduction reduction = Reduce(graph()->NewNode( | 292 Reduction reduction = Reduce(graph()->NewNode( |
| 292 machine()->ChangeFloat32ToFloat64(), Float32Constant(x))); | 293 machine()->ChangeFloat32ToFloat64(), Float32Constant(x))); |
| 293 ASSERT_TRUE(reduction.Changed()); | 294 ASSERT_TRUE(reduction.Changed()); |
| 294 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(x)); | 295 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(BitEq<double>(x))); |
| 295 } | 296 } |
| 296 } | 297 } |
| 297 | 298 |
| 298 | 299 |
| 299 // ----------------------------------------------------------------------------- | 300 // ----------------------------------------------------------------------------- |
| 300 // ChangeFloat64ToInt32 | 301 // ChangeFloat64ToInt32 |
| 301 | 302 |
| 302 | 303 |
| 303 TEST_F(MachineOperatorReducerTest, | 304 TEST_F(MachineOperatorReducerTest, |
| 304 ChangeFloat64ToInt32WithChangeInt32ToFloat64) { | 305 ChangeFloat64ToInt32WithChangeInt32ToFloat64) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 | 349 |
| 349 // ----------------------------------------------------------------------------- | 350 // ----------------------------------------------------------------------------- |
| 350 // ChangeInt32ToFloat64 | 351 // ChangeInt32ToFloat64 |
| 351 | 352 |
| 352 | 353 |
| 353 TEST_F(MachineOperatorReducerTest, ChangeInt32ToFloat64WithConstant) { | 354 TEST_F(MachineOperatorReducerTest, ChangeInt32ToFloat64WithConstant) { |
| 354 TRACED_FOREACH(int32_t, x, kInt32Values) { | 355 TRACED_FOREACH(int32_t, x, kInt32Values) { |
| 355 Reduction reduction = Reduce( | 356 Reduction reduction = Reduce( |
| 356 graph()->NewNode(machine()->ChangeInt32ToFloat64(), Int32Constant(x))); | 357 graph()->NewNode(machine()->ChangeInt32ToFloat64(), Int32Constant(x))); |
| 357 ASSERT_TRUE(reduction.Changed()); | 358 ASSERT_TRUE(reduction.Changed()); |
| 358 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(FastI2D(x))); | 359 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(BitEq(FastI2D(x)))); |
| 359 } | 360 } |
| 360 } | 361 } |
| 361 | 362 |
| 362 | 363 |
| 363 // ----------------------------------------------------------------------------- | 364 // ----------------------------------------------------------------------------- |
| 364 // ChangeInt32ToInt64 | 365 // ChangeInt32ToInt64 |
| 365 | 366 |
| 366 | 367 |
| 367 TEST_F(MachineOperatorReducerTest, ChangeInt32ToInt64WithConstant) { | 368 TEST_F(MachineOperatorReducerTest, ChangeInt32ToInt64WithConstant) { |
| 368 TRACED_FOREACH(int32_t, x, kInt32Values) { | 369 TRACED_FOREACH(int32_t, x, kInt32Values) { |
| 369 Reduction reduction = Reduce( | 370 Reduction reduction = Reduce( |
| 370 graph()->NewNode(machine()->ChangeInt32ToInt64(), Int32Constant(x))); | 371 graph()->NewNode(machine()->ChangeInt32ToInt64(), Int32Constant(x))); |
| 371 ASSERT_TRUE(reduction.Changed()); | 372 ASSERT_TRUE(reduction.Changed()); |
| 372 EXPECT_THAT(reduction.replacement(), IsInt64Constant(x)); | 373 EXPECT_THAT(reduction.replacement(), IsInt64Constant(x)); |
| 373 } | 374 } |
| 374 } | 375 } |
| 375 | 376 |
| 376 | 377 |
| 377 // ----------------------------------------------------------------------------- | 378 // ----------------------------------------------------------------------------- |
| 378 // ChangeUint32ToFloat64 | 379 // ChangeUint32ToFloat64 |
| 379 | 380 |
| 380 | 381 |
| 381 TEST_F(MachineOperatorReducerTest, ChangeUint32ToFloat64WithConstant) { | 382 TEST_F(MachineOperatorReducerTest, ChangeUint32ToFloat64WithConstant) { |
| 382 TRACED_FOREACH(uint32_t, x, kUint32Values) { | 383 TRACED_FOREACH(uint32_t, x, kUint32Values) { |
| 383 Reduction reduction = | 384 Reduction reduction = |
| 384 Reduce(graph()->NewNode(machine()->ChangeUint32ToFloat64(), | 385 Reduce(graph()->NewNode(machine()->ChangeUint32ToFloat64(), |
| 385 Int32Constant(bit_cast<int32_t>(x)))); | 386 Int32Constant(bit_cast<int32_t>(x)))); |
| 386 ASSERT_TRUE(reduction.Changed()); | 387 ASSERT_TRUE(reduction.Changed()); |
| 387 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(FastUI2D(x))); | 388 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(BitEq(FastUI2D(x)))); |
| 388 } | 389 } |
| 389 } | 390 } |
| 390 | 391 |
| 391 | 392 |
| 392 // ----------------------------------------------------------------------------- | 393 // ----------------------------------------------------------------------------- |
| 393 // ChangeUint32ToUint64 | 394 // ChangeUint32ToUint64 |
| 394 | 395 |
| 395 | 396 |
| 396 TEST_F(MachineOperatorReducerTest, ChangeUint32ToUint64WithConstant) { | 397 TEST_F(MachineOperatorReducerTest, ChangeUint32ToUint64WithConstant) { |
| 397 TRACED_FOREACH(uint32_t, x, kUint32Values) { | 398 TRACED_FOREACH(uint32_t, x, kUint32Values) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 418 ASSERT_TRUE(reduction.Changed()); | 419 ASSERT_TRUE(reduction.Changed()); |
| 419 EXPECT_EQ(value, reduction.replacement()); | 420 EXPECT_EQ(value, reduction.replacement()); |
| 420 } | 421 } |
| 421 | 422 |
| 422 | 423 |
| 423 TEST_F(MachineOperatorReducerTest, TruncateFloat64ToFloat32WithConstant) { | 424 TEST_F(MachineOperatorReducerTest, TruncateFloat64ToFloat32WithConstant) { |
| 424 TRACED_FOREACH(double, x, kFloat64Values) { | 425 TRACED_FOREACH(double, x, kFloat64Values) { |
| 425 Reduction reduction = Reduce(graph()->NewNode( | 426 Reduction reduction = Reduce(graph()->NewNode( |
| 426 machine()->TruncateFloat64ToFloat32(), Float64Constant(x))); | 427 machine()->TruncateFloat64ToFloat32(), Float64Constant(x))); |
| 427 ASSERT_TRUE(reduction.Changed()); | 428 ASSERT_TRUE(reduction.Changed()); |
| 428 EXPECT_THAT(reduction.replacement(), IsFloat32Constant(DoubleToFloat32(x))); | 429 EXPECT_THAT(reduction.replacement(), |
| 430 IsFloat32Constant(BitEq(DoubleToFloat32(x)))); |
| 429 } | 431 } |
| 430 } | 432 } |
| 431 | 433 |
| 432 | 434 |
| 433 // ----------------------------------------------------------------------------- | 435 // ----------------------------------------------------------------------------- |
| 434 // TruncateFloat64ToInt32 | 436 // TruncateFloat64ToInt32 |
| 435 | 437 |
| 436 | 438 |
| 437 TEST_F(MachineOperatorReducerTest, | 439 TEST_F(MachineOperatorReducerTest, |
| 438 TruncateFloat64ToInt32WithChangeInt32ToFloat64) { | 440 TruncateFloat64ToInt32WithChangeInt32ToFloat64) { |
| (...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 // ----------------------------------------------------------------------------- | 1263 // ----------------------------------------------------------------------------- |
| 1262 // Float64Mul | 1264 // Float64Mul |
| 1263 | 1265 |
| 1264 | 1266 |
| 1265 TEST_F(MachineOperatorReducerTest, Float64MulWithMinusOne) { | 1267 TEST_F(MachineOperatorReducerTest, Float64MulWithMinusOne) { |
| 1266 Node* const p0 = Parameter(0); | 1268 Node* const p0 = Parameter(0); |
| 1267 { | 1269 { |
| 1268 Reduction r = Reduce( | 1270 Reduction r = Reduce( |
| 1269 graph()->NewNode(machine()->Float64Mul(), p0, Float64Constant(-1.0))); | 1271 graph()->NewNode(machine()->Float64Mul(), p0, Float64Constant(-1.0))); |
| 1270 ASSERT_TRUE(r.Changed()); | 1272 ASSERT_TRUE(r.Changed()); |
| 1271 EXPECT_THAT(r.replacement(), IsFloat64Sub(IsFloat64Constant(-0.0), p0)); | 1273 EXPECT_THAT(r.replacement(), |
| 1274 IsFloat64Sub(IsFloat64Constant(BitEq(-0.0)), p0)); |
| 1272 } | 1275 } |
| 1273 { | 1276 { |
| 1274 Reduction r = Reduce( | 1277 Reduction r = Reduce( |
| 1275 graph()->NewNode(machine()->Float64Mul(), Float64Constant(-1.0), p0)); | 1278 graph()->NewNode(machine()->Float64Mul(), Float64Constant(-1.0), p0)); |
| 1276 ASSERT_TRUE(r.Changed()); | 1279 ASSERT_TRUE(r.Changed()); |
| 1277 EXPECT_THAT(r.replacement(), IsFloat64Sub(IsFloat64Constant(-0.0), p0)); | 1280 EXPECT_THAT(r.replacement(), |
| 1281 IsFloat64Sub(IsFloat64Constant(BitEq(-0.0)), p0)); |
| 1278 } | 1282 } |
| 1279 } | 1283 } |
| 1280 | 1284 |
| 1281 | 1285 |
| 1282 // ----------------------------------------------------------------------------- | 1286 // ----------------------------------------------------------------------------- |
| 1283 // Store | 1287 // Store |
| 1284 | 1288 |
| 1285 | 1289 |
| 1286 TEST_F(MachineOperatorReducerTest, StoreRepWord8WithWord32And) { | 1290 TEST_F(MachineOperatorReducerTest, StoreRepWord8WithWord32And) { |
| 1287 const StoreRepresentation rep(kRepWord8, kNoWriteBarrier); | 1291 const StoreRepresentation rep(kRepWord8, kNoWriteBarrier); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 Reduction r = Reduce(node); | 1374 Reduction r = Reduce(node); |
| 1371 ASSERT_TRUE(r.Changed()); | 1375 ASSERT_TRUE(r.Changed()); |
| 1372 EXPECT_THAT(r.replacement(), | 1376 EXPECT_THAT(r.replacement(), |
| 1373 IsStore(rep, base, index, value, effect, control)); | 1377 IsStore(rep, base, index, value, effect, control)); |
| 1374 } | 1378 } |
| 1375 } | 1379 } |
| 1376 | 1380 |
| 1377 } // namespace compiler | 1381 } // namespace compiler |
| 1378 } // namespace internal | 1382 } // namespace internal |
| 1379 } // namespace v8 | 1383 } // namespace v8 |
| OLD | NEW |