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 |