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/machine-operator.h" | 7 #include "src/compiler/machine-operator.h" |
8 #include "src/compiler/operator.h" | 8 #include "src/compiler/operator.h" |
9 #include "src/compiler/simplified-operator.h" | 9 #include "src/compiler/simplified-operator.h" |
10 #include "src/machine-type.h" | 10 #include "src/machine-type.h" |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 Node* phi = graph()->NewNode( | 317 Node* phi = graph()->NewNode( |
318 common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, vfalse, merge); | 318 common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, vfalse, merge); |
319 StrictMock<MockAdvancedReducerEditor> editor; | 319 StrictMock<MockAdvancedReducerEditor> editor; |
320 EXPECT_CALL(editor, Revisit(merge)); | 320 EXPECT_CALL(editor, Revisit(merge)); |
321 Reduction r = Reduce(&editor, phi); | 321 Reduction r = Reduce(&editor, phi); |
322 ASSERT_TRUE(r.Changed()); | 322 ASSERT_TRUE(r.Changed()); |
323 EXPECT_THAT(r.replacement(), IsFloat64Abs(p0)); | 323 EXPECT_THAT(r.replacement(), IsFloat64Abs(p0)); |
324 } | 324 } |
325 | 325 |
326 | 326 |
327 TEST_F(CommonOperatorReducerTest, PhiToFloat32Max) { | |
328 Node* p0 = Parameter(0); | |
329 Node* p1 = Parameter(1); | |
330 Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); | |
331 Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); | |
332 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | |
333 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | |
334 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | |
335 Node* phi = graph()->NewNode( | |
336 common()->Phi(MachineRepresentation::kFloat32, 2), p1, p0, merge); | |
337 StrictMock<MockAdvancedReducerEditor> editor; | |
338 EXPECT_CALL(editor, Revisit(merge)); | |
339 Reduction r = Reduce(&editor, phi, MachineOperatorBuilder::kFloat32Max); | |
340 ASSERT_TRUE(r.Changed()); | |
341 EXPECT_THAT(r.replacement(), IsFloat32Max(p1, p0)); | |
342 } | |
343 | |
344 | |
345 TEST_F(CommonOperatorReducerTest, PhiToFloat64Max) { | |
346 Node* p0 = Parameter(0); | |
347 Node* p1 = Parameter(1); | |
348 Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); | |
349 Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); | |
350 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | |
351 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | |
352 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | |
353 Node* phi = graph()->NewNode( | |
354 common()->Phi(MachineRepresentation::kFloat64, 2), p1, p0, merge); | |
355 StrictMock<MockAdvancedReducerEditor> editor; | |
356 EXPECT_CALL(editor, Revisit(merge)); | |
357 Reduction r = Reduce(&editor, phi, MachineOperatorBuilder::kFloat64Max); | |
358 ASSERT_TRUE(r.Changed()); | |
359 EXPECT_THAT(r.replacement(), IsFloat64Max(p1, p0)); | |
360 } | |
361 | |
362 | |
363 TEST_F(CommonOperatorReducerTest, PhiToFloat32Min) { | |
364 Node* p0 = Parameter(0); | |
365 Node* p1 = Parameter(1); | |
366 Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); | |
367 Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); | |
368 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | |
369 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | |
370 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | |
371 Node* phi = graph()->NewNode( | |
372 common()->Phi(MachineRepresentation::kFloat32, 2), p0, p1, merge); | |
373 StrictMock<MockAdvancedReducerEditor> editor; | |
374 EXPECT_CALL(editor, Revisit(merge)); | |
375 Reduction r = Reduce(&editor, phi, MachineOperatorBuilder::kFloat32Min); | |
376 ASSERT_TRUE(r.Changed()); | |
377 EXPECT_THAT(r.replacement(), IsFloat32Min(p0, p1)); | |
378 } | |
379 | |
380 | |
381 TEST_F(CommonOperatorReducerTest, PhiToFloat64Min) { | |
382 Node* p0 = Parameter(0); | |
383 Node* p1 = Parameter(1); | |
384 Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); | |
385 Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start()); | |
386 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | |
387 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); | |
388 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); | |
389 Node* phi = graph()->NewNode( | |
390 common()->Phi(MachineRepresentation::kFloat64, 2), p0, p1, merge); | |
391 StrictMock<MockAdvancedReducerEditor> editor; | |
392 EXPECT_CALL(editor, Revisit(merge)); | |
393 Reduction r = Reduce(&editor, phi, MachineOperatorBuilder::kFloat64Min); | |
394 ASSERT_TRUE(r.Changed()); | |
395 EXPECT_THAT(r.replacement(), IsFloat64Min(p0, p1)); | |
396 } | |
397 | |
398 | |
399 // ----------------------------------------------------------------------------- | 327 // ----------------------------------------------------------------------------- |
400 // Return | 328 // Return |
401 | 329 |
402 | 330 |
403 TEST_F(CommonOperatorReducerTest, ReturnWithPhiAndEffectPhiAndMerge) { | 331 TEST_F(CommonOperatorReducerTest, ReturnWithPhiAndEffectPhiAndMerge) { |
404 Node* cond = Parameter(2); | 332 Node* cond = Parameter(2); |
405 Node* branch = graph()->NewNode(common()->Branch(), cond, graph()->start()); | 333 Node* branch = graph()->NewNode(common()->Branch(), cond, graph()->start()); |
406 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 334 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
407 Node* etrue = graph()->start(); | 335 Node* etrue = graph()->start(); |
408 Node* vtrue = Parameter(0); | 336 Node* vtrue = Parameter(0); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 Node* c0 = Float64Constant(0.0); | 435 Node* c0 = Float64Constant(0.0); |
508 Node* check = graph()->NewNode(machine()->Float64LessThan(), c0, p0); | 436 Node* check = graph()->NewNode(machine()->Float64LessThan(), c0, p0); |
509 Node* select = | 437 Node* select = |
510 graph()->NewNode(common()->Select(MachineRepresentation::kFloat64), check, | 438 graph()->NewNode(common()->Select(MachineRepresentation::kFloat64), check, |
511 p0, graph()->NewNode(machine()->Float64Sub(), c0, p0)); | 439 p0, graph()->NewNode(machine()->Float64Sub(), c0, p0)); |
512 Reduction r = Reduce(select); | 440 Reduction r = Reduce(select); |
513 ASSERT_TRUE(r.Changed()); | 441 ASSERT_TRUE(r.Changed()); |
514 EXPECT_THAT(r.replacement(), IsFloat64Abs(p0)); | 442 EXPECT_THAT(r.replacement(), IsFloat64Abs(p0)); |
515 } | 443 } |
516 | 444 |
517 | |
518 TEST_F(CommonOperatorReducerTest, SelectToFloat32Max) { | |
519 Node* p0 = Parameter(0); | |
520 Node* p1 = Parameter(1); | |
521 Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); | |
522 Node* select = graph()->NewNode( | |
523 common()->Select(MachineRepresentation::kFloat32), check, p1, p0); | |
524 Reduction r = Reduce(select, MachineOperatorBuilder::kFloat32Max); | |
525 ASSERT_TRUE(r.Changed()); | |
526 EXPECT_THAT(r.replacement(), IsFloat32Max(p1, p0)); | |
527 } | |
528 | |
529 | |
530 TEST_F(CommonOperatorReducerTest, SelectToFloat64Max) { | |
531 Node* p0 = Parameter(0); | |
532 Node* p1 = Parameter(1); | |
533 Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); | |
534 Node* select = graph()->NewNode( | |
535 common()->Select(MachineRepresentation::kFloat64), check, p1, p0); | |
536 Reduction r = Reduce(select, MachineOperatorBuilder::kFloat64Max); | |
537 ASSERT_TRUE(r.Changed()); | |
538 EXPECT_THAT(r.replacement(), IsFloat64Max(p1, p0)); | |
539 } | |
540 | |
541 | |
542 TEST_F(CommonOperatorReducerTest, SelectToFloat32Min) { | |
543 Node* p0 = Parameter(0); | |
544 Node* p1 = Parameter(1); | |
545 Node* check = graph()->NewNode(machine()->Float32LessThan(), p0, p1); | |
546 Node* select = graph()->NewNode( | |
547 common()->Select(MachineRepresentation::kFloat32), check, p0, p1); | |
548 Reduction r = Reduce(select, MachineOperatorBuilder::kFloat32Min); | |
549 ASSERT_TRUE(r.Changed()); | |
550 EXPECT_THAT(r.replacement(), IsFloat32Min(p0, p1)); | |
551 } | |
552 | |
553 | |
554 TEST_F(CommonOperatorReducerTest, SelectToFloat64Min) { | |
555 Node* p0 = Parameter(0); | |
556 Node* p1 = Parameter(1); | |
557 Node* check = graph()->NewNode(machine()->Float64LessThan(), p0, p1); | |
558 Node* select = graph()->NewNode( | |
559 common()->Select(MachineRepresentation::kFloat64), check, p0, p1); | |
560 Reduction r = Reduce(select, MachineOperatorBuilder::kFloat64Min); | |
561 ASSERT_TRUE(r.Changed()); | |
562 EXPECT_THAT(r.replacement(), IsFloat64Min(p0, p1)); | |
563 } | |
564 | |
565 } // namespace compiler | 445 } // namespace compiler |
566 } // namespace internal | 446 } // namespace internal |
567 } // namespace v8 | 447 } // namespace v8 |
OLD | NEW |