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 "src/conversions-inl.h" | 10 #include "src/conversions-inl.h" |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 } | 440 } |
441 | 441 |
442 | 442 |
443 TEST_F(MachineOperatorReducerTest, TruncateFloat64ToInt32WithPhi) { | 443 TEST_F(MachineOperatorReducerTest, TruncateFloat64ToInt32WithPhi) { |
444 Node* const p0 = Parameter(0); | 444 Node* const p0 = Parameter(0); |
445 Node* const p1 = Parameter(1); | 445 Node* const p1 = Parameter(1); |
446 Node* const merge = graph()->start(); | 446 Node* const merge = graph()->start(); |
447 TRACED_FOREACH(TruncationMode, mode, kTruncationModes) { | 447 TRACED_FOREACH(TruncationMode, mode, kTruncationModes) { |
448 Reduction reduction = Reduce(graph()->NewNode( | 448 Reduction reduction = Reduce(graph()->NewNode( |
449 machine()->TruncateFloat64ToInt32(mode), | 449 machine()->TruncateFloat64ToInt32(mode), |
450 graph()->NewNode(common()->Phi(kMachFloat64, 2), p0, p1, merge))); | 450 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), p0, |
| 451 p1, merge))); |
451 ASSERT_TRUE(reduction.Changed()); | 452 ASSERT_TRUE(reduction.Changed()); |
452 EXPECT_THAT(reduction.replacement(), | 453 EXPECT_THAT( |
453 IsPhi(kMachInt32, IsTruncateFloat64ToInt32(p0), | 454 reduction.replacement(), |
454 IsTruncateFloat64ToInt32(p1), merge)); | 455 IsPhi(MachineRepresentation::kWord32, IsTruncateFloat64ToInt32(p0), |
| 456 IsTruncateFloat64ToInt32(p1), merge)); |
455 } | 457 } |
456 } | 458 } |
457 | 459 |
458 | 460 |
459 // ----------------------------------------------------------------------------- | 461 // ----------------------------------------------------------------------------- |
460 // TruncateInt64ToInt32 | 462 // TruncateInt64ToInt32 |
461 | 463 |
462 | 464 |
463 TEST_F(MachineOperatorReducerTest, TruncateInt64ToInt32WithChangeInt32ToInt64) { | 465 TEST_F(MachineOperatorReducerTest, TruncateInt64ToInt32WithChangeInt32ToInt64) { |
464 Node* value = Parameter(0); | 466 Node* value = Parameter(0); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 ASSERT_TRUE(r.Changed()); | 823 ASSERT_TRUE(r.Changed()); |
822 EXPECT_THAT(r.replacement(), IsInt32Sub(IsInt32Constant(0), cmp)); | 824 EXPECT_THAT(r.replacement(), IsInt32Sub(IsInt32Constant(0), cmp)); |
823 } | 825 } |
824 } | 826 } |
825 | 827 |
826 | 828 |
827 TEST_F(MachineOperatorReducerTest, Word32SarWithWord32ShlAndLoad) { | 829 TEST_F(MachineOperatorReducerTest, Word32SarWithWord32ShlAndLoad) { |
828 Node* const p0 = Parameter(0); | 830 Node* const p0 = Parameter(0); |
829 Node* const p1 = Parameter(1); | 831 Node* const p1 = Parameter(1); |
830 { | 832 { |
831 Node* const l = graph()->NewNode(machine()->Load(kMachInt8), p0, p1, | 833 Node* const l = graph()->NewNode(machine()->Load(MachineType::Int8()), p0, |
832 graph()->start(), graph()->start()); | 834 p1, graph()->start(), graph()->start()); |
833 Reduction const r = Reduce(graph()->NewNode( | 835 Reduction const r = Reduce(graph()->NewNode( |
834 machine()->Word32Sar(), | 836 machine()->Word32Sar(), |
835 graph()->NewNode(machine()->Word32Shl(), l, Int32Constant(24)), | 837 graph()->NewNode(machine()->Word32Shl(), l, Int32Constant(24)), |
836 Int32Constant(24))); | 838 Int32Constant(24))); |
837 ASSERT_TRUE(r.Changed()); | 839 ASSERT_TRUE(r.Changed()); |
838 EXPECT_EQ(l, r.replacement()); | 840 EXPECT_EQ(l, r.replacement()); |
839 } | 841 } |
840 { | 842 { |
841 Node* const l = graph()->NewNode(machine()->Load(kMachInt16), p0, p1, | 843 Node* const l = graph()->NewNode(machine()->Load(MachineType::Int16()), p0, |
842 graph()->start(), graph()->start()); | 844 p1, graph()->start(), graph()->start()); |
843 Reduction const r = Reduce(graph()->NewNode( | 845 Reduction const r = Reduce(graph()->NewNode( |
844 machine()->Word32Sar(), | 846 machine()->Word32Sar(), |
845 graph()->NewNode(machine()->Word32Shl(), l, Int32Constant(16)), | 847 graph()->NewNode(machine()->Word32Shl(), l, Int32Constant(16)), |
846 Int32Constant(16))); | 848 Int32Constant(16))); |
847 ASSERT_TRUE(r.Changed()); | 849 ASSERT_TRUE(r.Changed()); |
848 EXPECT_EQ(l, r.replacement()); | 850 EXPECT_EQ(l, r.replacement()); |
849 } | 851 } |
850 } | 852 } |
851 | 853 |
852 | 854 |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 } | 1137 } |
1136 } | 1138 } |
1137 TRACED_FORRANGE(int32_t, shift, 1, 30) { | 1139 TRACED_FORRANGE(int32_t, shift, 1, 30) { |
1138 Reduction const r = | 1140 Reduction const r = |
1139 Reduce(graph()->NewNode(machine()->Int32Mod(), p0, | 1141 Reduce(graph()->NewNode(machine()->Int32Mod(), p0, |
1140 Int32Constant(1 << shift), graph()->start())); | 1142 Int32Constant(1 << shift), graph()->start())); |
1141 int32_t const mask = (1 << shift) - 1; | 1143 int32_t const mask = (1 << shift) - 1; |
1142 ASSERT_TRUE(r.Changed()); | 1144 ASSERT_TRUE(r.Changed()); |
1143 EXPECT_THAT( | 1145 EXPECT_THAT( |
1144 r.replacement(), | 1146 r.replacement(), |
1145 IsSelect(kMachInt32, IsInt32LessThan(p0, IsInt32Constant(0)), | 1147 IsSelect(MachineRepresentation::kWord32, |
| 1148 IsInt32LessThan(p0, IsInt32Constant(0)), |
1146 IsInt32Sub(IsInt32Constant(0), | 1149 IsInt32Sub(IsInt32Constant(0), |
1147 IsWord32And(IsInt32Sub(IsInt32Constant(0), p0), | 1150 IsWord32And(IsInt32Sub(IsInt32Constant(0), p0), |
1148 IsInt32Constant(mask))), | 1151 IsInt32Constant(mask))), |
1149 IsWord32And(p0, IsInt32Constant(mask)))); | 1152 IsWord32And(p0, IsInt32Constant(mask)))); |
1150 } | 1153 } |
1151 TRACED_FORRANGE(int32_t, shift, 1, 31) { | 1154 TRACED_FORRANGE(int32_t, shift, 1, 31) { |
1152 Reduction const r = Reduce(graph()->NewNode( | 1155 Reduction const r = Reduce(graph()->NewNode( |
1153 machine()->Int32Mod(), p0, | 1156 machine()->Int32Mod(), p0, |
1154 Uint32Constant(bit_cast<uint32_t, int32_t>(-1) << shift), | 1157 Uint32Constant(bit_cast<uint32_t, int32_t>(-1) << shift), |
1155 graph()->start())); | 1158 graph()->start())); |
1156 int32_t const mask = bit_cast<int32_t, uint32_t>((1U << shift) - 1); | 1159 int32_t const mask = bit_cast<int32_t, uint32_t>((1U << shift) - 1); |
1157 ASSERT_TRUE(r.Changed()); | 1160 ASSERT_TRUE(r.Changed()); |
1158 EXPECT_THAT( | 1161 EXPECT_THAT( |
1159 r.replacement(), | 1162 r.replacement(), |
1160 IsSelect(kMachInt32, IsInt32LessThan(p0, IsInt32Constant(0)), | 1163 IsSelect(MachineRepresentation::kWord32, |
| 1164 IsInt32LessThan(p0, IsInt32Constant(0)), |
1161 IsInt32Sub(IsInt32Constant(0), | 1165 IsInt32Sub(IsInt32Constant(0), |
1162 IsWord32And(IsInt32Sub(IsInt32Constant(0), p0), | 1166 IsWord32And(IsInt32Sub(IsInt32Constant(0), p0), |
1163 IsInt32Constant(mask))), | 1167 IsInt32Constant(mask))), |
1164 IsWord32And(p0, IsInt32Constant(mask)))); | 1168 IsWord32And(p0, IsInt32Constant(mask)))); |
1165 } | 1169 } |
1166 TRACED_FOREACH(int32_t, divisor, kInt32Values) { | 1170 TRACED_FOREACH(int32_t, divisor, kInt32Values) { |
1167 if (divisor == 0 || base::bits::IsPowerOfTwo32(Abs(divisor))) continue; | 1171 if (divisor == 0 || base::bits::IsPowerOfTwo32(Abs(divisor))) continue; |
1168 Reduction const r = Reduce(graph()->NewNode( | 1172 Reduction const r = Reduce(graph()->NewNode( |
1169 machine()->Int32Mod(), p0, Int32Constant(divisor), graph()->start())); | 1173 machine()->Int32Mod(), p0, Int32Constant(divisor), graph()->start())); |
1170 ASSERT_TRUE(r.Changed()); | 1174 ASSERT_TRUE(r.Changed()); |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 } | 1553 } |
1550 } | 1554 } |
1551 } | 1555 } |
1552 | 1556 |
1553 | 1557 |
1554 // ----------------------------------------------------------------------------- | 1558 // ----------------------------------------------------------------------------- |
1555 // Store | 1559 // Store |
1556 | 1560 |
1557 | 1561 |
1558 TEST_F(MachineOperatorReducerTest, StoreRepWord8WithWord32And) { | 1562 TEST_F(MachineOperatorReducerTest, StoreRepWord8WithWord32And) { |
1559 const StoreRepresentation rep(kMachUint8, kNoWriteBarrier); | 1563 const StoreRepresentation rep(MachineType::Uint8(), kNoWriteBarrier); |
1560 Node* const base = Parameter(0); | 1564 Node* const base = Parameter(0); |
1561 Node* const index = Parameter(1); | 1565 Node* const index = Parameter(1); |
1562 Node* const value = Parameter(2); | 1566 Node* const value = Parameter(2); |
1563 Node* const effect = graph()->start(); | 1567 Node* const effect = graph()->start(); |
1564 Node* const control = graph()->start(); | 1568 Node* const control = graph()->start(); |
1565 TRACED_FOREACH(uint32_t, x, kUint32Values) { | 1569 TRACED_FOREACH(uint32_t, x, kUint32Values) { |
1566 Node* const node = | 1570 Node* const node = |
1567 graph()->NewNode(machine()->Store(rep), base, index, | 1571 graph()->NewNode(machine()->Store(rep), base, index, |
1568 graph()->NewNode(machine()->Word32And(), value, | 1572 graph()->NewNode(machine()->Word32And(), value, |
1569 Uint32Constant(x | 0xffu)), | 1573 Uint32Constant(x | 0xffu)), |
1570 effect, control); | 1574 effect, control); |
1571 | 1575 |
1572 Reduction r = Reduce(node); | 1576 Reduction r = Reduce(node); |
1573 ASSERT_TRUE(r.Changed()); | 1577 ASSERT_TRUE(r.Changed()); |
1574 EXPECT_THAT(r.replacement(), | 1578 EXPECT_THAT(r.replacement(), |
1575 IsStore(rep, base, index, value, effect, control)); | 1579 IsStore(rep, base, index, value, effect, control)); |
1576 } | 1580 } |
1577 } | 1581 } |
1578 | 1582 |
1579 | 1583 |
1580 TEST_F(MachineOperatorReducerTest, StoreRepWord8WithWord32SarAndWord32Shl) { | 1584 TEST_F(MachineOperatorReducerTest, StoreRepWord8WithWord32SarAndWord32Shl) { |
1581 const StoreRepresentation rep(kMachUint8, kNoWriteBarrier); | 1585 const StoreRepresentation rep(MachineType::Uint8(), kNoWriteBarrier); |
1582 Node* const base = Parameter(0); | 1586 Node* const base = Parameter(0); |
1583 Node* const index = Parameter(1); | 1587 Node* const index = Parameter(1); |
1584 Node* const value = Parameter(2); | 1588 Node* const value = Parameter(2); |
1585 Node* const effect = graph()->start(); | 1589 Node* const effect = graph()->start(); |
1586 Node* const control = graph()->start(); | 1590 Node* const control = graph()->start(); |
1587 TRACED_FORRANGE(int32_t, x, 1, 24) { | 1591 TRACED_FORRANGE(int32_t, x, 1, 24) { |
1588 Node* const node = graph()->NewNode( | 1592 Node* const node = graph()->NewNode( |
1589 machine()->Store(rep), base, index, | 1593 machine()->Store(rep), base, index, |
1590 graph()->NewNode( | 1594 graph()->NewNode( |
1591 machine()->Word32Sar(), | 1595 machine()->Word32Sar(), |
1592 graph()->NewNode(machine()->Word32Shl(), value, Int32Constant(x)), | 1596 graph()->NewNode(machine()->Word32Shl(), value, Int32Constant(x)), |
1593 Int32Constant(x)), | 1597 Int32Constant(x)), |
1594 effect, control); | 1598 effect, control); |
1595 | 1599 |
1596 Reduction r = Reduce(node); | 1600 Reduction r = Reduce(node); |
1597 ASSERT_TRUE(r.Changed()); | 1601 ASSERT_TRUE(r.Changed()); |
1598 EXPECT_THAT(r.replacement(), | 1602 EXPECT_THAT(r.replacement(), |
1599 IsStore(rep, base, index, value, effect, control)); | 1603 IsStore(rep, base, index, value, effect, control)); |
1600 } | 1604 } |
1601 } | 1605 } |
1602 | 1606 |
1603 | 1607 |
1604 TEST_F(MachineOperatorReducerTest, StoreRepWord16WithWord32And) { | 1608 TEST_F(MachineOperatorReducerTest, StoreRepWord16WithWord32And) { |
1605 const StoreRepresentation rep(kMachUint16, kNoWriteBarrier); | 1609 const StoreRepresentation rep(MachineType::Uint16(), kNoWriteBarrier); |
1606 Node* const base = Parameter(0); | 1610 Node* const base = Parameter(0); |
1607 Node* const index = Parameter(1); | 1611 Node* const index = Parameter(1); |
1608 Node* const value = Parameter(2); | 1612 Node* const value = Parameter(2); |
1609 Node* const effect = graph()->start(); | 1613 Node* const effect = graph()->start(); |
1610 Node* const control = graph()->start(); | 1614 Node* const control = graph()->start(); |
1611 TRACED_FOREACH(uint32_t, x, kUint32Values) { | 1615 TRACED_FOREACH(uint32_t, x, kUint32Values) { |
1612 Node* const node = | 1616 Node* const node = |
1613 graph()->NewNode(machine()->Store(rep), base, index, | 1617 graph()->NewNode(machine()->Store(rep), base, index, |
1614 graph()->NewNode(machine()->Word32And(), value, | 1618 graph()->NewNode(machine()->Word32And(), value, |
1615 Uint32Constant(x | 0xffffu)), | 1619 Uint32Constant(x | 0xffffu)), |
1616 effect, control); | 1620 effect, control); |
1617 | 1621 |
1618 Reduction r = Reduce(node); | 1622 Reduction r = Reduce(node); |
1619 ASSERT_TRUE(r.Changed()); | 1623 ASSERT_TRUE(r.Changed()); |
1620 EXPECT_THAT(r.replacement(), | 1624 EXPECT_THAT(r.replacement(), |
1621 IsStore(rep, base, index, value, effect, control)); | 1625 IsStore(rep, base, index, value, effect, control)); |
1622 } | 1626 } |
1623 } | 1627 } |
1624 | 1628 |
1625 | 1629 |
1626 TEST_F(MachineOperatorReducerTest, StoreRepWord16WithWord32SarAndWord32Shl) { | 1630 TEST_F(MachineOperatorReducerTest, StoreRepWord16WithWord32SarAndWord32Shl) { |
1627 const StoreRepresentation rep(kMachUint16, kNoWriteBarrier); | 1631 const StoreRepresentation rep(MachineType::Uint16(), kNoWriteBarrier); |
1628 Node* const base = Parameter(0); | 1632 Node* const base = Parameter(0); |
1629 Node* const index = Parameter(1); | 1633 Node* const index = Parameter(1); |
1630 Node* const value = Parameter(2); | 1634 Node* const value = Parameter(2); |
1631 Node* const effect = graph()->start(); | 1635 Node* const effect = graph()->start(); |
1632 Node* const control = graph()->start(); | 1636 Node* const control = graph()->start(); |
1633 TRACED_FORRANGE(int32_t, x, 1, 16) { | 1637 TRACED_FORRANGE(int32_t, x, 1, 16) { |
1634 Node* const node = graph()->NewNode( | 1638 Node* const node = graph()->NewNode( |
1635 machine()->Store(rep), base, index, | 1639 machine()->Store(rep), base, index, |
1636 graph()->NewNode( | 1640 graph()->NewNode( |
1637 machine()->Word32Sar(), | 1641 machine()->Word32Sar(), |
1638 graph()->NewNode(machine()->Word32Shl(), value, Int32Constant(x)), | 1642 graph()->NewNode(machine()->Word32Shl(), value, Int32Constant(x)), |
1639 Int32Constant(x)), | 1643 Int32Constant(x)), |
1640 effect, control); | 1644 effect, control); |
1641 | 1645 |
1642 Reduction r = Reduce(node); | 1646 Reduction r = Reduce(node); |
1643 ASSERT_TRUE(r.Changed()); | 1647 ASSERT_TRUE(r.Changed()); |
1644 EXPECT_THAT(r.replacement(), | 1648 EXPECT_THAT(r.replacement(), |
1645 IsStore(rep, base, index, value, effect, control)); | 1649 IsStore(rep, base, index, value, effect, control)); |
1646 } | 1650 } |
1647 } | 1651 } |
1648 | 1652 |
1649 } // namespace compiler | 1653 } // namespace compiler |
1650 } // namespace internal | 1654 } // namespace internal |
1651 } // namespace v8 | 1655 } // namespace v8 |
OLD | NEW |