| 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 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1457 BuildJump(); | 1457 BuildJump(); |
| 1458 } | 1458 } |
| 1459 | 1459 |
| 1460 | 1460 |
| 1461 void BytecodeGraphBuilder::VisitJumpConstant( | 1461 void BytecodeGraphBuilder::VisitJumpConstant( |
| 1462 const interpreter::BytecodeArrayIterator& iterator) { | 1462 const interpreter::BytecodeArrayIterator& iterator) { |
| 1463 BuildJump(); | 1463 BuildJump(); |
| 1464 } | 1464 } |
| 1465 | 1465 |
| 1466 | 1466 |
| 1467 void BytecodeGraphBuilder::VisitJumpConstantWide( |
| 1468 const interpreter::BytecodeArrayIterator& iterator) { |
| 1469 BuildJump(); |
| 1470 } |
| 1471 |
| 1472 |
| 1467 void BytecodeGraphBuilder::VisitJumpIfTrue( | 1473 void BytecodeGraphBuilder::VisitJumpIfTrue( |
| 1468 const interpreter::BytecodeArrayIterator& iterator) { | 1474 const interpreter::BytecodeArrayIterator& iterator) { |
| 1469 Node* condition = BuildCondition(jsgraph()->TrueConstant()); | 1475 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
| 1470 BuildConditionalJump(condition); | |
| 1471 } | 1476 } |
| 1472 | 1477 |
| 1473 | 1478 |
| 1474 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( | 1479 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( |
| 1475 const interpreter::BytecodeArrayIterator& iterator) { | 1480 const interpreter::BytecodeArrayIterator& iterator) { |
| 1476 Node* condition = BuildCondition(jsgraph()->TrueConstant()); | 1481 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
| 1477 BuildConditionalJump(condition); | 1482 } |
| 1483 |
| 1484 |
| 1485 void BytecodeGraphBuilder::VisitJumpIfTrueConstantWide( |
| 1486 const interpreter::BytecodeArrayIterator& iterator) { |
| 1487 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
| 1478 } | 1488 } |
| 1479 | 1489 |
| 1480 | 1490 |
| 1481 void BytecodeGraphBuilder::VisitJumpIfFalse( | 1491 void BytecodeGraphBuilder::VisitJumpIfFalse( |
| 1482 const interpreter::BytecodeArrayIterator& iterator) { | 1492 const interpreter::BytecodeArrayIterator& iterator) { |
| 1483 Node* condition = BuildCondition(jsgraph()->FalseConstant()); | 1493 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
| 1484 BuildConditionalJump(condition); | |
| 1485 } | 1494 } |
| 1486 | 1495 |
| 1487 | 1496 |
| 1488 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( | 1497 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( |
| 1489 const interpreter::BytecodeArrayIterator& iterator) { | 1498 const interpreter::BytecodeArrayIterator& iterator) { |
| 1490 Node* condition = BuildCondition(jsgraph()->FalseConstant()); | 1499 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
| 1491 BuildConditionalJump(condition); | 1500 } |
| 1501 |
| 1502 |
| 1503 void BytecodeGraphBuilder::VisitJumpIfFalseConstantWide( |
| 1504 const interpreter::BytecodeArrayIterator& iterator) { |
| 1505 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
| 1492 } | 1506 } |
| 1493 | 1507 |
| 1494 | 1508 |
| 1495 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( | 1509 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( |
| 1496 const interpreter::BytecodeArrayIterator& iterator) { | 1510 const interpreter::BytecodeArrayIterator& iterator) { |
| 1497 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); | 1511 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
| 1498 BuildConditionalJump(condition); | |
| 1499 } | 1512 } |
| 1500 | 1513 |
| 1501 | 1514 |
| 1502 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( | 1515 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( |
| 1503 const interpreter::BytecodeArrayIterator& iterator) { | 1516 const interpreter::BytecodeArrayIterator& iterator) { |
| 1504 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); | 1517 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
| 1505 BuildConditionalJump(condition); | 1518 } |
| 1519 |
| 1520 |
| 1521 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstantWide( |
| 1522 const interpreter::BytecodeArrayIterator& iterator) { |
| 1523 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
| 1506 } | 1524 } |
| 1507 | 1525 |
| 1508 | 1526 |
| 1509 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( | 1527 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( |
| 1510 const interpreter::BytecodeArrayIterator& iterator) { | 1528 const interpreter::BytecodeArrayIterator& iterator) { |
| 1511 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); | 1529 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
| 1512 BuildConditionalJump(condition); | |
| 1513 } | 1530 } |
| 1514 | 1531 |
| 1515 | 1532 |
| 1516 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( | 1533 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( |
| 1517 const interpreter::BytecodeArrayIterator& iterator) { | 1534 const interpreter::BytecodeArrayIterator& iterator) { |
| 1518 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); | 1535 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
| 1519 BuildConditionalJump(condition); | 1536 } |
| 1537 |
| 1538 |
| 1539 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstantWide( |
| 1540 const interpreter::BytecodeArrayIterator& iterator) { |
| 1541 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
| 1520 } | 1542 } |
| 1521 | 1543 |
| 1522 | 1544 |
| 1523 void BytecodeGraphBuilder::VisitJumpIfNull( | 1545 void BytecodeGraphBuilder::VisitJumpIfNull( |
| 1524 const interpreter::BytecodeArrayIterator& iterator) { | 1546 const interpreter::BytecodeArrayIterator& iterator) { |
| 1525 Node* condition = BuildCondition(jsgraph()->NullConstant()); | 1547 BuildJumpIfEqual(jsgraph()->NullConstant()); |
| 1526 BuildConditionalJump(condition); | |
| 1527 } | 1548 } |
| 1528 | 1549 |
| 1529 | 1550 |
| 1530 void BytecodeGraphBuilder::VisitJumpIfNullConstant( | 1551 void BytecodeGraphBuilder::VisitJumpIfNullConstant( |
| 1531 const interpreter::BytecodeArrayIterator& iterator) { | 1552 const interpreter::BytecodeArrayIterator& iterator) { |
| 1532 Node* condition = BuildCondition(jsgraph()->NullConstant()); | 1553 BuildJumpIfEqual(jsgraph()->NullConstant()); |
| 1533 BuildConditionalJump(condition); | 1554 } |
| 1555 |
| 1556 |
| 1557 void BytecodeGraphBuilder::VisitJumpIfNullConstantWide( |
| 1558 const interpreter::BytecodeArrayIterator& iterator) { |
| 1559 BuildJumpIfEqual(jsgraph()->NullConstant()); |
| 1534 } | 1560 } |
| 1535 | 1561 |
| 1536 | 1562 |
| 1537 void BytecodeGraphBuilder::VisitJumpIfUndefined( | 1563 void BytecodeGraphBuilder::VisitJumpIfUndefined( |
| 1538 const interpreter::BytecodeArrayIterator& iterator) { | 1564 const interpreter::BytecodeArrayIterator& iterator) { |
| 1539 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); | 1565 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1540 BuildConditionalJump(condition); | |
| 1541 } | 1566 } |
| 1542 | 1567 |
| 1543 | 1568 |
| 1544 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( | 1569 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( |
| 1545 const interpreter::BytecodeArrayIterator& iterator) { | 1570 const interpreter::BytecodeArrayIterator& iterator) { |
| 1546 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); | 1571 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1547 BuildConditionalJump(condition); | |
| 1548 } | 1572 } |
| 1549 | 1573 |
| 1550 | 1574 |
| 1575 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstantWide( |
| 1576 const interpreter::BytecodeArrayIterator& iterator) { |
| 1577 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1578 } |
| 1579 |
| 1580 |
| 1551 void BytecodeGraphBuilder::VisitReturn( | 1581 void BytecodeGraphBuilder::VisitReturn( |
| 1552 const interpreter::BytecodeArrayIterator& iterator) { | 1582 const interpreter::BytecodeArrayIterator& iterator) { |
| 1553 Node* control = | 1583 Node* control = |
| 1554 NewNode(common()->Return(), environment()->LookupAccumulator()); | 1584 NewNode(common()->Return(), environment()->LookupAccumulator()); |
| 1555 UpdateControlDependencyToLeaveFunction(control); | 1585 UpdateControlDependencyToLeaveFunction(control); |
| 1556 set_environment(nullptr); | 1586 set_environment(nullptr); |
| 1557 } | 1587 } |
| 1558 | 1588 |
| 1559 | 1589 |
| 1560 void BytecodeGraphBuilder::VisitForInPrepare( | 1590 void BytecodeGraphBuilder::VisitForInPrepare( |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1682 int source_offset = bytecode_iterator()->current_offset(); | 1712 int source_offset = bytecode_iterator()->current_offset(); |
| 1683 NewBranch(condition); | 1713 NewBranch(condition); |
| 1684 Environment* if_false_environment = environment()->CopyForConditional(); | 1714 Environment* if_false_environment = environment()->CopyForConditional(); |
| 1685 NewIfTrue(); | 1715 NewIfTrue(); |
| 1686 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); | 1716 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); |
| 1687 set_environment(if_false_environment); | 1717 set_environment(if_false_environment); |
| 1688 NewIfFalse(); | 1718 NewIfFalse(); |
| 1689 } | 1719 } |
| 1690 | 1720 |
| 1691 | 1721 |
| 1692 Node* BytecodeGraphBuilder::BuildCondition(Node* comperand) { | 1722 void BytecodeGraphBuilder::BuildJumpIfEqual(Node* comperand) { |
| 1693 Node* accumulator = environment()->LookupAccumulator(); | 1723 Node* accumulator = environment()->LookupAccumulator(); |
| 1694 return NewNode(javascript()->StrictEqual(), accumulator, comperand); | 1724 Node* condition = |
| 1725 NewNode(javascript()->StrictEqual(), accumulator, comperand); |
| 1726 BuildConditionalJump(condition); |
| 1695 } | 1727 } |
| 1696 | 1728 |
| 1697 | 1729 |
| 1698 Node* BytecodeGraphBuilder::BuildToBooleanCondition(Node* comperand) { | 1730 void BytecodeGraphBuilder::BuildJumpIfToBooleanEqual(Node* comperand) { |
| 1699 Node* accumulator = environment()->LookupAccumulator(); | 1731 Node* accumulator = environment()->LookupAccumulator(); |
| 1700 Node* to_boolean = | 1732 Node* to_boolean = |
| 1701 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); | 1733 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); |
| 1702 return NewNode(javascript()->StrictEqual(), to_boolean, comperand); | 1734 Node* condition = NewNode(javascript()->StrictEqual(), to_boolean, comperand); |
| 1735 BuildConditionalJump(condition); |
| 1703 } | 1736 } |
| 1704 | 1737 |
| 1705 | 1738 |
| 1706 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { | 1739 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { |
| 1707 if (size > input_buffer_size_) { | 1740 if (size > input_buffer_size_) { |
| 1708 size = size + kInputBufferSizeIncrement + input_buffer_size_; | 1741 size = size + kInputBufferSizeIncrement + input_buffer_size_; |
| 1709 input_buffer_ = local_zone()->NewArray<Node*>(size); | 1742 input_buffer_ = local_zone()->NewArray<Node*>(size); |
| 1710 input_buffer_size_ = size; | 1743 input_buffer_size_ = size; |
| 1711 } | 1744 } |
| 1712 return input_buffer_; | 1745 return input_buffer_; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1853 | 1886 |
| 1854 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 1887 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { |
| 1855 if (environment()->IsMarkedAsUnreachable()) return; | 1888 if (environment()->IsMarkedAsUnreachable()) return; |
| 1856 environment()->MarkAsUnreachable(); | 1889 environment()->MarkAsUnreachable(); |
| 1857 exit_controls_.push_back(exit); | 1890 exit_controls_.push_back(exit); |
| 1858 } | 1891 } |
| 1859 | 1892 |
| 1860 } // namespace compiler | 1893 } // namespace compiler |
| 1861 } // namespace internal | 1894 } // namespace internal |
| 1862 } // namespace v8 | 1895 } // namespace v8 |
| OLD | NEW |