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 |