| 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 |