| 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/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler/bytecode-branch-analysis.h" | 7 #include "src/compiler/bytecode-branch-analysis.h" |
| 8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
| 9 #include "src/compiler/operator-properties.h" | 9 #include "src/compiler/operator-properties.h" |
| 10 #include "src/interpreter/bytecodes.h" | 10 #include "src/interpreter/bytecodes.h" |
| (...skipping 1471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1482 BuildJump(); | 1482 BuildJump(); |
| 1483 } | 1483 } |
| 1484 | 1484 |
| 1485 | 1485 |
| 1486 void BytecodeGraphBuilder::VisitJumpConstant( | 1486 void BytecodeGraphBuilder::VisitJumpConstant( |
| 1487 const interpreter::BytecodeArrayIterator& iterator) { | 1487 const interpreter::BytecodeArrayIterator& iterator) { |
| 1488 BuildJump(); | 1488 BuildJump(); |
| 1489 } | 1489 } |
| 1490 | 1490 |
| 1491 | 1491 |
| 1492 void BytecodeGraphBuilder::VisitJumpConstantWide( |
| 1493 const interpreter::BytecodeArrayIterator& iterator) { |
| 1494 BuildJump(); |
| 1495 } |
| 1496 |
| 1497 |
| 1492 void BytecodeGraphBuilder::VisitJumpIfTrue( | 1498 void BytecodeGraphBuilder::VisitJumpIfTrue( |
| 1493 const interpreter::BytecodeArrayIterator& iterator) { | 1499 const interpreter::BytecodeArrayIterator& iterator) { |
| 1494 Node* condition = BuildCondition(jsgraph()->TrueConstant()); | 1500 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
| 1495 BuildConditionalJump(condition); | |
| 1496 } | 1501 } |
| 1497 | 1502 |
| 1498 | 1503 |
| 1499 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( | 1504 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( |
| 1500 const interpreter::BytecodeArrayIterator& iterator) { | 1505 const interpreter::BytecodeArrayIterator& iterator) { |
| 1501 Node* condition = BuildCondition(jsgraph()->TrueConstant()); | 1506 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
| 1502 BuildConditionalJump(condition); | 1507 } |
| 1508 |
| 1509 |
| 1510 void BytecodeGraphBuilder::VisitJumpIfTrueConstantWide( |
| 1511 const interpreter::BytecodeArrayIterator& iterator) { |
| 1512 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
| 1503 } | 1513 } |
| 1504 | 1514 |
| 1505 | 1515 |
| 1506 void BytecodeGraphBuilder::VisitJumpIfFalse( | 1516 void BytecodeGraphBuilder::VisitJumpIfFalse( |
| 1507 const interpreter::BytecodeArrayIterator& iterator) { | 1517 const interpreter::BytecodeArrayIterator& iterator) { |
| 1508 Node* condition = BuildCondition(jsgraph()->FalseConstant()); | 1518 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
| 1509 BuildConditionalJump(condition); | |
| 1510 } | 1519 } |
| 1511 | 1520 |
| 1512 | 1521 |
| 1513 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( | 1522 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( |
| 1514 const interpreter::BytecodeArrayIterator& iterator) { | 1523 const interpreter::BytecodeArrayIterator& iterator) { |
| 1515 Node* condition = BuildCondition(jsgraph()->FalseConstant()); | 1524 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
| 1516 BuildConditionalJump(condition); | 1525 } |
| 1526 |
| 1527 |
| 1528 void BytecodeGraphBuilder::VisitJumpIfFalseConstantWide( |
| 1529 const interpreter::BytecodeArrayIterator& iterator) { |
| 1530 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
| 1517 } | 1531 } |
| 1518 | 1532 |
| 1519 | 1533 |
| 1520 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( | 1534 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( |
| 1521 const interpreter::BytecodeArrayIterator& iterator) { | 1535 const interpreter::BytecodeArrayIterator& iterator) { |
| 1522 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); | 1536 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
| 1523 BuildConditionalJump(condition); | |
| 1524 } | 1537 } |
| 1525 | 1538 |
| 1526 | 1539 |
| 1527 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( | 1540 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( |
| 1528 const interpreter::BytecodeArrayIterator& iterator) { | 1541 const interpreter::BytecodeArrayIterator& iterator) { |
| 1529 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); | 1542 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
| 1530 BuildConditionalJump(condition); | 1543 } |
| 1544 |
| 1545 |
| 1546 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstantWide( |
| 1547 const interpreter::BytecodeArrayIterator& iterator) { |
| 1548 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
| 1531 } | 1549 } |
| 1532 | 1550 |
| 1533 | 1551 |
| 1534 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( | 1552 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( |
| 1535 const interpreter::BytecodeArrayIterator& iterator) { | 1553 const interpreter::BytecodeArrayIterator& iterator) { |
| 1536 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); | 1554 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
| 1537 BuildConditionalJump(condition); | |
| 1538 } | 1555 } |
| 1539 | 1556 |
| 1540 | 1557 |
| 1541 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( | 1558 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( |
| 1542 const interpreter::BytecodeArrayIterator& iterator) { | 1559 const interpreter::BytecodeArrayIterator& iterator) { |
| 1543 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); | 1560 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
| 1544 BuildConditionalJump(condition); | 1561 } |
| 1562 |
| 1563 |
| 1564 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstantWide( |
| 1565 const interpreter::BytecodeArrayIterator& iterator) { |
| 1566 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
| 1545 } | 1567 } |
| 1546 | 1568 |
| 1547 | 1569 |
| 1548 void BytecodeGraphBuilder::VisitJumpIfNull( | 1570 void BytecodeGraphBuilder::VisitJumpIfNull( |
| 1549 const interpreter::BytecodeArrayIterator& iterator) { | 1571 const interpreter::BytecodeArrayIterator& iterator) { |
| 1550 Node* condition = BuildCondition(jsgraph()->NullConstant()); | 1572 BuildJumpIfEqual(jsgraph()->NullConstant()); |
| 1551 BuildConditionalJump(condition); | |
| 1552 } | 1573 } |
| 1553 | 1574 |
| 1554 | 1575 |
| 1555 void BytecodeGraphBuilder::VisitJumpIfNullConstant( | 1576 void BytecodeGraphBuilder::VisitJumpIfNullConstant( |
| 1556 const interpreter::BytecodeArrayIterator& iterator) { | 1577 const interpreter::BytecodeArrayIterator& iterator) { |
| 1557 Node* condition = BuildCondition(jsgraph()->NullConstant()); | 1578 BuildJumpIfEqual(jsgraph()->NullConstant()); |
| 1558 BuildConditionalJump(condition); | 1579 } |
| 1580 |
| 1581 |
| 1582 void BytecodeGraphBuilder::VisitJumpIfNullConstantWide( |
| 1583 const interpreter::BytecodeArrayIterator& iterator) { |
| 1584 BuildJumpIfEqual(jsgraph()->NullConstant()); |
| 1559 } | 1585 } |
| 1560 | 1586 |
| 1561 | 1587 |
| 1562 void BytecodeGraphBuilder::VisitJumpIfUndefined( | 1588 void BytecodeGraphBuilder::VisitJumpIfUndefined( |
| 1563 const interpreter::BytecodeArrayIterator& iterator) { | 1589 const interpreter::BytecodeArrayIterator& iterator) { |
| 1564 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); | 1590 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1565 BuildConditionalJump(condition); | |
| 1566 } | 1591 } |
| 1567 | 1592 |
| 1568 | 1593 |
| 1569 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( | 1594 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( |
| 1570 const interpreter::BytecodeArrayIterator& iterator) { | 1595 const interpreter::BytecodeArrayIterator& iterator) { |
| 1571 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); | 1596 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1572 BuildConditionalJump(condition); | |
| 1573 } | 1597 } |
| 1574 | 1598 |
| 1575 | 1599 |
| 1600 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstantWide( |
| 1601 const interpreter::BytecodeArrayIterator& iterator) { |
| 1602 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1603 } |
| 1604 |
| 1605 |
| 1576 void BytecodeGraphBuilder::VisitReturn( | 1606 void BytecodeGraphBuilder::VisitReturn( |
| 1577 const interpreter::BytecodeArrayIterator& iterator) { | 1607 const interpreter::BytecodeArrayIterator& iterator) { |
| 1578 Node* control = | 1608 Node* control = |
| 1579 NewNode(common()->Return(), environment()->LookupAccumulator()); | 1609 NewNode(common()->Return(), environment()->LookupAccumulator()); |
| 1580 UpdateControlDependencyToLeaveFunction(control); | 1610 UpdateControlDependencyToLeaveFunction(control); |
| 1581 set_environment(nullptr); | 1611 set_environment(nullptr); |
| 1582 } | 1612 } |
| 1583 | 1613 |
| 1584 | 1614 |
| 1585 void BytecodeGraphBuilder::VisitForInPrepare( | 1615 void BytecodeGraphBuilder::VisitForInPrepare( |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1707 int source_offset = bytecode_iterator()->current_offset(); | 1737 int source_offset = bytecode_iterator()->current_offset(); |
| 1708 NewBranch(condition); | 1738 NewBranch(condition); |
| 1709 Environment* if_false_environment = environment()->CopyForConditional(); | 1739 Environment* if_false_environment = environment()->CopyForConditional(); |
| 1710 NewIfTrue(); | 1740 NewIfTrue(); |
| 1711 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); | 1741 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); |
| 1712 set_environment(if_false_environment); | 1742 set_environment(if_false_environment); |
| 1713 NewIfFalse(); | 1743 NewIfFalse(); |
| 1714 } | 1744 } |
| 1715 | 1745 |
| 1716 | 1746 |
| 1717 Node* BytecodeGraphBuilder::BuildCondition(Node* comperand) { | 1747 void BytecodeGraphBuilder::BuildJumpIfEqual(Node* comperand) { |
| 1718 Node* accumulator = environment()->LookupAccumulator(); | 1748 Node* accumulator = environment()->LookupAccumulator(); |
| 1719 return NewNode(javascript()->StrictEqual(), accumulator, comperand); | 1749 Node* condition = |
| 1750 NewNode(javascript()->StrictEqual(), accumulator, comperand); |
| 1751 BuildConditionalJump(condition); |
| 1720 } | 1752 } |
| 1721 | 1753 |
| 1722 | 1754 |
| 1723 Node* BytecodeGraphBuilder::BuildToBooleanCondition(Node* comperand) { | 1755 void BytecodeGraphBuilder::BuildJumpIfToBooleanEqual(Node* comperand) { |
| 1724 Node* accumulator = environment()->LookupAccumulator(); | 1756 Node* accumulator = environment()->LookupAccumulator(); |
| 1725 Node* to_boolean = | 1757 Node* to_boolean = |
| 1726 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); | 1758 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); |
| 1727 return NewNode(javascript()->StrictEqual(), to_boolean, comperand); | 1759 Node* condition = NewNode(javascript()->StrictEqual(), to_boolean, comperand); |
| 1760 BuildConditionalJump(condition); |
| 1728 } | 1761 } |
| 1729 | 1762 |
| 1730 | 1763 |
| 1731 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { | 1764 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { |
| 1732 if (size > input_buffer_size_) { | 1765 if (size > input_buffer_size_) { |
| 1733 size = size + kInputBufferSizeIncrement + input_buffer_size_; | 1766 size = size + kInputBufferSizeIncrement + input_buffer_size_; |
| 1734 input_buffer_ = local_zone()->NewArray<Node*>(size); | 1767 input_buffer_ = local_zone()->NewArray<Node*>(size); |
| 1735 input_buffer_size_ = size; | 1768 input_buffer_size_ = size; |
| 1736 } | 1769 } |
| 1737 return input_buffer_; | 1770 return input_buffer_; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1878 | 1911 |
| 1879 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 1912 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { |
| 1880 if (environment()->IsMarkedAsUnreachable()) return; | 1913 if (environment()->IsMarkedAsUnreachable()) return; |
| 1881 environment()->MarkAsUnreachable(); | 1914 environment()->MarkAsUnreachable(); |
| 1882 exit_controls_.push_back(exit); | 1915 exit_controls_.push_back(exit); |
| 1883 } | 1916 } |
| 1884 | 1917 |
| 1885 } // namespace compiler | 1918 } // namespace compiler |
| 1886 } // namespace internal | 1919 } // namespace internal |
| 1887 } // namespace v8 | 1920 } // namespace v8 |
| OLD | NEW |