| 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/js-graph.h" | 5 #include "src/compiler/js-graph.h" |
| 6 #include "src/compiler/simplified-operator.h" | 6 #include "src/compiler/simplified-operator.h" |
| 7 #include "src/compiler/simplified-operator-reducer.h" | 7 #include "src/compiler/simplified-operator-reducer.h" |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/types.h" | 9 #include "src/types.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" |
| 13 |
| 14 using testing::BitEq; |
| 15 |
| 12 | 16 |
| 13 namespace v8 { | 17 namespace v8 { |
| 14 namespace internal { | 18 namespace internal { |
| 15 namespace compiler { | 19 namespace compiler { |
| 16 | 20 |
| 17 class SimplifiedOperatorReducerTest : public GraphTest { | 21 class SimplifiedOperatorReducerTest : public GraphTest { |
| 18 public: | 22 public: |
| 19 explicit SimplifiedOperatorReducerTest(int num_parameters = 1) | 23 explicit SimplifiedOperatorReducerTest(int num_parameters = 1) |
| 20 : GraphTest(num_parameters), simplified_(zone()) {} | 24 : GraphTest(num_parameters), simplified_(zone()) {} |
| 21 ~SimplifiedOperatorReducerTest() OVERRIDE {} | 25 ~SimplifiedOperatorReducerTest() OVERRIDE {} |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 0xfba5, 0x172dcc6, 0x114d8fc1, 0x182d6c9d, 0x1b1e3fad, 0x1db033bf, | 111 0xfba5, 0x172dcc6, 0x114d8fc1, 0x182d6c9d, 0x1b1e3fad, 0x1db033bf, |
| 108 0x1e1de755, 0x1f625c80, 0x28f6cf00, 0x2acb6a94, 0x2c20240e, 0x2f0fe54e, | 112 0x1e1de755, 0x1f625c80, 0x28f6cf00, 0x2acb6a94, 0x2c20240e, 0x2f0fe54e, |
| 109 0x31863a7c, 0x33325474, 0x3532fae3, 0x3bab82ea, 0x4c4b83a2, 0x4cd93d1e, | 113 0x31863a7c, 0x33325474, 0x3532fae3, 0x3bab82ea, 0x4c4b83a2, 0x4cd93d1e, |
| 110 0x4f7331d4, 0x5491b09b, 0x57cc6ff9, 0x60d3b4dc, 0x653f5904, 0x690ae256, | 114 0x4f7331d4, 0x5491b09b, 0x57cc6ff9, 0x60d3b4dc, 0x653f5904, 0x690ae256, |
| 111 0x69fe3276, 0x6bebf0ba, 0x6e2c69a3, 0x73b84ff7, 0x7b3a1924, 0x7ed032d9, | 115 0x69fe3276, 0x6bebf0ba, 0x6e2c69a3, 0x73b84ff7, 0x7b3a1924, 0x7ed032d9, |
| 112 0x84dd734b, 0x8552ea53, 0x8680754f, 0x8e9660eb, 0x94fe2b9c, 0x972d30cf, | 116 0x84dd734b, 0x8552ea53, 0x8680754f, 0x8e9660eb, 0x94fe2b9c, 0x972d30cf, |
| 113 0x9b98c482, 0xb158667e, 0xb432932c, 0xb5b70989, 0xb669971a, 0xb7c359d1, | 117 0x9b98c482, 0xb158667e, 0xb432932c, 0xb5b70989, 0xb669971a, 0xb7c359d1, |
| 114 0xbeb15c0d, 0xc171c53d, 0xc743dd38, 0xc8e2af50, 0xc98e2df0, 0xd9d1cdf9, | 118 0xbeb15c0d, 0xc171c53d, 0xc743dd38, 0xc8e2af50, 0xc98e2df0, 0xd9d1cdf9, |
| 115 0xdcc91049, 0xe46f396d, 0xee991950, 0xef64e521, 0xf7aeefc9, 0xffffffff}; | 119 0xdcc91049, 0xe46f396d, 0xee991950, 0xef64e521, 0xf7aeefc9, 0xffffffff}; |
| 116 | 120 |
| 117 | |
| 118 MATCHER(IsNaN, std::string(negation ? "isn't" : "is") + " NaN") { | |
| 119 return std::isnan(arg); | |
| 120 } | |
| 121 | |
| 122 } // namespace | 121 } // namespace |
| 123 | 122 |
| 124 | 123 |
| 125 // ----------------------------------------------------------------------------- | 124 // ----------------------------------------------------------------------------- |
| 126 // Unary operators | 125 // Unary operators |
| 127 | 126 |
| 128 | 127 |
| 129 namespace { | 128 namespace { |
| 130 | 129 |
| 131 struct UnaryOperator { | 130 struct UnaryOperator { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 | 263 |
| 265 // ----------------------------------------------------------------------------- | 264 // ----------------------------------------------------------------------------- |
| 266 // ChangeFloat64ToTagged | 265 // ChangeFloat64ToTagged |
| 267 | 266 |
| 268 | 267 |
| 269 TEST_F(SimplifiedOperatorReducerTest, ChangeFloat64ToTaggedWithConstant) { | 268 TEST_F(SimplifiedOperatorReducerTest, ChangeFloat64ToTaggedWithConstant) { |
| 270 TRACED_FOREACH(double, n, kFloat64Values) { | 269 TRACED_FOREACH(double, n, kFloat64Values) { |
| 271 Reduction reduction = Reduce(graph()->NewNode( | 270 Reduction reduction = Reduce(graph()->NewNode( |
| 272 simplified()->ChangeFloat64ToTagged(), Float64Constant(n))); | 271 simplified()->ChangeFloat64ToTagged(), Float64Constant(n))); |
| 273 ASSERT_TRUE(reduction.Changed()); | 272 ASSERT_TRUE(reduction.Changed()); |
| 274 EXPECT_THAT(reduction.replacement(), IsNumberConstant(n)); | 273 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(n))); |
| 275 } | 274 } |
| 276 } | 275 } |
| 277 | 276 |
| 278 | 277 |
| 279 // ----------------------------------------------------------------------------- | 278 // ----------------------------------------------------------------------------- |
| 280 // ChangeInt32ToTagged | 279 // ChangeInt32ToTagged |
| 281 | 280 |
| 282 | 281 |
| 283 TEST_F(SimplifiedOperatorReducerTest, ChangeInt32ToTaggedWithConstant) { | 282 TEST_F(SimplifiedOperatorReducerTest, ChangeInt32ToTaggedWithConstant) { |
| 284 TRACED_FOREACH(int32_t, n, kInt32Values) { | 283 TRACED_FOREACH(int32_t, n, kInt32Values) { |
| 285 Reduction reduction = Reduce(graph()->NewNode( | 284 Reduction reduction = Reduce(graph()->NewNode( |
| 286 simplified()->ChangeInt32ToTagged(), Int32Constant(n))); | 285 simplified()->ChangeInt32ToTagged(), Int32Constant(n))); |
| 287 ASSERT_TRUE(reduction.Changed()); | 286 ASSERT_TRUE(reduction.Changed()); |
| 288 EXPECT_THAT(reduction.replacement(), IsNumberConstant(FastI2D(n))); | 287 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(FastI2D(n)))); |
| 289 } | 288 } |
| 290 } | 289 } |
| 291 | 290 |
| 292 | 291 |
| 293 // ----------------------------------------------------------------------------- | 292 // ----------------------------------------------------------------------------- |
| 294 // ChangeTaggedToFloat64 | 293 // ChangeTaggedToFloat64 |
| 295 | 294 |
| 296 | 295 |
| 297 TEST_F(SimplifiedOperatorReducerTest, | 296 TEST_F(SimplifiedOperatorReducerTest, |
| 298 ChangeTaggedToFloat64WithChangeFloat64ToTagged) { | 297 ChangeTaggedToFloat64WithChangeFloat64ToTagged) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 325 ASSERT_TRUE(reduction.Changed()); | 324 ASSERT_TRUE(reduction.Changed()); |
| 326 EXPECT_THAT(reduction.replacement(), IsChangeUint32ToFloat64(param0)); | 325 EXPECT_THAT(reduction.replacement(), IsChangeUint32ToFloat64(param0)); |
| 327 } | 326 } |
| 328 | 327 |
| 329 | 328 |
| 330 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithConstant) { | 329 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithConstant) { |
| 331 TRACED_FOREACH(double, n, kFloat64Values) { | 330 TRACED_FOREACH(double, n, kFloat64Values) { |
| 332 Reduction reduction = Reduce(graph()->NewNode( | 331 Reduction reduction = Reduce(graph()->NewNode( |
| 333 simplified()->ChangeTaggedToFloat64(), NumberConstant(n))); | 332 simplified()->ChangeTaggedToFloat64(), NumberConstant(n))); |
| 334 ASSERT_TRUE(reduction.Changed()); | 333 ASSERT_TRUE(reduction.Changed()); |
| 335 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(n)); | 334 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(BitEq(n))); |
| 336 } | 335 } |
| 337 } | 336 } |
| 338 | 337 |
| 339 | 338 |
| 340 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithNaNConstant1) { | 339 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithNaNConstant1) { |
| 341 Reduction reduction = | 340 Reduction reduction = |
| 342 Reduce(graph()->NewNode(simplified()->ChangeTaggedToFloat64(), | 341 Reduce(graph()->NewNode(simplified()->ChangeTaggedToFloat64(), |
| 343 NumberConstant(-base::OS::nan_value()))); | 342 NumberConstant(-base::OS::nan_value()))); |
| 344 ASSERT_TRUE(reduction.Changed()); | 343 ASSERT_TRUE(reduction.Changed()); |
| 345 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(IsNaN())); | 344 EXPECT_THAT(reduction.replacement(), |
| 345 IsFloat64Constant(BitEq(-base::OS::nan_value()))); |
| 346 } | 346 } |
| 347 | 347 |
| 348 | 348 |
| 349 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithNaNConstant2) { | 349 TEST_F(SimplifiedOperatorReducerTest, ChangeTaggedToFloat64WithNaNConstant2) { |
| 350 Reduction reduction = | 350 Reduction reduction = |
| 351 Reduce(graph()->NewNode(simplified()->ChangeTaggedToFloat64(), | 351 Reduce(graph()->NewNode(simplified()->ChangeTaggedToFloat64(), |
| 352 NumberConstant(base::OS::nan_value()))); | 352 NumberConstant(base::OS::nan_value()))); |
| 353 ASSERT_TRUE(reduction.Changed()); | 353 ASSERT_TRUE(reduction.Changed()); |
| 354 EXPECT_THAT(reduction.replacement(), IsFloat64Constant(IsNaN())); | 354 EXPECT_THAT(reduction.replacement(), |
| 355 IsFloat64Constant(BitEq(base::OS::nan_value()))); |
| 355 } | 356 } |
| 356 | 357 |
| 357 | 358 |
| 358 // ----------------------------------------------------------------------------- | 359 // ----------------------------------------------------------------------------- |
| 359 // ChangeTaggedToInt32 | 360 // ChangeTaggedToInt32 |
| 360 | 361 |
| 361 | 362 |
| 362 TEST_F(SimplifiedOperatorReducerTest, | 363 TEST_F(SimplifiedOperatorReducerTest, |
| 363 ChangeTaggedToInt32WithChangeFloat64ToTagged) { | 364 ChangeTaggedToInt32WithChangeFloat64ToTagged) { |
| 364 Node* param0 = Parameter(0); | 365 Node* param0 = Parameter(0); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 // ----------------------------------------------------------------------------- | 468 // ----------------------------------------------------------------------------- |
| 468 // ChangeUint32ToTagged | 469 // ChangeUint32ToTagged |
| 469 | 470 |
| 470 | 471 |
| 471 TEST_F(SimplifiedOperatorReducerTest, ChangeUint32ToTagged) { | 472 TEST_F(SimplifiedOperatorReducerTest, ChangeUint32ToTagged) { |
| 472 TRACED_FOREACH(uint32_t, n, kUint32Values) { | 473 TRACED_FOREACH(uint32_t, n, kUint32Values) { |
| 473 Reduction reduction = | 474 Reduction reduction = |
| 474 Reduce(graph()->NewNode(simplified()->ChangeUint32ToTagged(), | 475 Reduce(graph()->NewNode(simplified()->ChangeUint32ToTagged(), |
| 475 Int32Constant(bit_cast<int32_t>(n)))); | 476 Int32Constant(bit_cast<int32_t>(n)))); |
| 476 ASSERT_TRUE(reduction.Changed()); | 477 ASSERT_TRUE(reduction.Changed()); |
| 477 EXPECT_THAT(reduction.replacement(), IsNumberConstant(FastUI2D(n))); | 478 EXPECT_THAT(reduction.replacement(), IsNumberConstant(BitEq(FastUI2D(n)))); |
| 478 } | 479 } |
| 479 } | 480 } |
| 480 | 481 |
| 481 } // namespace compiler | 482 } // namespace compiler |
| 482 } // namespace internal | 483 } // namespace internal |
| 483 } // namespace v8 | 484 } // namespace v8 |
| OLD | NEW |