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

Side by Side Diff: test/cctest/interpreter/test-bytecode-generator.cc

Issue 1414193006: [Interpreter] Removes unnecessary jumps and dead code from If and loops. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/interpreter/bytecode-array-iterator.h" 8 #include "src/interpreter/bytecode-array-iterator.h"
9 #include "src/interpreter/bytecode-generator.h" 9 #include "src/interpreter/bytecode-generator.h"
10 #include "src/interpreter/interpreter.h" 10 #include "src/interpreter/interpreter.h"
(...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 TEST(IfConditions) { 1247 TEST(IfConditions) {
1248 InitializedHandleScope handle_scope; 1248 InitializedHandleScope handle_scope;
1249 BytecodeGeneratorHelper helper; 1249 BytecodeGeneratorHelper helper;
1250 1250
1251 Handle<Object> unused = helper.factory()->undefined_value(); 1251 Handle<Object> unused = helper.factory()->undefined_value();
1252 1252
1253 ExpectedSnippet<Handle<Object>> snippets[] = { 1253 ExpectedSnippet<Handle<Object>> snippets[] = {
1254 {"function f() { if (0) { return 1; } else { return -1; } } f()", 1254 {"function f() { if (0) { return 1; } else { return -1; } } f()",
1255 0, 1255 0,
1256 1, 1256 1,
1257 14, 1257 5,
1258 {B(LdaZero), // 1258 {B(LdaSmi8), U8(-1), //
1259 B(ToBoolean), // 1259 B(Return), //
1260 B(JumpIfFalse), U8(7), // 1260 B(LdaUndefined), //
oth 2015/10/30 09:46:19 It looks like our logic for detecting when to emit
mythria 2015/10/30 15:07:47 I am not sure if it is easy to eliminate return he
oth 2015/10/30 15:31:34 Yes.
1261 B(LdaSmi8), U8(1), // 1261 B(Return)}, //
1262 B(Return), //
1263 B(Jump), U8(5), //
1264 B(LdaSmi8), U8(-1), //
1265 B(Return), //
1266 B(LdaUndefined), //
1267 B(Return)}, //
1268 0, 1262 0,
1269 {unused, unused, unused, unused, unused, unused}}, 1263 {unused, unused, unused, unused, unused, unused}},
1270 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", 1264 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();",
1271 0, 1265 0,
1272 1, 1266 1,
1273 15, 1267 5,
1274 {B(LdaConstant), U8(0), // 1268 {B(LdaSmi8), U8(1), //
1275 B(ToBoolean), // 1269 B(Return), //
1276 B(JumpIfFalse), U8(7), // 1270 B(LdaUndefined), //
1277 B(LdaSmi8), U8(1), // 1271 B(Return)}, //
1278 B(Return), // 1272 0,
1279 B(Jump), U8(5), // 1273 {unused, unused, unused, unused, unused, unused}},
1280 B(LdaSmi8), U8(-1), //
1281 B(Return), //
1282 B(LdaUndefined), //
1283 B(Return)}, //
1284 1,
1285 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused,
1286 unused, unused, unused}},
1287 {"function f() { if (false) { return 1; } else { return -1; } } f();", 1274 {"function f() { if (false) { return 1; } else { return -1; } } f();",
1288 0, 1275 0,
1289 1, 1276 1,
1290 13, 1277 5,
1291 {B(LdaFalse), // 1278 {B(LdaSmi8), U8(-1), //
1292 B(JumpIfFalse), U8(7), // 1279 B(Return), //
1293 B(LdaSmi8), U8(1), // 1280 B(LdaUndefined), //
1294 B(Return), // 1281 B(Return)}, //
1295 B(Jump), U8(5), // 1282 0,
1296 B(LdaSmi8), U8(-1), // 1283 {unused, unused, unused, unused, unused, unused}},
1297 B(Return), // 1284 {"function f() { if (false) { return 1; } } f();",
1298 B(LdaUndefined), // 1285 0,
1299 B(Return)}, // 1286 1,
1287 2,
1288 {B(LdaUndefined), B(Return)},
1300 0, 1289 0,
1301 {unused, unused, unused, unused, unused, unused}}, 1290 {unused, unused, unused, unused, unused, unused}},
1302 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" 1291 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }"
1303 "f(99);", 1292 "f(99);",
1304 0, 1293 0,
1305 2, 1294 2,
1306 15, 1295 15,
1307 {B(LdaZero), // 1296 {B(LdaZero), //
1308 B(TestLessThanOrEqual), A(1, 2), // 1297 B(TestLessThanOrEqual), A(1, 2), //
1309 B(JumpIfFalse), U8(7), // 1298 B(JumpIfFalse), U8(7), //
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1568 " if (i < 0) continue;" 1557 " if (i < 0) continue;"
1569 " if (i == 3) break;" 1558 " if (i == 3) break;"
1570 " if (i == 4) break;" 1559 " if (i == 4) break;"
1571 " if (i == 10) continue;" 1560 " if (i == 10) continue;"
1572 " if (i == 5) break;" 1561 " if (i == 5) break;"
1573 " i = i + 1;" 1562 " i = i + 1;"
1574 "}" 1563 "}"
1575 "return i;", 1564 "return i;",
1576 1 * kPointerSize, 1565 1 * kPointerSize,
1577 1, 1566 1,
1578 56, 1567 53,
1579 { 1568 {
1580 B(LdaZero), // 1569 B(LdaZero), //
1581 B(Star), R(0), // 1570 B(Star), R(0), //
1582 B(Jump), U8(47), // 1571 B(LdaZero), //
1583 B(LdaZero), // 1572 B(TestLessThan), R(0), //
1584 B(TestLessThan), R(0), // 1573 B(JumpIfFalse), U8(4), //
1585 B(JumpIfFalse), U8(4), // 1574 B(Jump), U8(40), //
1586 B(Jump), U8(40), // 1575 B(LdaSmi8), U8(3), //
1587 B(LdaSmi8), U8(3), // 1576 B(TestEqual), R(0), //
1588 B(TestEqual), R(0), // 1577 B(JumpIfFalse), U8(4), //
1589 B(JumpIfFalse), U8(4), // 1578 B(Jump), U8(34), //
1590 B(Jump), U8(35), // 1579 B(LdaSmi8), U8(4), //
1591 B(LdaSmi8), U8(4), // 1580 B(TestEqual), R(0), //
1592 B(TestEqual), R(0), // 1581 B(JumpIfFalse), U8(4), //
1593 B(JumpIfFalse), U8(4), // 1582 B(Jump), U8(26), //
1594 B(Jump), U8(27), // 1583 B(LdaSmi8), U8(10), //
1595 B(LdaSmi8), U8(10), // 1584 B(TestEqual), R(0), //
1596 B(TestEqual), R(0), // 1585 B(JumpIfFalse), U8(4), //
1597 B(JumpIfFalse), U8(4), // 1586 B(Jump), U8(16), //
1598 B(Jump), U8(16), // 1587 B(LdaSmi8), U8(5), //
1599 B(LdaSmi8), U8(5), // 1588 B(TestEqual), R(0), //
1600 B(TestEqual), R(0), // 1589 B(JumpIfFalse), U8(4), //
1601 B(JumpIfFalse), U8(4), // 1590 B(Jump), U8(10), //
1602 B(Jump), U8(11), // 1591 B(LdaSmi8), U8(1), //
1603 B(LdaSmi8), U8(1), // 1592 B(Add), R(0), //
1604 B(Add), R(0), // 1593 B(Star), R(0), //
1605 B(Star), R(0), // 1594 B(Jump), U8(-45), //
1606 B(LdaTrue), // 1595 B(Ldar), R(0), //
1607 B(JumpIfTrue), U8(-46), // 1596 B(Return), //
1608 B(Ldar), R(0), //
1609 B(Return), //
1610 }, 1597 },
1611 0}, 1598 0},
1612 {"var x = 0; var y = 1;" 1599 {"var x = 0; var y = 1;"
1613 "do {" 1600 "do {"
1614 " y = y * 10;" 1601 " y = y * 10;"
1615 " if (x == 5) break;" 1602 " if (x == 5) break;"
1616 " if (x == 6) continue;" 1603 " if (x == 6) continue;"
1617 " x = x + 1;" 1604 " x = x + 1;"
1618 "} while (x < 10);" 1605 "} while (x < 10);"
1619 "return y;", 1606 "return y;",
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1702 " while (i < 3) {" 1689 " while (i < 3) {"
1703 " if (i == 2) break;" 1690 " if (i == 2) break;"
1704 " i = i + 1;" 1691 " i = i + 1;"
1705 " }" 1692 " }"
1706 " i = i + 1;" 1693 " i = i + 1;"
1707 " break;" 1694 " break;"
1708 "}" 1695 "}"
1709 "return i;", 1696 "return i;",
1710 1 * kPointerSize, 1697 1 * kPointerSize,
1711 1, 1698 1,
1712 41, 1699 38,
1713 { 1700 {
1714 B(LdaZero), // 1701 B(LdaZero), //
1715 B(Star), R(0), // 1702 B(Star), R(0), //
1716 B(Jump), U8(32), //
1717 B(Jump), U8(16), // 1703 B(Jump), U8(16), //
1718 B(LdaSmi8), U8(2), // 1704 B(LdaSmi8), U8(2), //
1719 B(TestEqual), R(0), // 1705 B(TestEqual), R(0), //
1720 B(JumpIfFalse), U8(4), // 1706 B(JumpIfFalse), U8(4), //
1721 B(Jump), U8(14), // 1707 B(Jump), U8(14), //
1722 B(LdaSmi8), U8(1), // 1708 B(LdaSmi8), U8(1), //
1723 B(Add), R(0), // 1709 B(Add), R(0), //
1724 B(Star), R(0), // 1710 B(Star), R(0), //
1725 B(LdaSmi8), U8(3), // 1711 B(LdaSmi8), U8(3), //
1726 B(TestLessThan), R(0), // 1712 B(TestLessThan), R(0), //
1727 B(JumpIfTrue), U8(-18), // 1713 B(JumpIfTrue), U8(-18), //
1728 B(LdaSmi8), U8(1), // 1714 B(LdaSmi8), U8(1), //
1729 B(Add), R(0), // 1715 B(Add), R(0), //
1730 B(Star), R(0), // 1716 B(Star), R(0), //
1731 B(Jump), U8(5), // 1717 B(Jump), U8(4), //
1732 B(LdaTrue), // 1718 B(Jump), U8(-30), //
1733 B(JumpIfTrue), U8(-31), //
1734 B(Ldar), R(0), // 1719 B(Ldar), R(0), //
1735 B(Return), // 1720 B(Return), //
1736 }, 1721 },
1737 0}, 1722 0},
1723 {"var x = 0; var y = 1;"
1724 "do {"
1725 " y = y * 10;"
1726 " if (x == 5) break;"
1727 " x = x + 1;"
1728 " if (x == 6) continue;"
1729 "} while (false);"
1730 "return y;",
1731 2 * kPointerSize,
1732 1,
1733 38,
1734 {
1735 B(LdaZero), //
1736 B(Star), R(0), //
1737 B(LdaSmi8), U8(1), //
1738 B(Star), R(1), //
1739 B(LdaSmi8), U8(10), //
1740 B(Mul), R(1), //
1741 B(Star), R(1), //
1742 B(LdaSmi8), U8(5), //
1743 B(TestEqual), R(0), //
1744 B(JumpIfFalse), U8(4), //
1745 B(Jump), U8(16), //
1746 B(LdaSmi8), U8(1), //
1747 B(Add), R(0), //
1748 B(Star), R(0), //
1749 B(LdaSmi8), U8(6), //
1750 B(TestEqual), R(0), //
1751 B(JumpIfFalse), U8(4), //
1752 B(Jump), U8(2), //
1753 B(Ldar), R(1), //
1754 B(Return), //
1755 },
1756 0},
1757 {"var x = 0; var y = 1;"
1758 "do {"
1759 " y = y * 10;"
1760 " if (x == 5) break;"
1761 " x = x + 1;"
1762 " if (x == 6) continue;"
1763 "} while (true);"
1764 "return y;",
1765 2 * kPointerSize,
1766 1,
1767 40,
1768 {
1769 B(LdaZero), //
1770 B(Star), R(0), //
1771 B(LdaSmi8), U8(1), //
1772 B(Star), R(1), //
1773 B(LdaSmi8), U8(10), //
1774 B(Mul), R(1), //
1775 B(Star), R(1), //
1776 B(LdaSmi8), U8(5), //
1777 B(TestEqual), R(0), //
1778 B(JumpIfFalse), U8(4), //
1779 B(Jump), U8(18), //
1780 B(LdaSmi8), U8(1), //
1781 B(Add), R(0), //
1782 B(Star), R(0), //
1783 B(LdaSmi8), U8(6), //
1784 B(TestEqual), R(0), //
1785 B(JumpIfFalse), U8(4), //
1786 B(Jump), U8(2), //
1787 B(Jump), U8(-28), //
1788 B(Ldar), R(1), //
1789 B(Return), //
1790 },
1791 0},
1792 {"var x = 0;"
1793 "while(false) {"
1794 " x = x + 1;"
1795 "};"
1796 "return x;",
1797 1 * kPointerSize,
1798 1,
1799 6,
1800 {
1801 B(LdaZero), //
1802 B(Star), R(0), //
1803 B(Ldar), R(0), //
1804 B(Return), //
1805 },
1806 0},
1807 {"var x = 0;"
1808 "for( var i = 0; false; i++) {"
1809 " x = x + 1;"
1810 "};"
1811 "return x;",
1812 2 * kPointerSize,
1813 1,
1814 9,
1815 {
1816 B(LdaZero), //
1817 B(Star), R(0), //
1818 B(LdaZero), //
1819 B(Star), R(1), //
1820 B(Ldar), R(0), //
1821 B(Return), //
1822 },
1823 0},
1824 {"var x = 0;"
1825 "for( var i = 0; true; ++i) {"
1826 " x = x + 1;"
1827 " if (x == 20) break;"
1828 "};"
1829 "return x;",
1830 2 * kPointerSize,
1831 1,
1832 31,
1833 {
1834 B(LdaZero), //
1835 B(Star), R(0), //
1836 B(LdaZero), //
1837 B(Star), R(1), //
1838 B(LdaSmi8), U8(1), //
1839 B(Add), R(0), //
1840 B(Star), R(0), //
1841 B(LdaSmi8), U8(20), //
1842 B(TestEqual), R(0), //
1843 B(JumpIfFalse), U8(4), //
1844 B(Jump), U8(10), //
1845 B(Ldar), R(1), //
1846 B(ToNumber), //
1847 B(Inc), //
1848 B(Star), R(1), //
1849 B(Jump), U8(-20), //
1850 B(Ldar), R(0), //
1851 B(Return), //
1852 },
1853 0},
1738 }; 1854 };
1739 1855
1740 for (size_t i = 0; i < arraysize(snippets); i++) { 1856 for (size_t i = 0; i < arraysize(snippets); i++) {
1741 Handle<BytecodeArray> bytecode_array = 1857 Handle<BytecodeArray> bytecode_array =
1742 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 1858 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
1743 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1859 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1744 } 1860 }
1745 } 1861 }
1746 1862
1747 1863
(...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after
2829 3, 2945 3,
2830 { 2946 {
2831 B(LdaConstant), U8(0), // 2947 B(LdaConstant), U8(0), //
2832 B(Throw), // 2948 B(Throw), //
2833 }, 2949 },
2834 1, 2950 1,
2835 {"Error"}}, 2951 {"Error"}},
2836 {"if ('test') { throw 'Error'; };", 2952 {"if ('test') { throw 'Error'; };",
2837 0, 2953 0,
2838 1, 2954 1,
2839 10, 2955 5,
2840 { 2956 {
2841 B(LdaConstant), U8(0), // 2957 B(LdaConstant), U8(0), //
2842 B(ToBoolean), //
2843 B(JumpIfFalse), U8(5), //
2844 B(LdaConstant), U8(1), //
2845 B(Throw), // 2958 B(Throw), //
2846 B(LdaUndefined), // 2959 B(LdaUndefined), //
2847 B(Return), // 2960 B(Return), //
2848 }, 2961 },
2849 2, 2962 1,
2850 {"test", "Error"}}, 2963 {"Error"}},
2851 }; 2964 };
2852 2965
2853 for (size_t i = 0; i < arraysize(snippets); i++) { 2966 for (size_t i = 0; i < arraysize(snippets); i++) {
2854 Handle<BytecodeArray> bytecode_array = 2967 Handle<BytecodeArray> bytecode_array =
2855 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2968 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2856 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2969 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2857 } 2970 }
2858 } 2971 }
2859 2972
2860 2973
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after
3858 for (size_t i = 0; i < arraysize(snippets); i++) { 3971 for (size_t i = 0; i < arraysize(snippets); i++) {
3859 Handle<BytecodeArray> bytecode_array = 3972 Handle<BytecodeArray> bytecode_array =
3860 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3973 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3861 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3974 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3862 } 3975 }
3863 } 3976 }
3864 3977
3865 } // namespace interpreter 3978 } // namespace interpreter
3866 } // namespace internal 3979 } // namespace internal
3867 } // namespace v8 3980 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698