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 1410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1421 BuildJump(); | 1421 BuildJump(); |
1422 } | 1422 } |
1423 | 1423 |
1424 | 1424 |
1425 void BytecodeGraphBuilder::VisitJumpConstant( | 1425 void BytecodeGraphBuilder::VisitJumpConstant( |
1426 const interpreter::BytecodeArrayIterator& iterator) { | 1426 const interpreter::BytecodeArrayIterator& iterator) { |
1427 BuildJump(); | 1427 BuildJump(); |
1428 } | 1428 } |
1429 | 1429 |
1430 | 1430 |
| 1431 void BytecodeGraphBuilder::VisitJumpConstantWide( |
| 1432 const interpreter::BytecodeArrayIterator& iterator) { |
| 1433 BuildJump(); |
| 1434 } |
| 1435 |
| 1436 |
1431 void BytecodeGraphBuilder::VisitJumpIfTrue( | 1437 void BytecodeGraphBuilder::VisitJumpIfTrue( |
1432 const interpreter::BytecodeArrayIterator& iterator) { | 1438 const interpreter::BytecodeArrayIterator& iterator) { |
1433 Node* condition = BuildCondition(jsgraph()->TrueConstant()); | 1439 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
1434 BuildConditionalJump(condition); | |
1435 } | 1440 } |
1436 | 1441 |
1437 | 1442 |
1438 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( | 1443 void BytecodeGraphBuilder::VisitJumpIfTrueConstant( |
1439 const interpreter::BytecodeArrayIterator& iterator) { | 1444 const interpreter::BytecodeArrayIterator& iterator) { |
1440 Node* condition = BuildCondition(jsgraph()->TrueConstant()); | 1445 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
1441 BuildConditionalJump(condition); | 1446 } |
| 1447 |
| 1448 |
| 1449 void BytecodeGraphBuilder::VisitJumpIfTrueConstantWide( |
| 1450 const interpreter::BytecodeArrayIterator& iterator) { |
| 1451 BuildJumpIfEqual(jsgraph()->TrueConstant()); |
1442 } | 1452 } |
1443 | 1453 |
1444 | 1454 |
1445 void BytecodeGraphBuilder::VisitJumpIfFalse( | 1455 void BytecodeGraphBuilder::VisitJumpIfFalse( |
1446 const interpreter::BytecodeArrayIterator& iterator) { | 1456 const interpreter::BytecodeArrayIterator& iterator) { |
1447 Node* condition = BuildCondition(jsgraph()->FalseConstant()); | 1457 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
1448 BuildConditionalJump(condition); | |
1449 } | 1458 } |
1450 | 1459 |
1451 | 1460 |
1452 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( | 1461 void BytecodeGraphBuilder::VisitJumpIfFalseConstant( |
1453 const interpreter::BytecodeArrayIterator& iterator) { | 1462 const interpreter::BytecodeArrayIterator& iterator) { |
1454 Node* condition = BuildCondition(jsgraph()->FalseConstant()); | 1463 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
1455 BuildConditionalJump(condition); | 1464 } |
| 1465 |
| 1466 |
| 1467 void BytecodeGraphBuilder::VisitJumpIfFalseConstantWide( |
| 1468 const interpreter::BytecodeArrayIterator& iterator) { |
| 1469 BuildJumpIfEqual(jsgraph()->FalseConstant()); |
1456 } | 1470 } |
1457 | 1471 |
1458 | 1472 |
1459 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( | 1473 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrue( |
1460 const interpreter::BytecodeArrayIterator& iterator) { | 1474 const interpreter::BytecodeArrayIterator& iterator) { |
1461 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); | 1475 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
1462 BuildConditionalJump(condition); | |
1463 } | 1476 } |
1464 | 1477 |
1465 | 1478 |
1466 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( | 1479 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstant( |
1467 const interpreter::BytecodeArrayIterator& iterator) { | 1480 const interpreter::BytecodeArrayIterator& iterator) { |
1468 Node* condition = BuildToBooleanCondition(jsgraph()->TrueConstant()); | 1481 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
1469 BuildConditionalJump(condition); | 1482 } |
| 1483 |
| 1484 |
| 1485 void BytecodeGraphBuilder::VisitJumpIfToBooleanTrueConstantWide( |
| 1486 const interpreter::BytecodeArrayIterator& iterator) { |
| 1487 BuildJumpIfToBooleanEqual(jsgraph()->TrueConstant()); |
1470 } | 1488 } |
1471 | 1489 |
1472 | 1490 |
1473 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( | 1491 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalse( |
1474 const interpreter::BytecodeArrayIterator& iterator) { | 1492 const interpreter::BytecodeArrayIterator& iterator) { |
1475 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); | 1493 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
1476 BuildConditionalJump(condition); | |
1477 } | 1494 } |
1478 | 1495 |
1479 | 1496 |
1480 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( | 1497 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstant( |
1481 const interpreter::BytecodeArrayIterator& iterator) { | 1498 const interpreter::BytecodeArrayIterator& iterator) { |
1482 Node* condition = BuildToBooleanCondition(jsgraph()->FalseConstant()); | 1499 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
1483 BuildConditionalJump(condition); | 1500 } |
| 1501 |
| 1502 |
| 1503 void BytecodeGraphBuilder::VisitJumpIfToBooleanFalseConstantWide( |
| 1504 const interpreter::BytecodeArrayIterator& iterator) { |
| 1505 BuildJumpIfToBooleanEqual(jsgraph()->FalseConstant()); |
1484 } | 1506 } |
1485 | 1507 |
1486 | 1508 |
1487 void BytecodeGraphBuilder::VisitJumpIfNull( | 1509 void BytecodeGraphBuilder::VisitJumpIfNull( |
1488 const interpreter::BytecodeArrayIterator& iterator) { | 1510 const interpreter::BytecodeArrayIterator& iterator) { |
1489 Node* condition = BuildCondition(jsgraph()->NullConstant()); | 1511 BuildJumpIfEqual(jsgraph()->NullConstant()); |
1490 BuildConditionalJump(condition); | |
1491 } | 1512 } |
1492 | 1513 |
1493 | 1514 |
1494 void BytecodeGraphBuilder::VisitJumpIfNullConstant( | 1515 void BytecodeGraphBuilder::VisitJumpIfNullConstant( |
1495 const interpreter::BytecodeArrayIterator& iterator) { | 1516 const interpreter::BytecodeArrayIterator& iterator) { |
1496 Node* condition = BuildCondition(jsgraph()->NullConstant()); | 1517 BuildJumpIfEqual(jsgraph()->NullConstant()); |
1497 BuildConditionalJump(condition); | 1518 } |
| 1519 |
| 1520 |
| 1521 void BytecodeGraphBuilder::VisitJumpIfNullConstantWide( |
| 1522 const interpreter::BytecodeArrayIterator& iterator) { |
| 1523 BuildJumpIfEqual(jsgraph()->NullConstant()); |
1498 } | 1524 } |
1499 | 1525 |
1500 | 1526 |
1501 void BytecodeGraphBuilder::VisitJumpIfUndefined( | 1527 void BytecodeGraphBuilder::VisitJumpIfUndefined( |
1502 const interpreter::BytecodeArrayIterator& iterator) { | 1528 const interpreter::BytecodeArrayIterator& iterator) { |
1503 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); | 1529 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
1504 BuildConditionalJump(condition); | |
1505 } | 1530 } |
1506 | 1531 |
1507 | 1532 |
1508 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( | 1533 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstant( |
1509 const interpreter::BytecodeArrayIterator& iterator) { | 1534 const interpreter::BytecodeArrayIterator& iterator) { |
1510 Node* condition = BuildCondition(jsgraph()->UndefinedConstant()); | 1535 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
1511 BuildConditionalJump(condition); | |
1512 } | 1536 } |
1513 | 1537 |
1514 | 1538 |
| 1539 void BytecodeGraphBuilder::VisitJumpIfUndefinedConstantWide( |
| 1540 const interpreter::BytecodeArrayIterator& iterator) { |
| 1541 BuildJumpIfEqual(jsgraph()->UndefinedConstant()); |
| 1542 } |
| 1543 |
| 1544 |
1515 void BytecodeGraphBuilder::VisitReturn( | 1545 void BytecodeGraphBuilder::VisitReturn( |
1516 const interpreter::BytecodeArrayIterator& iterator) { | 1546 const interpreter::BytecodeArrayIterator& iterator) { |
1517 Node* control = | 1547 Node* control = |
1518 NewNode(common()->Return(), environment()->LookupAccumulator()); | 1548 NewNode(common()->Return(), environment()->LookupAccumulator()); |
1519 UpdateControlDependencyToLeaveFunction(control); | 1549 UpdateControlDependencyToLeaveFunction(control); |
1520 set_environment(nullptr); | 1550 set_environment(nullptr); |
1521 } | 1551 } |
1522 | 1552 |
1523 | 1553 |
1524 void BytecodeGraphBuilder::VisitForInPrepare( | 1554 void BytecodeGraphBuilder::VisitForInPrepare( |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1646 int source_offset = bytecode_iterator()->current_offset(); | 1676 int source_offset = bytecode_iterator()->current_offset(); |
1647 NewBranch(condition); | 1677 NewBranch(condition); |
1648 Environment* if_false_environment = environment()->CopyForConditional(); | 1678 Environment* if_false_environment = environment()->CopyForConditional(); |
1649 NewIfTrue(); | 1679 NewIfTrue(); |
1650 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); | 1680 BuildJump(source_offset, bytecode_iterator()->GetJumpTargetOffset()); |
1651 set_environment(if_false_environment); | 1681 set_environment(if_false_environment); |
1652 NewIfFalse(); | 1682 NewIfFalse(); |
1653 } | 1683 } |
1654 | 1684 |
1655 | 1685 |
1656 Node* BytecodeGraphBuilder::BuildCondition(Node* comperand) { | 1686 void BytecodeGraphBuilder::BuildJumpIfEqual(Node* comperand) { |
1657 Node* accumulator = environment()->LookupAccumulator(); | 1687 Node* accumulator = environment()->LookupAccumulator(); |
1658 return NewNode(javascript()->StrictEqual(), accumulator, comperand); | 1688 Node* condition = |
| 1689 NewNode(javascript()->StrictEqual(), accumulator, comperand); |
| 1690 BuildConditionalJump(condition); |
1659 } | 1691 } |
1660 | 1692 |
1661 | 1693 |
1662 Node* BytecodeGraphBuilder::BuildToBooleanCondition(Node* comperand) { | 1694 void BytecodeGraphBuilder::BuildJumpIfToBooleanEqual(Node* comperand) { |
1663 Node* accumulator = environment()->LookupAccumulator(); | 1695 Node* accumulator = environment()->LookupAccumulator(); |
1664 Node* to_boolean = | 1696 Node* to_boolean = |
1665 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); | 1697 NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), accumulator); |
1666 return NewNode(javascript()->StrictEqual(), to_boolean, comperand); | 1698 Node* condition = NewNode(javascript()->StrictEqual(), to_boolean, comperand); |
| 1699 BuildConditionalJump(condition); |
1667 } | 1700 } |
1668 | 1701 |
1669 | 1702 |
1670 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { | 1703 Node** BytecodeGraphBuilder::EnsureInputBufferSize(int size) { |
1671 if (size > input_buffer_size_) { | 1704 if (size > input_buffer_size_) { |
1672 size = size + kInputBufferSizeIncrement + input_buffer_size_; | 1705 size = size + kInputBufferSizeIncrement + input_buffer_size_; |
1673 input_buffer_ = local_zone()->NewArray<Node*>(size); | 1706 input_buffer_ = local_zone()->NewArray<Node*>(size); |
1674 input_buffer_size_ = size; | 1707 input_buffer_size_ = size; |
1675 } | 1708 } |
1676 return input_buffer_; | 1709 return input_buffer_; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1817 | 1850 |
1818 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { | 1851 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { |
1819 if (environment()->IsMarkedAsUnreachable()) return; | 1852 if (environment()->IsMarkedAsUnreachable()) return; |
1820 environment()->MarkAsUnreachable(); | 1853 environment()->MarkAsUnreachable(); |
1821 exit_controls_.push_back(exit); | 1854 exit_controls_.push_back(exit); |
1822 } | 1855 } |
1823 | 1856 |
1824 } // namespace compiler | 1857 } // namespace compiler |
1825 } // namespace internal | 1858 } // namespace internal |
1826 } // namespace v8 | 1859 } // namespace v8 |
OLD | NEW |