Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: src/compiler/effect-control-linearizer.cc

Issue 2362173003: [turbofan] Improve representation selection for Smi checking. (Closed)
Patch Set: Address comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/effect-control-linearizer.h ('k') | src/compiler/js-builtin-reducer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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,
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
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
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
OLDNEW
« no previous file with comments | « src/compiler/effect-control-linearizer.h ('k') | src/compiler/js-builtin-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698