Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: src/compiler/bytecode-graph-builder.cc

Issue 1546683002: [Interpreter] Add support for jumps using constants with wide operands. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rationalize jumps in bytecode-graph-builder.cc. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698