OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/effect-control-linearizer.h" | 5 #include "src/compiler/effect-control-linearizer.h" |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
629 break; | 629 break; |
630 case IrOpcode::kCheckNumber: | 630 case IrOpcode::kCheckNumber: |
631 state = LowerCheckNumber(node, frame_state, *effect, *control); | 631 state = LowerCheckNumber(node, frame_state, *effect, *control); |
632 break; | 632 break; |
633 case IrOpcode::kCheckString: | 633 case IrOpcode::kCheckString: |
634 state = LowerCheckString(node, frame_state, *effect, *control); | 634 state = LowerCheckString(node, frame_state, *effect, *control); |
635 break; | 635 break; |
636 case IrOpcode::kCheckIf: | 636 case IrOpcode::kCheckIf: |
637 state = LowerCheckIf(node, frame_state, *effect, *control); | 637 state = LowerCheckIf(node, frame_state, *effect, *control); |
638 break; | 638 break; |
639 case IrOpcode::kCheckTaggedPointer: | 639 case IrOpcode::kCheckHeapObject: |
640 state = LowerCheckTaggedPointer(node, frame_state, *effect, *control); | 640 state = LowerCheckHeapObject(node, frame_state, *effect, *control); |
641 break; | |
642 case IrOpcode::kCheckTaggedSigned: | |
643 state = LowerCheckTaggedSigned(node, frame_state, *effect, *control); | |
644 break; | 641 break; |
645 case IrOpcode::kCheckedInt32Add: | 642 case IrOpcode::kCheckedInt32Add: |
646 state = LowerCheckedInt32Add(node, frame_state, *effect, *control); | 643 state = LowerCheckedInt32Add(node, frame_state, *effect, *control); |
647 break; | 644 break; |
648 case IrOpcode::kCheckedInt32Sub: | 645 case IrOpcode::kCheckedInt32Sub: |
649 state = LowerCheckedInt32Sub(node, frame_state, *effect, *control); | 646 state = LowerCheckedInt32Sub(node, frame_state, *effect, *control); |
650 break; | 647 break; |
651 case IrOpcode::kCheckedInt32Div: | 648 case IrOpcode::kCheckedInt32Div: |
652 state = LowerCheckedInt32Div(node, frame_state, *effect, *control); | 649 state = LowerCheckedInt32Div(node, frame_state, *effect, *control); |
653 break; | 650 break; |
654 case IrOpcode::kCheckedInt32Mod: | 651 case IrOpcode::kCheckedInt32Mod: |
655 state = LowerCheckedInt32Mod(node, frame_state, *effect, *control); | 652 state = LowerCheckedInt32Mod(node, frame_state, *effect, *control); |
656 break; | 653 break; |
657 case IrOpcode::kCheckedUint32Div: | 654 case IrOpcode::kCheckedUint32Div: |
658 state = LowerCheckedUint32Div(node, frame_state, *effect, *control); | 655 state = LowerCheckedUint32Div(node, frame_state, *effect, *control); |
659 break; | 656 break; |
660 case IrOpcode::kCheckedUint32Mod: | 657 case IrOpcode::kCheckedUint32Mod: |
661 state = LowerCheckedUint32Mod(node, frame_state, *effect, *control); | 658 state = LowerCheckedUint32Mod(node, frame_state, *effect, *control); |
662 break; | 659 break; |
663 case IrOpcode::kCheckedInt32Mul: | 660 case IrOpcode::kCheckedInt32Mul: |
664 state = LowerCheckedInt32Mul(node, frame_state, *effect, *control); | 661 state = LowerCheckedInt32Mul(node, frame_state, *effect, *control); |
665 break; | 662 break; |
663 case IrOpcode::kCheckedInt32ToTaggedSigned: | |
664 state = | |
665 LowerCheckedInt32ToTaggedSigned(node, frame_state, *effect, *control); | |
666 break; | |
666 case IrOpcode::kCheckedUint32ToInt32: | 667 case IrOpcode::kCheckedUint32ToInt32: |
667 state = LowerCheckedUint32ToInt32(node, frame_state, *effect, *control); | 668 state = LowerCheckedUint32ToInt32(node, frame_state, *effect, *control); |
668 break; | 669 break; |
670 case IrOpcode::kCheckedUint32ToTaggedSigned: | |
671 state = LowerCheckedUint32ToTaggedSigned(node, frame_state, *effect, | |
672 *control); | |
673 break; | |
669 case IrOpcode::kCheckedFloat64ToInt32: | 674 case IrOpcode::kCheckedFloat64ToInt32: |
670 state = LowerCheckedFloat64ToInt32(node, frame_state, *effect, *control); | 675 state = LowerCheckedFloat64ToInt32(node, frame_state, *effect, *control); |
671 break; | 676 break; |
672 case IrOpcode::kCheckedTaggedSignedToInt32: | 677 case IrOpcode::kCheckedTaggedSignedToInt32: |
673 state = | 678 state = |
674 LowerCheckedTaggedSignedToInt32(node, frame_state, *effect, *control); | 679 LowerCheckedTaggedSignedToInt32(node, frame_state, *effect, *control); |
675 break; | 680 break; |
676 case IrOpcode::kCheckedTaggedToInt32: | 681 case IrOpcode::kCheckedTaggedToInt32: |
677 state = LowerCheckedTaggedToInt32(node, frame_state, *effect, *control); | 682 state = LowerCheckedTaggedToInt32(node, frame_state, *effect, *control); |
678 break; | 683 break; |
679 case IrOpcode::kCheckedTaggedToFloat64: | 684 case IrOpcode::kCheckedTaggedToFloat64: |
680 state = LowerCheckedTaggedToFloat64(node, frame_state, *effect, *control); | 685 state = LowerCheckedTaggedToFloat64(node, frame_state, *effect, *control); |
681 break; | 686 break; |
687 case IrOpcode::kCheckedTaggedToTaggedSigned: | |
688 state = LowerCheckedTaggedToTaggedSigned(node, frame_state, *effect, | |
689 *control); | |
690 break; | |
682 case IrOpcode::kTruncateTaggedToWord32: | 691 case IrOpcode::kTruncateTaggedToWord32: |
683 state = LowerTruncateTaggedToWord32(node, *effect, *control); | 692 state = LowerTruncateTaggedToWord32(node, *effect, *control); |
684 break; | 693 break; |
685 case IrOpcode::kCheckedTruncateTaggedToWord32: | 694 case IrOpcode::kCheckedTruncateTaggedToWord32: |
686 state = LowerCheckedTruncateTaggedToWord32(node, frame_state, *effect, | 695 state = LowerCheckedTruncateTaggedToWord32(node, frame_state, *effect, |
687 *control); | 696 *control); |
688 break; | 697 break; |
689 case IrOpcode::kObjectIsCallable: | 698 case IrOpcode::kObjectIsCallable: |
690 state = LowerObjectIsCallable(node, *effect, *control); | 699 state = LowerObjectIsCallable(node, *effect, *control); |
691 break; | 700 break; |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1313 Node* value = node->InputAt(0); | 1322 Node* value = node->InputAt(0); |
1314 | 1323 |
1315 control = effect = | 1324 control = effect = |
1316 graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNoReason), | 1325 graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNoReason), |
1317 value, frame_state, effect, control); | 1326 value, frame_state, effect, control); |
1318 | 1327 |
1319 return ValueEffectControl(value, effect, control); | 1328 return ValueEffectControl(value, effect, control); |
1320 } | 1329 } |
1321 | 1330 |
1322 EffectControlLinearizer::ValueEffectControl | 1331 EffectControlLinearizer::ValueEffectControl |
1323 EffectControlLinearizer::LowerCheckTaggedPointer(Node* node, Node* frame_state, | 1332 EffectControlLinearizer::LowerCheckHeapObject(Node* node, Node* frame_state, |
1324 Node* effect, Node* control) { | 1333 Node* effect, Node* control) { |
1325 Node* value = node->InputAt(0); | 1334 Node* value = node->InputAt(0); |
1326 | 1335 |
1327 Node* check = ObjectIsSmi(value); | 1336 Node* check = ObjectIsSmi(value); |
1328 control = effect = | 1337 control = effect = |
1329 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kSmi), check, | 1338 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kSmi), check, |
1330 frame_state, effect, control); | 1339 frame_state, effect, control); |
1331 | 1340 |
1332 return ValueEffectControl(value, effect, control); | 1341 return ValueEffectControl(value, effect, control); |
1333 } | 1342 } |
1334 | 1343 |
1335 EffectControlLinearizer::ValueEffectControl | 1344 EffectControlLinearizer::ValueEffectControl |
1336 EffectControlLinearizer::LowerCheckTaggedSigned(Node* node, Node* frame_state, | |
1337 Node* effect, Node* control) { | |
1338 Node* value = node->InputAt(0); | |
1339 | |
1340 Node* check = ObjectIsSmi(value); | |
1341 control = effect = | |
1342 graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNotASmi), | |
1343 check, frame_state, effect, control); | |
1344 | |
1345 return ValueEffectControl(value, effect, control); | |
1346 } | |
1347 | |
1348 EffectControlLinearizer::ValueEffectControl | |
1349 EffectControlLinearizer::LowerCheckedInt32Add(Node* node, Node* frame_state, | 1345 EffectControlLinearizer::LowerCheckedInt32Add(Node* node, Node* frame_state, |
1350 Node* effect, Node* control) { | 1346 Node* effect, Node* control) { |
1351 Node* lhs = node->InputAt(0); | 1347 Node* lhs = node->InputAt(0); |
1352 Node* rhs = node->InputAt(1); | 1348 Node* rhs = node->InputAt(1); |
1353 | 1349 |
1354 Node* value = | 1350 Node* value = |
1355 graph()->NewNode(machine()->Int32AddWithOverflow(), lhs, rhs, control); | 1351 graph()->NewNode(machine()->Int32AddWithOverflow(), lhs, rhs, control); |
1356 | 1352 |
1357 Node* check = graph()->NewNode(common()->Projection(1), value, control); | 1353 Node* check = graph()->NewNode(common()->Projection(1), value, control); |
1358 control = effect = | 1354 control = effect = |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1664 | 1660 |
1665 control = graph()->NewNode(common()->Merge(2), if_zero, if_not_zero); | 1661 control = graph()->NewNode(common()->Merge(2), if_zero, if_not_zero); |
1666 effect = graph()->NewNode(common()->EffectPhi(2), e_if_zero, e_if_not_zero, | 1662 effect = graph()->NewNode(common()->EffectPhi(2), e_if_zero, e_if_not_zero, |
1667 control); | 1663 control); |
1668 } | 1664 } |
1669 | 1665 |
1670 return ValueEffectControl(value, effect, control); | 1666 return ValueEffectControl(value, effect, control); |
1671 } | 1667 } |
1672 | 1668 |
1673 EffectControlLinearizer::ValueEffectControl | 1669 EffectControlLinearizer::ValueEffectControl |
1670 EffectControlLinearizer::LowerCheckedInt32ToTaggedSigned(Node* node, | |
1671 Node* frame_state, | |
1672 Node* effect, | |
1673 Node* control) { | |
1674 DCHECK(SmiValuesAre31Bits()); | |
1675 Node* value = node->InputAt(0); | |
1676 | |
1677 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value, | |
1678 control); | |
1679 | |
1680 Node* check = graph()->NewNode(common()->Projection(1), add, control); | |
1681 control = effect = | |
1682 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kOverflow), | |
1683 check, frame_state, effect, control); | |
1684 | |
1685 value = graph()->NewNode(common()->Projection(0), add, control); | |
1686 | |
1687 return ValueEffectControl(value, effect, control); | |
1688 } | |
1689 | |
1690 EffectControlLinearizer::ValueEffectControl | |
1674 EffectControlLinearizer::LowerCheckedUint32ToInt32(Node* node, | 1691 EffectControlLinearizer::LowerCheckedUint32ToInt32(Node* node, |
1675 Node* frame_state, | 1692 Node* frame_state, |
1676 Node* effect, | 1693 Node* effect, |
1677 Node* control) { | 1694 Node* control) { |
1678 Node* value = node->InputAt(0); | 1695 Node* value = node->InputAt(0); |
1679 Node* max_int = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::max()); | 1696 Node* max_int = jsgraph()->Int32Constant(std::numeric_limits<int32_t>::max()); |
1680 Node* is_safe = | 1697 Node* is_safe = |
1681 graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int); | 1698 graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int); |
1682 control = effect = graph()->NewNode( | 1699 control = effect = graph()->NewNode( |
1683 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), is_safe, | 1700 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), is_safe, |
1684 frame_state, effect, control); | 1701 frame_state, effect, control); |
1685 | 1702 |
1686 return ValueEffectControl(value, effect, control); | 1703 return ValueEffectControl(value, effect, control); |
1687 } | 1704 } |
1688 | 1705 |
1689 EffectControlLinearizer::ValueEffectControl | 1706 EffectControlLinearizer::ValueEffectControl |
1707 EffectControlLinearizer::LowerCheckedUint32ToTaggedSigned(Node* node, | |
1708 Node* frame_state, | |
1709 Node* effect, | |
1710 Node* control) { | |
1711 Node* value = node->InputAt(0); | |
1712 Node* check = graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, | |
1713 SmiMaxValueConstant()); | |
1714 control = effect = graph()->NewNode( | |
1715 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), check, | |
Jarin
2016/09/23 08:31:54
So why is the deopt reason here kLostPrecision and
Benedikt Meurer
2016/09/23 08:39:38
Copied your logic from above.
| |
1716 frame_state, effect, control); | |
1717 value = ChangeUint32ToSmi(value); | |
1718 | |
1719 return ValueEffectControl(value, effect, control); | |
1720 } | |
1721 | |
1722 EffectControlLinearizer::ValueEffectControl | |
1690 EffectControlLinearizer::BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, | 1723 EffectControlLinearizer::BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode, |
1691 Node* value, | 1724 Node* value, |
1692 Node* frame_state, | 1725 Node* frame_state, |
1693 Node* effect, | 1726 Node* effect, |
1694 Node* control) { | 1727 Node* control) { |
1695 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); | 1728 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); |
1696 Node* check_same = graph()->NewNode( | 1729 Node* check_same = graph()->NewNode( |
1697 machine()->Float64Equal(), value, | 1730 machine()->Float64Equal(), value, |
1698 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); | 1731 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); |
1699 control = effect = graph()->NewNode( | 1732 control = effect = graph()->NewNode( |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1884 Node* effect_phi = graph()->NewNode(common()->EffectPhi(2), etrue, | 1917 Node* effect_phi = graph()->NewNode(common()->EffectPhi(2), etrue, |
1885 number_state.effect, merge); | 1918 number_state.effect, merge); |
1886 Node* result = | 1919 Node* result = |
1887 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, | 1920 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), vtrue, |
1888 number_state.value, merge); | 1921 number_state.value, merge); |
1889 | 1922 |
1890 return ValueEffectControl(result, effect_phi, merge); | 1923 return ValueEffectControl(result, effect_phi, merge); |
1891 } | 1924 } |
1892 | 1925 |
1893 EffectControlLinearizer::ValueEffectControl | 1926 EffectControlLinearizer::ValueEffectControl |
1927 EffectControlLinearizer::LowerCheckedTaggedToTaggedSigned(Node* node, | |
1928 Node* frame_state, | |
1929 Node* effect, | |
1930 Node* control) { | |
1931 Node* value = node->InputAt(0); | |
1932 | |
1933 Node* check = ObjectIsSmi(value); | |
1934 control = effect = | |
1935 graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNotASmi), | |
1936 check, frame_state, effect, control); | |
1937 | |
1938 return ValueEffectControl(value, effect, control); | |
1939 } | |
1940 | |
1941 EffectControlLinearizer::ValueEffectControl | |
1894 EffectControlLinearizer::LowerTruncateTaggedToWord32(Node* node, Node* effect, | 1942 EffectControlLinearizer::LowerTruncateTaggedToWord32(Node* node, Node* effect, |
1895 Node* control) { | 1943 Node* control) { |
1896 Node* value = node->InputAt(0); | 1944 Node* value = node->InputAt(0); |
1897 | 1945 |
1898 Node* check = ObjectIsSmi(value); | 1946 Node* check = ObjectIsSmi(value); |
1899 Node* branch = | 1947 Node* branch = |
1900 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); | 1948 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); |
1901 | 1949 |
1902 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); | 1950 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); |
1903 Node* etrue = effect; | 1951 Node* etrue = effect; |
(...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3461 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3509 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3462 Operator::kEliminatable); | 3510 Operator::kEliminatable); |
3463 to_number_operator_.set(common()->Call(desc)); | 3511 to_number_operator_.set(common()->Call(desc)); |
3464 } | 3512 } |
3465 return to_number_operator_.get(); | 3513 return to_number_operator_.get(); |
3466 } | 3514 } |
3467 | 3515 |
3468 } // namespace compiler | 3516 } // namespace compiler |
3469 } // namespace internal | 3517 } // namespace internal |
3470 } // namespace v8 | 3518 } // namespace v8 |
OLD | NEW |