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

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

Issue 2202993005: [turbofan] Don't generate unnecessary minus zero checks. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@TurboFan_SignedSmall
Patch Set: Err, DCHECK, meh Created 4 years, 4 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/representation-change.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 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 Node* is_safe = 1525 Node* is_safe =
1526 graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int); 1526 graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, max_int);
1527 control = effect = graph()->NewNode( 1527 control = effect = graph()->NewNode(
1528 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), is_safe, 1528 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecision), is_safe,
1529 frame_state, effect, control); 1529 frame_state, effect, control);
1530 1530
1531 return ValueEffectControl(value, effect, control); 1531 return ValueEffectControl(value, effect, control);
1532 } 1532 }
1533 1533
1534 EffectControlLinearizer::ValueEffectControl 1534 EffectControlLinearizer::ValueEffectControl
1535 EffectControlLinearizer::BuildCheckedFloat64ToInt32(Node* value, 1535 EffectControlLinearizer::BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
1536 Node* value,
1536 Node* frame_state, 1537 Node* frame_state,
1537 Node* effect, 1538 Node* effect,
1538 Node* control) { 1539 Node* control) {
1539 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value); 1540 Node* value32 = graph()->NewNode(machine()->RoundFloat64ToInt32(), value);
1540 Node* check_same = graph()->NewNode( 1541 Node* check_same = graph()->NewNode(
1541 machine()->Float64Equal(), value, 1542 machine()->Float64Equal(), value,
1542 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); 1543 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32));
1543 control = effect = graph()->NewNode( 1544 control = effect = graph()->NewNode(
1544 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecisionOrNaN), 1545 common()->DeoptimizeUnless(DeoptimizeReason::kLostPrecisionOrNaN),
1545 check_same, frame_state, effect, control); 1546 check_same, frame_state, effect, control);
1546 1547
1547 // Check if {value} is -0. 1548 if (mode == CheckForMinusZeroMode::kCheckForMinusZero) {
1548 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32, 1549 // Check if {value} is -0.
1549 jsgraph()->Int32Constant(0)); 1550 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32,
1550 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse), 1551 jsgraph()->Int32Constant(0));
1551 check_zero, control); 1552 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse),
1553 check_zero, control);
1552 1554
1553 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero); 1555 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero);
1554 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero); 1556 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero);
1555 1557
1556 // In case of 0, we need to check the high bits for the IEEE -0 pattern. 1558 // In case of 0, we need to check the high bits for the IEEE -0 pattern.
1557 Node* check_negative = graph()->NewNode( 1559 Node* check_negative = graph()->NewNode(
1558 machine()->Int32LessThan(), 1560 machine()->Int32LessThan(),
1559 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), 1561 graph()->NewNode(machine()->Float64ExtractHighWord32(), value),
1560 jsgraph()->Int32Constant(0)); 1562 jsgraph()->Int32Constant(0));
1561 1563
1562 Node* deopt_minus_zero = 1564 Node* deopt_minus_zero =
1563 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero), 1565 graph()->NewNode(common()->DeoptimizeIf(DeoptimizeReason::kMinusZero),
1564 check_negative, frame_state, effect, if_zero); 1566 check_negative, frame_state, effect, if_zero);
1565 1567
1566 Node* merge = 1568 control =
1567 graph()->NewNode(common()->Merge(2), deopt_minus_zero, if_notzero); 1569 graph()->NewNode(common()->Merge(2), deopt_minus_zero, if_notzero);
1570 effect = graph()->NewNode(common()->EffectPhi(2), deopt_minus_zero, effect,
1571 control);
1572 }
1568 1573
1569 effect = 1574 return ValueEffectControl(value32, effect, control);
1570 graph()->NewNode(common()->EffectPhi(2), deopt_minus_zero, effect, merge);
1571
1572 return ValueEffectControl(value32, effect, merge);
1573 } 1575 }
1574 1576
1575 EffectControlLinearizer::ValueEffectControl 1577 EffectControlLinearizer::ValueEffectControl
1576 EffectControlLinearizer::LowerCheckedFloat64ToInt32(Node* node, 1578 EffectControlLinearizer::LowerCheckedFloat64ToInt32(Node* node,
1577 Node* frame_state, 1579 Node* frame_state,
1578 Node* effect, 1580 Node* effect,
1579 Node* control) { 1581 Node* control) {
1582 CheckForMinusZeroMode mode = CheckMinusZeroModeOf(node->op());
1580 Node* value = node->InputAt(0); 1583 Node* value = node->InputAt(0);
1581 1584
1582 return BuildCheckedFloat64ToInt32(value, frame_state, effect, control); 1585 return BuildCheckedFloat64ToInt32(mode, value, frame_state, effect, control);
1583 } 1586 }
1584 1587
1585 EffectControlLinearizer::ValueEffectControl 1588 EffectControlLinearizer::ValueEffectControl
1586 EffectControlLinearizer::LowerCheckedTaggedSignedToInt32(Node* node, 1589 EffectControlLinearizer::LowerCheckedTaggedSignedToInt32(Node* node,
1587 Node* frame_state, 1590 Node* frame_state,
1588 Node* effect, 1591 Node* effect,
1589 Node* control) { 1592 Node* control) {
1590 Node* value = node->InputAt(0); 1593 Node* value = node->InputAt(0);
1591 1594
1592 Node* check = ObjectIsSmi(value); 1595 Node* check = ObjectIsSmi(value);
1593 control = effect = 1596 control = effect =
1594 graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNotASmi), 1597 graph()->NewNode(common()->DeoptimizeUnless(DeoptimizeReason::kNotASmi),
1595 check, frame_state, effect, control); 1598 check, frame_state, effect, control);
1596 value = ChangeSmiToInt32(value); 1599 value = ChangeSmiToInt32(value);
1597 1600
1598 return ValueEffectControl(value, effect, control); 1601 return ValueEffectControl(value, effect, control);
1599 } 1602 }
1600 1603
1601 EffectControlLinearizer::ValueEffectControl 1604 EffectControlLinearizer::ValueEffectControl
1602 EffectControlLinearizer::LowerCheckedTaggedToInt32(Node* node, 1605 EffectControlLinearizer::LowerCheckedTaggedToInt32(Node* node,
1603 Node* frame_state, 1606 Node* frame_state,
1604 Node* effect, 1607 Node* effect,
1605 Node* control) { 1608 Node* control) {
1609 CheckForMinusZeroMode mode = CheckMinusZeroModeOf(node->op());
1606 Node* value = node->InputAt(0); 1610 Node* value = node->InputAt(0);
1607 1611
1608 Node* check = ObjectIsSmi(value); 1612 Node* check = ObjectIsSmi(value);
1609 Node* branch = 1613 Node* branch =
1610 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); 1614 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control);
1611 1615
1612 // In the Smi case, just convert to int32. 1616 // In the Smi case, just convert to int32.
1613 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 1617 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
1614 Node* etrue = effect; 1618 Node* etrue = effect;
1615 Node* vtrue = ChangeSmiToInt32(value); 1619 Node* vtrue = ChangeSmiToInt32(value);
1616 1620
1617 // In the non-Smi case, check the heap numberness, load the number and convert 1621 // In the non-Smi case, check the heap numberness, load the number and convert
1618 // to int32. 1622 // to int32.
1619 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); 1623 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
1620 Node* efalse = effect; 1624 Node* efalse = effect;
1621 Node* vfalse; 1625 Node* vfalse;
1622 { 1626 {
1623 Node* value_map = efalse = 1627 Node* value_map = efalse =
1624 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), 1628 graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
1625 value, efalse, if_false); 1629 value, efalse, if_false);
1626 Node* check = graph()->NewNode(machine()->WordEqual(), value_map, 1630 Node* check = graph()->NewNode(machine()->WordEqual(), value_map,
1627 jsgraph()->HeapNumberMapConstant()); 1631 jsgraph()->HeapNumberMapConstant());
1628 if_false = efalse = graph()->NewNode( 1632 if_false = efalse = graph()->NewNode(
1629 common()->DeoptimizeUnless(DeoptimizeReason::kNotAHeapNumber), check, 1633 common()->DeoptimizeUnless(DeoptimizeReason::kNotAHeapNumber), check,
1630 frame_state, efalse, if_false); 1634 frame_state, efalse, if_false);
1631 vfalse = efalse = graph()->NewNode( 1635 vfalse = efalse = graph()->NewNode(
1632 simplified()->LoadField(AccessBuilder::ForHeapNumberValue()), value, 1636 simplified()->LoadField(AccessBuilder::ForHeapNumberValue()), value,
1633 efalse, if_false); 1637 efalse, if_false);
1634 ValueEffectControl state = 1638 ValueEffectControl state =
1635 BuildCheckedFloat64ToInt32(vfalse, frame_state, efalse, if_false); 1639 BuildCheckedFloat64ToInt32(mode, vfalse, frame_state, efalse, if_false);
1636 if_false = state.control; 1640 if_false = state.control;
1637 efalse = state.effect; 1641 efalse = state.effect;
1638 vfalse = state.value; 1642 vfalse = state.value;
1639 } 1643 }
1640 1644
1641 control = graph()->NewNode(common()->Merge(2), if_true, if_false); 1645 control = graph()->NewNode(common()->Merge(2), if_true, if_false);
1642 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control); 1646 effect = graph()->NewNode(common()->EffectPhi(2), etrue, efalse, control);
1643 value = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), 1647 value = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2),
1644 vtrue, vfalse, control); 1648 vtrue, vfalse, control);
1645 1649
(...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after
2714 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 2718 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
2715 Operator::kNoThrow); 2719 Operator::kNoThrow);
2716 to_number_operator_.set(common()->Call(desc)); 2720 to_number_operator_.set(common()->Call(desc));
2717 } 2721 }
2718 return to_number_operator_.get(); 2722 return to_number_operator_.get();
2719 } 2723 }
2720 2724
2721 } // namespace compiler 2725 } // namespace compiler
2722 } // namespace internal 2726 } // namespace internal
2723 } // namespace v8 2727 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/effect-control-linearizer.h ('k') | src/compiler/representation-change.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698