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

Side by Side Diff: src/hydrogen-instructions.h

Issue 21356002: Improve instruction creating/adding shorthand in HGraphBuilder (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 4 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1301 int flags_; 1301 int flags_;
1302 GVNFlagSet gvn_flags_; 1302 GVNFlagSet gvn_flags_;
1303 1303
1304 private: 1304 private:
1305 virtual bool IsDeletable() const { return false; } 1305 virtual bool IsDeletable() const { return false; }
1306 1306
1307 DISALLOW_COPY_AND_ASSIGN(HValue); 1307 DISALLOW_COPY_AND_ASSIGN(HValue);
1308 }; 1308 };
1309 1309
1310 1310
1311 #define DECLARE_INSTRUCTION_FACTORY_P0(I) \
1312 static I* New(Zone* zone, HValue* context) { \
1313 return new(zone) I(); \
1314 }
1315
1316 #define DECLARE_INSTRUCTION_FACTORY_P1(I, P1) \
1317 static I* New(Zone* zone, HValue* context, P1 p1) { \
1318 return new(zone) I(p1); \
1319 }
1320
1321 #define DECLARE_INSTRUCTION_FACTORY_P2(I, P1, P2) \
1322 static I* New(Zone* zone, HValue* context, P1 p1, P2 p2) { \
1323 return new(zone) I(p1, p2); \
1324 }
1325
1326 #define DECLARE_INSTRUCTION_FACTORY_P3(I, P1, P2, P3) \
1327 static I* New(Zone* zone, HValue* context, P1 p1, P2 p2, P3 p3) { \
1328 return new(zone) I(p1, p2, p3); \
1329 }
1330
1331 #define DECLARE_INSTRUCTION_FACTORY_P4(I, P1, P2, P3, P4) \
1332 static I* New(Zone* zone, \
1333 HValue* context, \
Toon Verwaest 2013/07/31 12:56:37 Weird indentation.
danno 2013/07/31 14:10:09 Done.
1334 P1 p1, \
1335 P2 p2, \
1336 P3 p3, \
1337 P4 p4) { \
1338 return new(zone) I(p1, p2, p3, p4); \
1339 }
1340
1341 #define DECLARE_INSTRUCTION_FACTORY_P5(I, P1, P2, P3, P4, P5) \
1342 static I* New(Zone* zone, \
Toon Verwaest 2013/07/31 12:56:37 Weird indentation.
danno 2013/07/31 14:10:09 Done.
1343 HValue* context, \
1344 P1 p1, \
1345 P2 p2, \
1346 P3 p3, \
1347 P4 p4, \
1348 P5 p5) { \
1349 return new(zone) I(p1, p2, p3, p4, p5); \
1350 }
1351
1352
1311 class HInstruction: public HValue { 1353 class HInstruction: public HValue {
1312 public: 1354 public:
1313 HInstruction* next() const { return next_; } 1355 HInstruction* next() const { return next_; }
1314 HInstruction* previous() const { return previous_; } 1356 HInstruction* previous() const { return previous_; }
1315 1357
1316 virtual void PrintTo(StringStream* stream); 1358 virtual void PrintTo(StringStream* stream);
1317 virtual void PrintDataTo(StringStream* stream); 1359 virtual void PrintDataTo(StringStream* stream);
1318 1360
1319 bool IsLinked() const { return block() != NULL; } 1361 bool IsLinked() const { return block() != NULL; }
1320 void Unlink(); 1362 void Unlink();
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 SetOperandAt(0, constrained_value); 1552 SetOperandAt(0, constrained_value);
1511 SetOperandAt(1, related_value); 1553 SetOperandAt(1, related_value);
1512 } 1554 }
1513 1555
1514 NumericRelation relation_; 1556 NumericRelation relation_;
1515 }; 1557 };
1516 1558
1517 1559
1518 class HDeoptimize: public HTemplateInstruction<0> { 1560 class HDeoptimize: public HTemplateInstruction<0> {
1519 public: 1561 public:
1520 explicit HDeoptimize(Deoptimizer::BailoutType type) : type_(type) {} 1562 DECLARE_INSTRUCTION_FACTORY_P1(HDeoptimize, Deoptimizer::BailoutType);
1521 1563
1522 virtual Representation RequiredInputRepresentation(int index) { 1564 virtual Representation RequiredInputRepresentation(int index) {
1523 return Representation::None(); 1565 return Representation::None();
1524 } 1566 }
1525 1567
1526 Deoptimizer::BailoutType type() { return type_; } 1568 Deoptimizer::BailoutType type() { return type_; }
1527 1569
1528 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 1570 DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
1529 1571
1530 private: 1572 private:
1573 explicit HDeoptimize(Deoptimizer::BailoutType type) : type_(type) {}
1574
1531 Deoptimizer::BailoutType type_; 1575 Deoptimizer::BailoutType type_;
1532 }; 1576 };
1533 1577
1534 1578
1535 // Inserts an int3/stop break instruction for debugging purposes. 1579 // Inserts an int3/stop break instruction for debugging purposes.
1536 class HDebugBreak: public HTemplateInstruction<0> { 1580 class HDebugBreak: public HTemplateInstruction<0> {
1537 public: 1581 public:
1538 virtual Representation RequiredInputRepresentation(int index) { 1582 virtual Representation RequiredInputRepresentation(int index) {
1539 return Representation::None(); 1583 return Representation::None();
1540 } 1584 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 return Representation::Tagged(); 1665 return Representation::Tagged();
1622 } 1666 }
1623 1667
1624 DECLARE_CONCRETE_INSTRUCTION(CompareMap) 1668 DECLARE_CONCRETE_INSTRUCTION(CompareMap)
1625 1669
1626 private: 1670 private:
1627 Handle<Map> map_; 1671 Handle<Map> map_;
1628 }; 1672 };
1629 1673
1630 1674
1675 class HContext: public HTemplateInstruction<0> {
1676 public:
1677 static HContext* New(Zone* zone) {
1678 return new(zone) HContext();
1679 }
1680
1681 virtual Representation RequiredInputRepresentation(int index) {
1682 return Representation::None();
1683 }
1684
1685 DECLARE_CONCRETE_INSTRUCTION(Context)
1686
1687 protected:
1688 virtual bool DataEquals(HValue* other) { return true; }
1689
1690 private:
1691 HContext() {
1692 set_representation(Representation::Tagged());
1693 SetFlag(kUseGVN);
1694 }
1695
1696 virtual bool IsDeletable() const { return true; }
1697 };
1698
1699
1631 class HReturn: public HTemplateControlInstruction<0, 3> { 1700 class HReturn: public HTemplateControlInstruction<0, 3> {
1632 public: 1701 public:
1633 HReturn(HValue* value, HValue* context, HValue* parameter_count) { 1702 static HInstruction* New(Zone* zone,
1634 SetOperandAt(0, value); 1703 HValue* context,
1635 SetOperandAt(1, context); 1704 HValue* value,
1636 SetOperandAt(2, parameter_count); 1705 HValue* parameter_count) {
1706 return new(zone) HReturn(value, context, parameter_count);
1707 }
1708
1709 static HInstruction* New(Zone* zone,
1710 HValue* context,
1711 HValue* value) {
1712 return new(zone) HReturn(value, context, 0);
1637 } 1713 }
1638 1714
1639 virtual Representation RequiredInputRepresentation(int index) { 1715 virtual Representation RequiredInputRepresentation(int index) {
1640 return Representation::Tagged(); 1716 return Representation::Tagged();
1641 } 1717 }
1642 1718
1643 virtual void PrintDataTo(StringStream* stream); 1719 virtual void PrintDataTo(StringStream* stream);
1644 1720
1645 HValue* value() { return OperandAt(0); } 1721 HValue* value() { return OperandAt(0); }
1646 HValue* context() { return OperandAt(1); } 1722 HValue* context() { return OperandAt(1); }
1647 HValue* parameter_count() { return OperandAt(2); } 1723 HValue* parameter_count() { return OperandAt(2); }
1648 1724
1649 DECLARE_CONCRETE_INSTRUCTION(Return) 1725 DECLARE_CONCRETE_INSTRUCTION(Return)
1726
1727 private:
1728 HReturn(HValue* value, HValue* context, HValue* parameter_count) {
1729 SetOperandAt(0, value);
1730 SetOperandAt(1, context);
1731 SetOperandAt(2, parameter_count);
1732 }
1650 }; 1733 };
1651 1734
1652 1735
1653 class HAbnormalExit: public HTemplateControlInstruction<0, 0> { 1736 class HAbnormalExit: public HTemplateControlInstruction<0, 0> {
1654 public: 1737 public:
1655 virtual Representation RequiredInputRepresentation(int index) { 1738 virtual Representation RequiredInputRepresentation(int index) {
1656 return Representation::None(); 1739 return Representation::None();
1657 } 1740 }
1658 1741
1659 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1742 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
(...skipping 10 matching lines...) Expand all
1670 return reinterpret_cast<HUnaryOperation*>(value); 1753 return reinterpret_cast<HUnaryOperation*>(value);
1671 } 1754 }
1672 1755
1673 HValue* value() const { return OperandAt(0); } 1756 HValue* value() const { return OperandAt(0); }
1674 virtual void PrintDataTo(StringStream* stream); 1757 virtual void PrintDataTo(StringStream* stream);
1675 }; 1758 };
1676 1759
1677 1760
1678 class HThrow: public HTemplateInstruction<2> { 1761 class HThrow: public HTemplateInstruction<2> {
1679 public: 1762 public:
1680 HThrow(HValue* context, HValue* value) { 1763 static HThrow* New(Zone* zone,
1681 SetOperandAt(0, context); 1764 HValue* context,
1682 SetOperandAt(1, value); 1765 HValue* value) {
1683 SetAllSideEffects(); 1766 return new(zone) HThrow(context, value);
1684 } 1767 }
1685 1768
1686 virtual Representation RequiredInputRepresentation(int index) { 1769 virtual Representation RequiredInputRepresentation(int index) {
1687 return Representation::Tagged(); 1770 return Representation::Tagged();
1688 } 1771 }
1689 1772
1690 HValue* context() { return OperandAt(0); } 1773 HValue* context() { return OperandAt(0); }
1691 HValue* value() { return OperandAt(1); } 1774 HValue* value() { return OperandAt(1); }
1692 1775
1693 DECLARE_CONCRETE_INSTRUCTION(Throw) 1776 DECLARE_CONCRETE_INSTRUCTION(Throw)
1777
1778 private:
1779 HThrow(HValue* context, HValue* value) {
1780 SetOperandAt(0, context);
1781 SetOperandAt(1, value);
1782 SetAllSideEffects();
1783 }
1694 }; 1784 };
1695 1785
1696 1786
1697 class HUseConst: public HUnaryOperation { 1787 class HUseConst: public HUnaryOperation {
1698 public: 1788 public:
1699 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } 1789 DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*);
1700 1790
1701 virtual Representation RequiredInputRepresentation(int index) { 1791 virtual Representation RequiredInputRepresentation(int index) {
1702 return Representation::None(); 1792 return Representation::None();
1703 } 1793 }
1704 1794
1705 DECLARE_CONCRETE_INSTRUCTION(UseConst) 1795 DECLARE_CONCRETE_INSTRUCTION(UseConst)
1796
1797 private:
1798 explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { }
1706 }; 1799 };
1707 1800
1708 1801
1709 class HForceRepresentation: public HTemplateInstruction<1> { 1802 class HForceRepresentation: public HTemplateInstruction<1> {
1710 public: 1803 public:
1711 HForceRepresentation(HValue* value, Representation required_representation) { 1804 DECLARE_INSTRUCTION_FACTORY_P2(HForceRepresentation, HValue*, Representation);
1712 SetOperandAt(0, value);
1713 set_representation(required_representation);
1714 }
1715 1805
1716 HValue* value() { return OperandAt(0); } 1806 HValue* value() { return OperandAt(0); }
1717 1807
1718 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1808 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1719 1809
1720 virtual Representation RequiredInputRepresentation(int index) { 1810 virtual Representation RequiredInputRepresentation(int index) {
1721 return representation(); // Same as the output representation. 1811 return representation(); // Same as the output representation.
1722 } 1812 }
1723 1813
1724 virtual void PrintDataTo(StringStream* stream); 1814 virtual void PrintDataTo(StringStream* stream);
1725 1815
1726 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) 1816 DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
1817
1818 private:
1819 HForceRepresentation(HValue* value, Representation required_representation) {
1820 SetOperandAt(0, value);
1821 set_representation(required_representation);
1822 }
1727 }; 1823 };
1728 1824
1729 1825
1730 class HChange: public HUnaryOperation { 1826 class HChange: public HUnaryOperation {
1731 public: 1827 public:
1732 HChange(HValue* value, 1828 HChange(HValue* value,
1733 Representation to, 1829 Representation to,
1734 bool is_truncating_to_smi, 1830 bool is_truncating_to_smi,
1735 bool is_truncating_to_int32, 1831 bool is_truncating_to_int32,
1736 bool allow_undefined_as_nan) 1832 bool allow_undefined_as_nan)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1778 1874
1779 private: 1875 private:
1780 virtual bool IsDeletable() const { 1876 virtual bool IsDeletable() const {
1781 return !from().IsTagged() || value()->type().IsSmi(); 1877 return !from().IsTagged() || value()->type().IsSmi();
1782 } 1878 }
1783 }; 1879 };
1784 1880
1785 1881
1786 class HClampToUint8: public HUnaryOperation { 1882 class HClampToUint8: public HUnaryOperation {
1787 public: 1883 public:
1788 explicit HClampToUint8(HValue* value) 1884 DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*);
1789 : HUnaryOperation(value) {
1790 set_representation(Representation::Integer32());
1791 SetFlag(kAllowUndefinedAsNaN);
1792 SetFlag(kUseGVN);
1793 }
1794 1885
1795 virtual Representation RequiredInputRepresentation(int index) { 1886 virtual Representation RequiredInputRepresentation(int index) {
1796 return Representation::None(); 1887 return Representation::None();
1797 } 1888 }
1798 1889
1799 DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) 1890 DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
1800 1891
1801 protected: 1892 protected:
1802 virtual bool DataEquals(HValue* other) { return true; } 1893 virtual bool DataEquals(HValue* other) { return true; }
1803 1894
1804 private: 1895 private:
1896 explicit HClampToUint8(HValue* value)
1897 : HUnaryOperation(value) {
1898 set_representation(Representation::Integer32());
1899 SetFlag(kAllowUndefinedAsNaN);
1900 SetFlag(kUseGVN);
1901 }
1902
1805 virtual bool IsDeletable() const { return true; } 1903 virtual bool IsDeletable() const { return true; }
1806 }; 1904 };
1807 1905
1808 1906
1809 enum RemovableSimulate { 1907 enum RemovableSimulate {
1810 REMOVABLE_SIMULATE, 1908 REMOVABLE_SIMULATE,
1811 FIXED_SIMULATE 1909 FIXED_SIMULATE
1812 }; 1910 };
1813 1911
1814 1912
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1951 }; 2049 };
1952 2050
1953 2051
1954 class HStackCheck: public HTemplateInstruction<1> { 2052 class HStackCheck: public HTemplateInstruction<1> {
1955 public: 2053 public:
1956 enum Type { 2054 enum Type {
1957 kFunctionEntry, 2055 kFunctionEntry,
1958 kBackwardsBranch 2056 kBackwardsBranch
1959 }; 2057 };
1960 2058
1961 HStackCheck(HValue* context, Type type) : type_(type) { 2059 DECLARE_INSTRUCTION_FACTORY_P2(HStackCheck, HValue*, Type);
1962 SetOperandAt(0, context);
1963 SetGVNFlag(kChangesNewSpacePromotion);
1964 }
1965 2060
1966 HValue* context() { return OperandAt(0); } 2061 HValue* context() { return OperandAt(0); }
1967 2062
1968 virtual Representation RequiredInputRepresentation(int index) { 2063 virtual Representation RequiredInputRepresentation(int index) {
1969 return Representation::Tagged(); 2064 return Representation::Tagged();
1970 } 2065 }
1971 2066
1972 void Eliminate() { 2067 void Eliminate() {
1973 // The stack check eliminator might try to eliminate the same stack 2068 // The stack check eliminator might try to eliminate the same stack
1974 // check instruction multiple times. 2069 // check instruction multiple times.
1975 if (IsLinked()) { 2070 if (IsLinked()) {
1976 DeleteAndReplaceWith(NULL); 2071 DeleteAndReplaceWith(NULL);
1977 } 2072 }
1978 } 2073 }
1979 2074
1980 bool is_function_entry() { return type_ == kFunctionEntry; } 2075 bool is_function_entry() { return type_ == kFunctionEntry; }
1981 bool is_backwards_branch() { return type_ == kBackwardsBranch; } 2076 bool is_backwards_branch() { return type_ == kBackwardsBranch; }
1982 2077
1983 DECLARE_CONCRETE_INSTRUCTION(StackCheck) 2078 DECLARE_CONCRETE_INSTRUCTION(StackCheck)
1984 2079
1985 private: 2080 private:
2081 HStackCheck(HValue* context, Type type) : type_(type) {
2082 SetOperandAt(0, context);
2083 SetGVNFlag(kChangesNewSpacePromotion);
2084 }
2085
1986 Type type_; 2086 Type type_;
1987 }; 2087 };
1988 2088
1989 2089
1990 enum InliningKind { 2090 enum InliningKind {
1991 NORMAL_RETURN, // Normal function/method call and return. 2091 NORMAL_RETURN, // Normal function/method call and return.
1992 DROP_EXTRA_ON_RETURN, // Drop an extra value from the environment on return. 2092 DROP_EXTRA_ON_RETURN, // Drop an extra value from the environment on return.
1993 CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value. 2093 CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value.
1994 GETTER_CALL_RETURN, // Returning from a getter, need to restore context. 2094 GETTER_CALL_RETURN, // Returning from a getter, need to restore context.
1995 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. 2095 SETTER_CALL_RETURN // Use the RHS of the assignment as the return value.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2062 virtual Representation RequiredInputRepresentation(int index) { 2162 virtual Representation RequiredInputRepresentation(int index) {
2063 return Representation::None(); 2163 return Representation::None();
2064 } 2164 }
2065 2165
2066 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) 2166 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined)
2067 }; 2167 };
2068 2168
2069 2169
2070 class HPushArgument: public HUnaryOperation { 2170 class HPushArgument: public HUnaryOperation {
2071 public: 2171 public:
2072 explicit HPushArgument(HValue* value) : HUnaryOperation(value) { 2172 DECLARE_INSTRUCTION_FACTORY_P1(HPushArgument, HValue*);
2073 set_representation(Representation::Tagged());
2074 }
2075 2173
2076 virtual Representation RequiredInputRepresentation(int index) { 2174 virtual Representation RequiredInputRepresentation(int index) {
2077 return Representation::Tagged(); 2175 return Representation::Tagged();
2078 } 2176 }
2079 2177
2080 HValue* argument() { return OperandAt(0); } 2178 HValue* argument() { return OperandAt(0); }
2081 2179
2082 DECLARE_CONCRETE_INSTRUCTION(PushArgument) 2180 DECLARE_CONCRETE_INSTRUCTION(PushArgument)
2181
2182 private:
2183 explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
2184 set_representation(Representation::Tagged());
2185 }
2083 }; 2186 };
2084 2187
2085 2188
2086 class HThisFunction: public HTemplateInstruction<0> { 2189 class HThisFunction: public HTemplateInstruction<0> {
2087 public: 2190 public:
2088 HThisFunction() { 2191 HThisFunction() {
2089 set_representation(Representation::Tagged()); 2192 set_representation(Representation::Tagged());
2090 SetFlag(kUseGVN); 2193 SetFlag(kUseGVN);
2091 } 2194 }
2092 2195
2093 virtual Representation RequiredInputRepresentation(int index) { 2196 virtual Representation RequiredInputRepresentation(int index) {
2094 return Representation::None(); 2197 return Representation::None();
2095 } 2198 }
2096 2199
2097 DECLARE_CONCRETE_INSTRUCTION(ThisFunction) 2200 DECLARE_CONCRETE_INSTRUCTION(ThisFunction)
2098 2201
2099 protected: 2202 protected:
2100 virtual bool DataEquals(HValue* other) { return true; } 2203 virtual bool DataEquals(HValue* other) { return true; }
2101 2204
2102 private: 2205 private:
2103 virtual bool IsDeletable() const { return true; } 2206 virtual bool IsDeletable() const { return true; }
2104 }; 2207 };
2105 2208
2106 2209
2107 class HContext: public HTemplateInstruction<0> {
2108 public:
2109 HContext() {
2110 set_representation(Representation::Tagged());
2111 SetFlag(kUseGVN);
2112 }
2113
2114 virtual Representation RequiredInputRepresentation(int index) {
2115 return Representation::None();
2116 }
2117
2118 DECLARE_CONCRETE_INSTRUCTION(Context)
2119
2120 protected:
2121 virtual bool DataEquals(HValue* other) { return true; }
2122
2123 private:
2124 virtual bool IsDeletable() const { return true; }
2125 };
2126
2127
2128 class HOuterContext: public HUnaryOperation { 2210 class HOuterContext: public HUnaryOperation {
2129 public: 2211 public:
2130 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { 2212 DECLARE_INSTRUCTION_FACTORY_P1(HOuterContext, HValue*);
2131 set_representation(Representation::Tagged());
2132 SetFlag(kUseGVN);
2133 }
2134 2213
2135 DECLARE_CONCRETE_INSTRUCTION(OuterContext); 2214 DECLARE_CONCRETE_INSTRUCTION(OuterContext);
2136 2215
2137 virtual Representation RequiredInputRepresentation(int index) { 2216 virtual Representation RequiredInputRepresentation(int index) {
2138 return Representation::Tagged(); 2217 return Representation::Tagged();
2139 } 2218 }
2140 2219
2141 protected: 2220 protected:
2142 virtual bool DataEquals(HValue* other) { return true; } 2221 virtual bool DataEquals(HValue* other) { return true; }
2143 2222
2144 private: 2223 private:
2224 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
2225 set_representation(Representation::Tagged());
2226 SetFlag(kUseGVN);
2227 }
2228
2145 virtual bool IsDeletable() const { return true; } 2229 virtual bool IsDeletable() const { return true; }
2146 }; 2230 };
2147 2231
2148 2232
2149 class HDeclareGlobals: public HUnaryOperation { 2233 class HDeclareGlobals: public HUnaryOperation {
2150 public: 2234 public:
2151 HDeclareGlobals(HValue* context, 2235 HDeclareGlobals(HValue* context,
2152 Handle<FixedArray> pairs, 2236 Handle<FixedArray> pairs,
2153 int flags) 2237 int flags)
2154 : HUnaryOperation(context), 2238 : HUnaryOperation(context),
2155 pairs_(pairs), 2239 pairs_(pairs),
2156 flags_(flags) { 2240 flags_(flags) {
2157 set_representation(Representation::Tagged()); 2241 set_representation(Representation::Tagged());
2158 SetAllSideEffects(); 2242 SetAllSideEffects();
2159 } 2243 }
2160 2244
2245 static HDeclareGlobals* New(Zone* zone,
2246 HValue* context,
2247 Handle<FixedArray> pairs,
2248 int flags) {
2249 return new(zone) HDeclareGlobals(context, pairs, flags);
2250 }
2251
2161 HValue* context() { return OperandAt(0); } 2252 HValue* context() { return OperandAt(0); }
2162 Handle<FixedArray> pairs() const { return pairs_; } 2253 Handle<FixedArray> pairs() const { return pairs_; }
2163 int flags() const { return flags_; } 2254 int flags() const { return flags_; }
2164 2255
2165 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals) 2256 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals)
2166 2257
2167 virtual Representation RequiredInputRepresentation(int index) { 2258 virtual Representation RequiredInputRepresentation(int index) {
2168 return Representation::Tagged(); 2259 return Representation::Tagged();
2169 } 2260 }
2261
2170 private: 2262 private:
2171 Handle<FixedArray> pairs_; 2263 Handle<FixedArray> pairs_;
2172 int flags_; 2264 int flags_;
2173 }; 2265 };
2174 2266
2175 2267
2176 class HGlobalObject: public HUnaryOperation { 2268 class HGlobalObject: public HUnaryOperation {
2177 public: 2269 public:
2178 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { 2270 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
2179 set_representation(Representation::Tagged()); 2271 set_representation(Representation::Tagged());
2180 SetFlag(kUseGVN); 2272 SetFlag(kUseGVN);
2181 } 2273 }
2182 2274
2275 static HGlobalObject* New(Zone* zone, HValue* context) {
2276 return new(zone) HGlobalObject(context);
2277 }
2278
2183 DECLARE_CONCRETE_INSTRUCTION(GlobalObject) 2279 DECLARE_CONCRETE_INSTRUCTION(GlobalObject)
2184 2280
2185 virtual Representation RequiredInputRepresentation(int index) { 2281 virtual Representation RequiredInputRepresentation(int index) {
2186 return Representation::Tagged(); 2282 return Representation::Tagged();
2187 } 2283 }
2188 2284
2189 protected: 2285 protected:
2190 virtual bool DataEquals(HValue* other) { return true; } 2286 virtual bool DataEquals(HValue* other) { return true; }
2191 2287
2192 private: 2288 private:
2193 virtual bool IsDeletable() const { return true; } 2289 virtual bool IsDeletable() const { return true; }
2194 }; 2290 };
2195 2291
2196 2292
2197 class HGlobalReceiver: public HUnaryOperation { 2293 class HGlobalReceiver: public HUnaryOperation {
2198 public: 2294 public:
2199 explicit HGlobalReceiver(HValue* global_object) 2295 DECLARE_INSTRUCTION_FACTORY_P1(HGlobalReceiver, HValue*);
2200 : HUnaryOperation(global_object) {
2201 set_representation(Representation::Tagged());
2202 SetFlag(kUseGVN);
2203 }
2204 2296
2205 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver) 2297 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver)
2206 2298
2207 virtual Representation RequiredInputRepresentation(int index) { 2299 virtual Representation RequiredInputRepresentation(int index) {
2208 return Representation::Tagged(); 2300 return Representation::Tagged();
2209 } 2301 }
2210 2302
2211 protected: 2303 protected:
2212 virtual bool DataEquals(HValue* other) { return true; } 2304 virtual bool DataEquals(HValue* other) { return true; }
2213 2305
2214 private: 2306 private:
2307 explicit HGlobalReceiver(HValue* global_object)
2308 : HUnaryOperation(global_object) {
2309 set_representation(Representation::Tagged());
2310 SetFlag(kUseGVN);
2311 }
2312
2215 virtual bool IsDeletable() const { return true; } 2313 virtual bool IsDeletable() const { return true; }
2216 }; 2314 };
2217 2315
2218 2316
2219 template <int V> 2317 template <int V>
2220 class HCall: public HTemplateInstruction<V> { 2318 class HCall: public HTemplateInstruction<V> {
2221 public: 2319 public:
2222 // The argument count includes the receiver. 2320 // The argument count includes the receiver.
2223 explicit HCall<V>(int argument_count) : argument_count_(argument_count) { 2321 explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
2224 this->set_representation(Representation::Tagged()); 2322 this->set_representation(Representation::Tagged());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 HValue* second() { return OperandAt(1); } 2369 HValue* second() { return OperandAt(1); }
2272 }; 2370 };
2273 2371
2274 2372
2275 class HInvokeFunction: public HBinaryCall { 2373 class HInvokeFunction: public HBinaryCall {
2276 public: 2374 public:
2277 HInvokeFunction(HValue* context, HValue* function, int argument_count) 2375 HInvokeFunction(HValue* context, HValue* function, int argument_count)
2278 : HBinaryCall(context, function, argument_count) { 2376 : HBinaryCall(context, function, argument_count) {
2279 } 2377 }
2280 2378
2379 static HInvokeFunction* New(Zone* zone,
2380 HValue* context,
2381 HValue* function,
2382 int argument_count) {
2383 return new(zone) HInvokeFunction(context, function, argument_count);
2384 }
2385
2281 HInvokeFunction(HValue* context, 2386 HInvokeFunction(HValue* context,
2282 HValue* function, 2387 HValue* function,
2283 Handle<JSFunction> known_function, 2388 Handle<JSFunction> known_function,
2284 int argument_count) 2389 int argument_count)
2285 : HBinaryCall(context, function, argument_count), 2390 : HBinaryCall(context, function, argument_count),
2286 known_function_(known_function) { 2391 known_function_(known_function) {
2287 formal_parameter_count_ = known_function.is_null() 2392 formal_parameter_count_ = known_function.is_null()
2288 ? 0 : known_function->shared()->formal_parameter_count(); 2393 ? 0 : known_function->shared()->formal_parameter_count();
2289 } 2394 }
2290 2395
2396 static HInvokeFunction* New(Zone* zone,
2397 HValue* context,
2398 HValue* function,
2399 Handle<JSFunction> known_function,
2400 int argument_count) {
2401 return new(zone) HInvokeFunction(context, function,
2402 known_function, argument_count);
2403 }
2404
2291 virtual Representation RequiredInputRepresentation(int index) { 2405 virtual Representation RequiredInputRepresentation(int index) {
2292 return Representation::Tagged(); 2406 return Representation::Tagged();
2293 } 2407 }
2294 2408
2295 HValue* context() { return first(); } 2409 HValue* context() { return first(); }
2296 HValue* function() { return second(); } 2410 HValue* function() { return second(); }
2297 Handle<JSFunction> known_function() { return known_function_; } 2411 Handle<JSFunction> known_function() { return known_function_; }
2298 int formal_parameter_count() const { return formal_parameter_count_; } 2412 int formal_parameter_count() const { return formal_parameter_count_; }
2299 2413
2300 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) 2414 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction)
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2372 Handle<String> name_; 2486 Handle<String> name_;
2373 }; 2487 };
2374 2488
2375 2489
2376 class HCallFunction: public HBinaryCall { 2490 class HCallFunction: public HBinaryCall {
2377 public: 2491 public:
2378 HCallFunction(HValue* context, HValue* function, int argument_count) 2492 HCallFunction(HValue* context, HValue* function, int argument_count)
2379 : HBinaryCall(context, function, argument_count) { 2493 : HBinaryCall(context, function, argument_count) {
2380 } 2494 }
2381 2495
2496 static HCallFunction* New(Zone* zone,
2497 HValue* context,
2498 HValue* function,
2499 int argument_count) {
2500 return new(zone) HCallFunction(context, function, argument_count);
2501 }
2502
2382 HValue* context() { return first(); } 2503 HValue* context() { return first(); }
2383 HValue* function() { return second(); } 2504 HValue* function() { return second(); }
2384 2505
2385 virtual Representation RequiredInputRepresentation(int index) { 2506 virtual Representation RequiredInputRepresentation(int index) {
2386 return Representation::Tagged(); 2507 return Representation::Tagged();
2387 } 2508 }
2388 2509
2389 DECLARE_CONCRETE_INSTRUCTION(CallFunction) 2510 DECLARE_CONCRETE_INSTRUCTION(CallFunction)
2390 }; 2511 };
2391 2512
2392 2513
2393 class HCallGlobal: public HUnaryCall { 2514 class HCallGlobal: public HUnaryCall {
2394 public: 2515 public:
2395 HCallGlobal(HValue* context, Handle<String> name, int argument_count) 2516 HCallGlobal(HValue* context, Handle<String> name, int argument_count)
2396 : HUnaryCall(context, argument_count), name_(name) { 2517 : HUnaryCall(context, argument_count), name_(name) {
2397 } 2518 }
2398 2519
2520 static HCallGlobal* New(Zone* zone,
2521 HValue* context,
2522 Handle<String> name,
2523 int argument_count) {
2524 return new(zone) HCallGlobal(context, name, argument_count);
2525 }
2526
2399 virtual void PrintDataTo(StringStream* stream); 2527 virtual void PrintDataTo(StringStream* stream);
2400 2528
2401 HValue* context() { return value(); } 2529 HValue* context() { return value(); }
2402 Handle<String> name() const { return name_; } 2530 Handle<String> name() const { return name_; }
2403 2531
2404 virtual Representation RequiredInputRepresentation(int index) { 2532 virtual Representation RequiredInputRepresentation(int index) {
2405 return Representation::Tagged(); 2533 return Representation::Tagged();
2406 } 2534 }
2407 2535
2408 DECLARE_CONCRETE_INSTRUCTION(CallGlobal) 2536 DECLARE_CONCRETE_INSTRUCTION(CallGlobal)
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2472 DECLARE_CONCRETE_INSTRUCTION(CallNewArray) 2600 DECLARE_CONCRETE_INSTRUCTION(CallNewArray)
2473 2601
2474 private: 2602 private:
2475 ElementsKind elements_kind_; 2603 ElementsKind elements_kind_;
2476 Handle<Cell> type_cell_; 2604 Handle<Cell> type_cell_;
2477 }; 2605 };
2478 2606
2479 2607
2480 class HCallRuntime: public HCall<1> { 2608 class HCallRuntime: public HCall<1> {
2481 public: 2609 public:
2482 HCallRuntime(HValue* context, 2610 static HCallRuntime* New(Zone* zone,
2483 Handle<String> name, 2611 HValue* context,
2484 const Runtime::Function* c_function, 2612 Handle<String> name,
2485 int argument_count) 2613 const Runtime::Function* c_function,
2486 : HCall<1>(argument_count), c_function_(c_function), name_(name) { 2614 int argument_count) {
2487 SetOperandAt(0, context); 2615 return new(zone) HCallRuntime(context, name, c_function, argument_count);
2488 } 2616 }
2489 2617
2490 virtual void PrintDataTo(StringStream* stream); 2618 virtual void PrintDataTo(StringStream* stream);
2491 2619
2492 HValue* context() { return OperandAt(0); } 2620 HValue* context() { return OperandAt(0); }
2493 const Runtime::Function* function() const { return c_function_; } 2621 const Runtime::Function* function() const { return c_function_; }
2494 Handle<String> name() const { return name_; } 2622 Handle<String> name() const { return name_; }
2495 2623
2496 virtual Representation RequiredInputRepresentation(int index) { 2624 virtual Representation RequiredInputRepresentation(int index) {
2497 return Representation::Tagged(); 2625 return Representation::Tagged();
2498 } 2626 }
2499 2627
2500 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 2628 DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
2501 2629
2502 private: 2630 private:
2631 HCallRuntime(HValue* context,
2632 Handle<String> name,
2633 const Runtime::Function* c_function,
2634 int argument_count)
2635 : HCall<1>(argument_count), c_function_(c_function), name_(name) {
2636 SetOperandAt(0, context);
2637 }
2638
2503 const Runtime::Function* c_function_; 2639 const Runtime::Function* c_function_;
2504 Handle<String> name_; 2640 Handle<String> name_;
2505 }; 2641 };
2506 2642
2507 2643
2508 class HMapEnumLength: public HUnaryOperation { 2644 class HMapEnumLength: public HUnaryOperation {
2509 public: 2645 public:
2510 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) { 2646 DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*);
2511 set_type(HType::Smi());
2512 set_representation(Representation::Smi());
2513 SetFlag(kUseGVN);
2514 SetGVNFlag(kDependsOnMaps);
2515 }
2516 2647
2517 virtual Representation RequiredInputRepresentation(int index) { 2648 virtual Representation RequiredInputRepresentation(int index) {
2518 return Representation::Tagged(); 2649 return Representation::Tagged();
2519 } 2650 }
2520 2651
2521 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) 2652 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength)
2522 2653
2523 protected: 2654 protected:
2524 virtual bool DataEquals(HValue* other) { return true; } 2655 virtual bool DataEquals(HValue* other) { return true; }
2525 2656
2526 private: 2657 private:
2658 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) {
2659 set_type(HType::Smi());
2660 set_representation(Representation::Smi());
2661 SetFlag(kUseGVN);
2662 SetGVNFlag(kDependsOnMaps);
2663 }
2664
2527 virtual bool IsDeletable() const { return true; } 2665 virtual bool IsDeletable() const { return true; }
2528 }; 2666 };
2529 2667
2530 2668
2531 class HElementsKind: public HUnaryOperation { 2669 class HElementsKind: public HUnaryOperation {
2532 public: 2670 public:
2533 explicit HElementsKind(HValue* value) : HUnaryOperation(value) { 2671 explicit HElementsKind(HValue* value) : HUnaryOperation(value) {
2534 set_representation(Representation::Integer32()); 2672 set_representation(Representation::Integer32());
2535 SetFlag(kUseGVN); 2673 SetFlag(kUseGVN);
2536 SetGVNFlag(kDependsOnElementsKind); 2674 SetGVNFlag(kDependsOnElementsKind);
2537 } 2675 }
2538 2676
2539 virtual Representation RequiredInputRepresentation(int index) { 2677 virtual Representation RequiredInputRepresentation(int index) {
2540 return Representation::Tagged(); 2678 return Representation::Tagged();
2541 } 2679 }
2542 2680
2543 DECLARE_CONCRETE_INSTRUCTION(ElementsKind) 2681 DECLARE_CONCRETE_INSTRUCTION(ElementsKind)
2544 2682
2545 protected: 2683 protected:
2546 virtual bool DataEquals(HValue* other) { return true; } 2684 virtual bool DataEquals(HValue* other) { return true; }
2547 2685
2548 private: 2686 private:
2549 virtual bool IsDeletable() const { return true; } 2687 virtual bool IsDeletable() const { return true; }
2550 }; 2688 };
2551 2689
2552 2690
2553 class HBitNot: public HUnaryOperation { 2691 class HBitNot: public HUnaryOperation {
2554 public: 2692 public:
2555 explicit HBitNot(HValue* value) : HUnaryOperation(value) { 2693 DECLARE_INSTRUCTION_FACTORY_P1(HBitNot, HValue*);
2556 set_representation(Representation::Integer32());
2557 SetFlag(kUseGVN);
2558 SetFlag(kTruncatingToInt32);
2559 SetFlag(kAllowUndefinedAsNaN);
2560 }
2561 2694
2562 virtual Representation RequiredInputRepresentation(int index) { 2695 virtual Representation RequiredInputRepresentation(int index) {
2563 return Representation::Integer32(); 2696 return Representation::Integer32();
2564 } 2697 }
2565 virtual Representation observed_input_representation(int index) { 2698 virtual Representation observed_input_representation(int index) {
2566 return Representation::Integer32(); 2699 return Representation::Integer32();
2567 } 2700 }
2568 virtual HType CalculateInferredType(); 2701 virtual HType CalculateInferredType();
2569 2702
2570 virtual HValue* Canonicalize(); 2703 virtual HValue* Canonicalize();
2571 2704
2572 DECLARE_CONCRETE_INSTRUCTION(BitNot) 2705 DECLARE_CONCRETE_INSTRUCTION(BitNot)
2573 2706
2574 protected: 2707 protected:
2575 virtual bool DataEquals(HValue* other) { return true; } 2708 virtual bool DataEquals(HValue* other) { return true; }
2576 2709
2577 private: 2710 private:
2711 explicit HBitNot(HValue* value) : HUnaryOperation(value) {
2712 set_representation(Representation::Integer32());
2713 SetFlag(kUseGVN);
2714 SetFlag(kTruncatingToInt32);
2715 SetFlag(kAllowUndefinedAsNaN);
2716 }
2717
2578 virtual bool IsDeletable() const { return true; } 2718 virtual bool IsDeletable() const { return true; }
2579 }; 2719 };
2580 2720
2581 2721
2582 class HUnaryMathOperation: public HTemplateInstruction<2> { 2722 class HUnaryMathOperation: public HTemplateInstruction<2> {
2583 public: 2723 public:
2584 static HInstruction* New(Zone* zone, 2724 static HInstruction* New(Zone* zone,
2585 HValue* context, 2725 HValue* context,
2586 HValue* value, 2726 HValue* value,
2587 BuiltinFunctionId op); 2727 BuiltinFunctionId op);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
2674 } 2814 }
2675 2815
2676 virtual bool IsDeletable() const { return true; } 2816 virtual bool IsDeletable() const { return true; }
2677 2817
2678 BuiltinFunctionId op_; 2818 BuiltinFunctionId op_;
2679 }; 2819 };
2680 2820
2681 2821
2682 class HLoadExternalArrayPointer: public HUnaryOperation { 2822 class HLoadExternalArrayPointer: public HUnaryOperation {
2683 public: 2823 public:
2684 explicit HLoadExternalArrayPointer(HValue* value) 2824 DECLARE_INSTRUCTION_FACTORY_P1(HLoadExternalArrayPointer, HValue*);
2685 : HUnaryOperation(value) {
2686 set_representation(Representation::External());
2687 // The result of this instruction is idempotent as long as its inputs don't
2688 // change. The external array of a specialized array elements object cannot
2689 // change once set, so it's no necessary to introduce any additional
2690 // dependencies on top of the inputs.
2691 SetFlag(kUseGVN);
2692 }
2693 2825
2694 virtual Representation RequiredInputRepresentation(int index) { 2826 virtual Representation RequiredInputRepresentation(int index) {
2695 return Representation::Tagged(); 2827 return Representation::Tagged();
2696 } 2828 }
2697 2829
2698 virtual HType CalculateInferredType() { 2830 virtual HType CalculateInferredType() {
2699 return HType::None(); 2831 return HType::None();
2700 } 2832 }
2701 2833
2702 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer) 2834 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer)
2703 2835
2704 protected: 2836 protected:
2705 virtual bool DataEquals(HValue* other) { return true; } 2837 virtual bool DataEquals(HValue* other) { return true; }
2706 2838
2707 private: 2839 private:
2840 explicit HLoadExternalArrayPointer(HValue* value)
2841 : HUnaryOperation(value) {
2842 set_representation(Representation::External());
2843 // The result of this instruction is idempotent as long as its inputs don't
2844 // change. The external array of a specialized array elements object cannot
2845 // change once set, so it's no necessary to introduce any additional
2846 // dependencies on top of the inputs.
2847 SetFlag(kUseGVN);
2848 }
2849
2708 virtual bool IsDeletable() const { return true; } 2850 virtual bool IsDeletable() const { return true; }
2709 }; 2851 };
2710 2852
2711 2853
2712 class HCheckMaps: public HTemplateInstruction<2> { 2854 class HCheckMaps: public HTemplateInstruction<2> {
2713 public: 2855 public:
2714 static HCheckMaps* New(HValue* value, Handle<Map> map, Zone* zone, 2856 static HCheckMaps* New(HValue* value, Handle<Map> map, Zone* zone,
2715 CompilationInfo* info, HValue *typecheck = NULL); 2857 CompilationInfo* info, HValue *typecheck = NULL);
2716 static HCheckMaps* New(HValue* value, SmallMapList* maps, Zone* zone, 2858 static HCheckMaps* New(HValue* value, SmallMapList* maps, Zone* zone,
2717 HValue *typecheck = NULL) { 2859 HValue *typecheck = NULL) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2785 } 2927 }
2786 2928
2787 bool omit_; 2929 bool omit_;
2788 SmallMapList map_set_; 2930 SmallMapList map_set_;
2789 ZoneList<UniqueValueId> map_unique_ids_; 2931 ZoneList<UniqueValueId> map_unique_ids_;
2790 }; 2932 };
2791 2933
2792 2934
2793 class HCheckFunction: public HUnaryOperation { 2935 class HCheckFunction: public HUnaryOperation {
2794 public: 2936 public:
2795 HCheckFunction(HValue* value, Handle<JSFunction> function) 2937 DECLARE_INSTRUCTION_FACTORY_P2(HCheckFunction, HValue*, Handle<JSFunction>);
2796 : HUnaryOperation(value), target_(function), target_unique_id_() {
2797 set_representation(Representation::Tagged());
2798 SetFlag(kUseGVN);
2799 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function);
2800 }
2801 2938
2802 virtual Representation RequiredInputRepresentation(int index) { 2939 virtual Representation RequiredInputRepresentation(int index) {
2803 return Representation::Tagged(); 2940 return Representation::Tagged();
2804 } 2941 }
2805 virtual void PrintDataTo(StringStream* stream); 2942 virtual void PrintDataTo(StringStream* stream);
2806 virtual HType CalculateInferredType(); 2943 virtual HType CalculateInferredType();
2807 2944
2808 virtual HValue* Canonicalize(); 2945 virtual HValue* Canonicalize();
2809 2946
2810 #ifdef DEBUG 2947 #ifdef DEBUG
2811 virtual void Verify(); 2948 virtual void Verify();
2812 #endif 2949 #endif
2813 2950
2814 virtual void FinalizeUniqueValueId() { 2951 virtual void FinalizeUniqueValueId() {
2815 target_unique_id_ = UniqueValueId(target_); 2952 target_unique_id_ = UniqueValueId(target_);
2816 } 2953 }
2817 2954
2818 Handle<JSFunction> target() const { return target_; } 2955 Handle<JSFunction> target() const { return target_; }
2819 bool target_in_new_space() const { return target_in_new_space_; } 2956 bool target_in_new_space() const { return target_in_new_space_; }
2820 2957
2821 DECLARE_CONCRETE_INSTRUCTION(CheckFunction) 2958 DECLARE_CONCRETE_INSTRUCTION(CheckFunction)
2822 2959
2823 protected: 2960 protected:
2824 virtual bool DataEquals(HValue* other) { 2961 virtual bool DataEquals(HValue* other) {
2825 HCheckFunction* b = HCheckFunction::cast(other); 2962 HCheckFunction* b = HCheckFunction::cast(other);
2826 return target_unique_id_ == b->target_unique_id_; 2963 return target_unique_id_ == b->target_unique_id_;
2827 } 2964 }
2828 2965
2829 private: 2966 private:
2967 HCheckFunction(HValue* value, Handle<JSFunction> function)
2968 : HUnaryOperation(value), target_(function), target_unique_id_() {
2969 set_representation(Representation::Tagged());
2970 SetFlag(kUseGVN);
2971 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function);
2972 }
2973
2830 Handle<JSFunction> target_; 2974 Handle<JSFunction> target_;
2831 UniqueValueId target_unique_id_; 2975 UniqueValueId target_unique_id_;
2832 bool target_in_new_space_; 2976 bool target_in_new_space_;
2833 }; 2977 };
2834 2978
2835 2979
2836 class HCheckInstanceType: public HUnaryOperation { 2980 class HCheckInstanceType: public HUnaryOperation {
2837 public: 2981 public:
2838 static HCheckInstanceType* NewIsSpecObject(HValue* value, Zone* zone) { 2982 static HCheckInstanceType* NewIsSpecObject(HValue* value, Zone* zone) {
2839 return new(zone) HCheckInstanceType(value, IS_SPEC_OBJECT); 2983 return new(zone) HCheckInstanceType(value, IS_SPEC_OBJECT);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2888 set_representation(Representation::Tagged()); 3032 set_representation(Representation::Tagged());
2889 SetFlag(kUseGVN); 3033 SetFlag(kUseGVN);
2890 } 3034 }
2891 3035
2892 const Check check_; 3036 const Check check_;
2893 }; 3037 };
2894 3038
2895 3039
2896 class HCheckSmi: public HUnaryOperation { 3040 class HCheckSmi: public HUnaryOperation {
2897 public: 3041 public:
2898 explicit HCheckSmi(HValue* value) : HUnaryOperation(value) { 3042 DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*);
2899 set_representation(Representation::Smi());
2900 SetFlag(kUseGVN);
2901 }
2902 3043
2903 virtual Representation RequiredInputRepresentation(int index) { 3044 virtual Representation RequiredInputRepresentation(int index) {
2904 return Representation::Tagged(); 3045 return Representation::Tagged();
2905 } 3046 }
2906 3047
2907 virtual HType CalculateInferredType(); 3048 virtual HType CalculateInferredType();
2908 3049
2909 virtual HValue* Canonicalize() { 3050 virtual HValue* Canonicalize() {
2910 HType value_type = value()->type(); 3051 HType value_type = value()->type();
2911 if (value_type.IsSmi()) { 3052 if (value_type.IsSmi()) {
2912 return NULL; 3053 return NULL;
2913 } 3054 }
2914 return this; 3055 return this;
2915 } 3056 }
2916 3057
2917 DECLARE_CONCRETE_INSTRUCTION(CheckSmi) 3058 DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
2918 3059
2919 protected: 3060 protected:
2920 virtual bool DataEquals(HValue* other) { return true; } 3061 virtual bool DataEquals(HValue* other) { return true; }
3062
3063 private:
3064 explicit HCheckSmi(HValue* value) : HUnaryOperation(value) {
3065 set_representation(Representation::Smi());
3066 SetFlag(kUseGVN);
3067 }
2921 }; 3068 };
2922 3069
2923 3070
2924 class HIsNumberAndBranch: public HUnaryControlInstruction { 3071 class HIsNumberAndBranch: public HUnaryControlInstruction {
2925 public: 3072 public:
2926 explicit HIsNumberAndBranch(HValue* value) 3073 explicit HIsNumberAndBranch(HValue* value)
2927 : HUnaryControlInstruction(value, NULL, NULL) { 3074 : HUnaryControlInstruction(value, NULL, NULL) {
2928 SetFlag(kFlexibleRepresentation); 3075 SetFlag(kFlexibleRepresentation);
2929 } 3076 }
2930 3077
2931 virtual Representation RequiredInputRepresentation(int index) { 3078 virtual Representation RequiredInputRepresentation(int index) {
2932 return Representation::None(); 3079 return Representation::None();
2933 } 3080 }
2934 3081
2935 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch) 3082 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch)
2936 }; 3083 };
2937 3084
2938 3085
2939 class HCheckHeapObject: public HUnaryOperation { 3086 class HCheckHeapObject: public HUnaryOperation {
2940 public: 3087 public:
2941 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) { 3088 DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*);
2942 set_representation(Representation::Tagged());
2943 SetFlag(kUseGVN);
2944 }
2945 3089
2946 virtual Representation RequiredInputRepresentation(int index) { 3090 virtual Representation RequiredInputRepresentation(int index) {
2947 return Representation::Tagged(); 3091 return Representation::Tagged();
2948 } 3092 }
2949 3093
2950 virtual HType CalculateInferredType(); 3094 virtual HType CalculateInferredType();
2951 3095
2952 #ifdef DEBUG 3096 #ifdef DEBUG
2953 virtual void Verify(); 3097 virtual void Verify();
2954 #endif 3098 #endif
2955 3099
2956 virtual HValue* Canonicalize() { 3100 virtual HValue* Canonicalize() {
2957 return value()->type().IsHeapObject() ? NULL : this; 3101 return value()->type().IsHeapObject() ? NULL : this;
2958 } 3102 }
2959 3103
2960 DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject) 3104 DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject)
2961 3105
2962 protected: 3106 protected:
2963 virtual bool DataEquals(HValue* other) { return true; } 3107 virtual bool DataEquals(HValue* other) { return true; }
3108
3109 private:
3110 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) {
3111 set_representation(Representation::Tagged());
3112 SetFlag(kUseGVN);
3113 }
2964 }; 3114 };
2965 3115
2966 3116
2967 class HCheckPrototypeMaps: public HTemplateInstruction<0> { 3117 class HCheckPrototypeMaps: public HTemplateInstruction<0> {
2968 public: 3118 public:
2969 HCheckPrototypeMaps(Handle<JSObject> prototype, 3119 static HCheckPrototypeMaps* New(Zone* zone,
2970 Handle<JSObject> holder, 3120 HValue* context,
2971 Zone* zone, 3121 Handle<JSObject> prototype,
2972 CompilationInfo* info) 3122 Handle<JSObject> holder,
2973 : prototypes_(2, zone), 3123 CompilationInfo* info) {
2974 maps_(2, zone), 3124 return new(zone) HCheckPrototypeMaps(prototype, holder, zone, info);
2975 first_prototype_unique_id_(),
2976 last_prototype_unique_id_(),
2977 can_omit_prototype_maps_(true) {
2978 SetFlag(kUseGVN);
2979 SetGVNFlag(kDependsOnMaps);
2980 // Keep a list of all objects on the prototype chain up to the holder
2981 // and the expected maps.
2982 while (true) {
2983 prototypes_.Add(prototype, zone);
2984 Handle<Map> map(prototype->map());
2985 maps_.Add(map, zone);
2986 can_omit_prototype_maps_ &= map->CanOmitPrototypeChecks();
2987 if (prototype.is_identical_to(holder)) break;
2988 prototype = Handle<JSObject>(JSObject::cast(prototype->GetPrototype()));
2989 }
2990 if (can_omit_prototype_maps_) {
2991 // Mark in-flight compilation as dependent on those maps.
2992 for (int i = 0; i < maps()->length(); i++) {
2993 Handle<Map> map = maps()->at(i);
2994 map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup,
2995 info);
2996 }
2997 }
2998 } 3125 }
2999 3126
3000 ZoneList<Handle<JSObject> >* prototypes() { return &prototypes_; } 3127 ZoneList<Handle<JSObject> >* prototypes() { return &prototypes_; }
3001 3128
3002 ZoneList<Handle<Map> >* maps() { return &maps_; } 3129 ZoneList<Handle<Map> >* maps() { return &maps_; }
3003 3130
3004 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) 3131 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps)
3005 3132
3006 virtual Representation RequiredInputRepresentation(int index) { 3133 virtual Representation RequiredInputRepresentation(int index) {
3007 return Representation::None(); 3134 return Representation::None();
(...skipping 14 matching lines...) Expand all
3022 bool CanOmitPrototypeChecks() { return can_omit_prototype_maps_; } 3149 bool CanOmitPrototypeChecks() { return can_omit_prototype_maps_; }
3023 3150
3024 protected: 3151 protected:
3025 virtual bool DataEquals(HValue* other) { 3152 virtual bool DataEquals(HValue* other) {
3026 HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); 3153 HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other);
3027 return first_prototype_unique_id_ == b->first_prototype_unique_id_ && 3154 return first_prototype_unique_id_ == b->first_prototype_unique_id_ &&
3028 last_prototype_unique_id_ == b->last_prototype_unique_id_; 3155 last_prototype_unique_id_ == b->last_prototype_unique_id_;
3029 } 3156 }
3030 3157
3031 private: 3158 private:
3159 HCheckPrototypeMaps(Handle<JSObject> prototype,
3160 Handle<JSObject> holder,
3161 Zone* zone,
3162 CompilationInfo* info)
3163 : prototypes_(2, zone),
3164 maps_(2, zone),
3165 first_prototype_unique_id_(),
3166 last_prototype_unique_id_(),
3167 can_omit_prototype_maps_(true) {
3168 SetFlag(kUseGVN);
3169 SetGVNFlag(kDependsOnMaps);
3170 // Keep a list of all objects on the prototype chain up to the holder
3171 // and the expected maps.
3172 while (true) {
3173 prototypes_.Add(prototype, zone);
3174 Handle<Map> map(prototype->map());
3175 maps_.Add(map, zone);
3176 can_omit_prototype_maps_ &= map->CanOmitPrototypeChecks();
3177 if (prototype.is_identical_to(holder)) break;
3178 prototype = Handle<JSObject>(JSObject::cast(prototype->GetPrototype()));
3179 }
3180 if (can_omit_prototype_maps_) {
3181 // Mark in-flight compilation as dependent on those maps.
3182 for (int i = 0; i < maps()->length(); i++) {
3183 Handle<Map> map = maps()->at(i);
3184 map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup,
3185 info);
3186 }
3187 }
3188 }
3189
3032 ZoneList<Handle<JSObject> > prototypes_; 3190 ZoneList<Handle<JSObject> > prototypes_;
3033 ZoneList<Handle<Map> > maps_; 3191 ZoneList<Handle<Map> > maps_;
3034 UniqueValueId first_prototype_unique_id_; 3192 UniqueValueId first_prototype_unique_id_;
3035 UniqueValueId last_prototype_unique_id_; 3193 UniqueValueId last_prototype_unique_id_;
3036 bool can_omit_prototype_maps_; 3194 bool can_omit_prototype_maps_;
3037 }; 3195 };
3038 3196
3039 3197
3040 class InductionVariableData; 3198 class InductionVariableData;
3041 3199
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
3423 // the operand can change if a new idef of the phi is added between the phi 3581 // the operand can change if a new idef of the phi is added between the phi
3424 // and this instruction (inserting an idef updates every use). 3582 // and this instruction (inserting an idef updates every use).
3425 HPhi* phi_; 3583 HPhi* phi_;
3426 NumericRelation relation_; 3584 NumericRelation relation_;
3427 int operand_index_; 3585 int operand_index_;
3428 }; 3586 };
3429 3587
3430 3588
3431 class HArgumentsObject: public HTemplateInstruction<0> { 3589 class HArgumentsObject: public HTemplateInstruction<0> {
3432 public: 3590 public:
3433 HArgumentsObject(int count, Zone* zone) : values_(count, zone) { 3591 static HArgumentsObject* New(Zone* zone,
3434 set_representation(Representation::Tagged()); 3592 HValue* context,
3435 SetFlag(kIsArguments); 3593 int count) {
3594 return new(zone) HArgumentsObject(count, zone);
3436 } 3595 }
3437 3596
3438 const ZoneList<HValue*>* arguments_values() const { return &values_; } 3597 const ZoneList<HValue*>* arguments_values() const { return &values_; }
3439 int arguments_count() const { return values_.length(); } 3598 int arguments_count() const { return values_.length(); }
3440 3599
3441 void AddArgument(HValue* argument, Zone* zone) { 3600 void AddArgument(HValue* argument, Zone* zone) {
3442 values_.Add(NULL, zone); // Resize list. 3601 values_.Add(NULL, zone); // Resize list.
3443 SetOperandAt(values_.length() - 1, argument); 3602 SetOperandAt(values_.length() - 1, argument);
3444 } 3603 }
3445 3604
3446 virtual int OperandCount() { return values_.length(); } 3605 virtual int OperandCount() { return values_.length(); }
3447 virtual HValue* OperandAt(int index) const { return values_[index]; } 3606 virtual HValue* OperandAt(int index) const { return values_[index]; }
3448 3607
3449 virtual bool HasEscapingOperandAt(int index) { return false; } 3608 virtual bool HasEscapingOperandAt(int index) { return false; }
3450 virtual Representation RequiredInputRepresentation(int index) { 3609 virtual Representation RequiredInputRepresentation(int index) {
3451 return Representation::None(); 3610 return Representation::None();
3452 } 3611 }
3453 3612
3454 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 3613 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3455 3614
3456 protected: 3615 protected:
3457 virtual void InternalSetOperandAt(int index, HValue* value) { 3616 virtual void InternalSetOperandAt(int index, HValue* value) {
3458 values_[index] = value; 3617 values_[index] = value;
3459 } 3618 }
3460 3619
3461 private: 3620 private:
3621 HArgumentsObject(int count, Zone* zone) : values_(count, zone) {
3622 set_representation(Representation::Tagged());
3623 SetFlag(kIsArguments);
3624 }
3625
3462 virtual bool IsDeletable() const { return true; } 3626 virtual bool IsDeletable() const { return true; }
3463 3627
3464 ZoneList<HValue*> values_; 3628 ZoneList<HValue*> values_;
3465 }; 3629 };
3466 3630
3467 3631
3468 class HConstant: public HTemplateInstruction<0> { 3632 class HConstant: public HTemplateInstruction<0> {
3469 public: 3633 public:
3470 HConstant(Handle<Object> handle, Representation r = Representation::None()); 3634 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t);
3471 HConstant(int32_t value, 3635 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double);
3472 Representation r = Representation::None(), 3636 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>);
3473 bool is_not_in_new_space = true, 3637 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference);
3474 Handle<Object> optional_handle = Handle<Object>::null());
3475 HConstant(double value,
3476 Representation r = Representation::None(),
3477 bool is_not_in_new_space = true,
3478 Handle<Object> optional_handle = Handle<Object>::null());
3479 HConstant(Handle<Object> handle,
3480 UniqueValueId unique_id,
3481 Representation r,
3482 HType type,
3483 bool is_internalized_string,
3484 bool is_not_in_new_space,
3485 bool is_cell,
3486 bool boolean_value);
3487 explicit HConstant(ExternalReference reference);
3488 3638
3489 Handle<Object> handle() { 3639 Handle<Object> handle() {
3490 if (handle_.is_null()) { 3640 if (handle_.is_null()) {
3491 Factory* factory = Isolate::Current()->factory(); 3641 Factory* factory = Isolate::Current()->factory();
3492 // Default arguments to is_not_in_new_space depend on this heap number 3642 // Default arguments to is_not_in_new_space depend on this heap number
3493 // to be tenured so that it's guaranteed not be be located in new space. 3643 // to be tenured so that it's guaranteed not be be located in new space.
3494 handle_ = factory->NewNumber(double_value_, TENURED); 3644 handle_ = factory->NewNumber(double_value_, TENURED);
3495 } 3645 }
3496 AllowDeferredHandleDereference smi_check; 3646 AllowDeferredHandleDereference smi_check;
3497 ASSERT(has_int32_value_ || !handle_->IsSmi()); 3647 ASSERT(has_int32_value_ || !handle_->IsSmi());
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
3658 external_reference_value_ == 3808 external_reference_value_ ==
3659 other_constant->external_reference_value_; 3809 other_constant->external_reference_value_;
3660 } else { 3810 } else {
3661 ASSERT(!handle_.is_null()); 3811 ASSERT(!handle_.is_null());
3662 return !other_constant->handle_.is_null() && 3812 return !other_constant->handle_.is_null() &&
3663 unique_id_ == other_constant->unique_id_; 3813 unique_id_ == other_constant->unique_id_;
3664 } 3814 }
3665 } 3815 }
3666 3816
3667 private: 3817 private:
3818 friend class HGraph;
3819 HConstant(Handle<Object> handle, Representation r = Representation::None());
3820 HConstant(int32_t value,
3821 Representation r = Representation::None(),
3822 bool is_not_in_new_space = true,
3823 Handle<Object> optional_handle = Handle<Object>::null());
3824 HConstant(double value,
3825 Representation r = Representation::None(),
3826 bool is_not_in_new_space = true,
3827 Handle<Object> optional_handle = Handle<Object>::null());
3828 HConstant(Handle<Object> handle,
3829 UniqueValueId unique_id,
3830 Representation r,
3831 HType type,
3832 bool is_internalized_string,
3833 bool is_not_in_new_space,
3834 bool is_cell,
3835 bool boolean_value);
3836 explicit HConstant(ExternalReference reference);
3837
3668 void Initialize(Representation r); 3838 void Initialize(Representation r);
3669 3839
3670 virtual bool IsDeletable() const { return true; } 3840 virtual bool IsDeletable() const { return true; }
3671 3841
3672 // If this is a numerical constant, handle_ either points to to the 3842 // If this is a numerical constant, handle_ either points to to the
3673 // HeapObject the constant originated from or is null. If the 3843 // HeapObject the constant originated from or is null. If the
3674 // constant is non-numeric, handle_ always points to a valid 3844 // constant is non-numeric, handle_ always points to a valid
3675 // constant HeapObject. 3845 // constant HeapObject.
3676 Handle<Object> handle_; 3846 Handle<Object> handle_;
3677 UniqueValueId unique_id_; 3847 UniqueValueId unique_id_;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
3775 private: 3945 private:
3776 bool IgnoreObservedOutputRepresentation(Representation current_rep); 3946 bool IgnoreObservedOutputRepresentation(Representation current_rep);
3777 3947
3778 Representation observed_input_representation_[2]; 3948 Representation observed_input_representation_[2];
3779 Representation observed_output_representation_; 3949 Representation observed_output_representation_;
3780 }; 3950 };
3781 3951
3782 3952
3783 class HWrapReceiver: public HTemplateInstruction<2> { 3953 class HWrapReceiver: public HTemplateInstruction<2> {
3784 public: 3954 public:
3785 HWrapReceiver(HValue* receiver, HValue* function) { 3955 DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*);
3786 set_representation(Representation::Tagged());
3787 SetOperandAt(0, receiver);
3788 SetOperandAt(1, function);
3789 }
3790 3956
3791 virtual Representation RequiredInputRepresentation(int index) { 3957 virtual Representation RequiredInputRepresentation(int index) {
3792 return Representation::Tagged(); 3958 return Representation::Tagged();
3793 } 3959 }
3794 3960
3795 HValue* receiver() { return OperandAt(0); } 3961 HValue* receiver() { return OperandAt(0); }
3796 HValue* function() { return OperandAt(1); } 3962 HValue* function() { return OperandAt(1); }
3797 3963
3798 virtual HValue* Canonicalize(); 3964 virtual HValue* Canonicalize();
3799 3965
3800 virtual void PrintDataTo(StringStream* stream); 3966 virtual void PrintDataTo(StringStream* stream);
3801 3967
3802 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) 3968 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver)
3969
3970 private:
3971 HWrapReceiver(HValue* receiver, HValue* function) {
3972 set_representation(Representation::Tagged());
3973 SetOperandAt(0, receiver);
3974 SetOperandAt(1, function);
3975 }
3803 }; 3976 };
3804 3977
3805 3978
3806 class HApplyArguments: public HTemplateInstruction<4> { 3979 class HApplyArguments: public HTemplateInstruction<4> {
3807 public: 3980 public:
3808 HApplyArguments(HValue* function, 3981 HApplyArguments(HValue* function,
3809 HValue* receiver, 3982 HValue* receiver,
3810 HValue* length, 3983 HValue* length,
3811 HValue* elements) { 3984 HValue* elements) {
3812 set_representation(Representation::Tagged()); 3985 set_representation(Representation::Tagged());
(...skipping 15 matching lines...) Expand all
3828 HValue* receiver() { return OperandAt(1); } 4001 HValue* receiver() { return OperandAt(1); }
3829 HValue* length() { return OperandAt(2); } 4002 HValue* length() { return OperandAt(2); }
3830 HValue* elements() { return OperandAt(3); } 4003 HValue* elements() { return OperandAt(3); }
3831 4004
3832 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) 4005 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments)
3833 }; 4006 };
3834 4007
3835 4008
3836 class HArgumentsElements: public HTemplateInstruction<0> { 4009 class HArgumentsElements: public HTemplateInstruction<0> {
3837 public: 4010 public:
3838 explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) { 4011 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool);
3839 // The value produced by this instruction is a pointer into the stack
3840 // that looks as if it was a smi because of alignment.
3841 set_representation(Representation::Tagged());
3842 SetFlag(kUseGVN);
3843 }
3844 4012
3845 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) 4013 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements)
3846 4014
3847 virtual Representation RequiredInputRepresentation(int index) { 4015 virtual Representation RequiredInputRepresentation(int index) {
3848 return Representation::None(); 4016 return Representation::None();
3849 } 4017 }
3850 4018
3851 bool from_inlined() const { return from_inlined_; } 4019 bool from_inlined() const { return from_inlined_; }
3852 4020
3853 protected: 4021 protected:
3854 virtual bool DataEquals(HValue* other) { return true; } 4022 virtual bool DataEquals(HValue* other) { return true; }
3855 4023
3856 private: 4024 private:
4025 explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) {
4026 // The value produced by this instruction is a pointer into the stack
4027 // that looks as if it was a smi because of alignment.
4028 set_representation(Representation::Tagged());
4029 SetFlag(kUseGVN);
4030 }
4031
3857 virtual bool IsDeletable() const { return true; } 4032 virtual bool IsDeletable() const { return true; }
3858 4033
3859 bool from_inlined_; 4034 bool from_inlined_;
3860 }; 4035 };
3861 4036
3862 4037
3863 class HArgumentsLength: public HUnaryOperation { 4038 class HArgumentsLength: public HUnaryOperation {
3864 public: 4039 public:
3865 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 4040 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*);
3866 set_representation(Representation::Integer32());
3867 SetFlag(kUseGVN);
3868 }
3869 4041
3870 virtual Representation RequiredInputRepresentation(int index) { 4042 virtual Representation RequiredInputRepresentation(int index) {
3871 return Representation::Tagged(); 4043 return Representation::Tagged();
3872 } 4044 }
3873 4045
3874 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) 4046 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength)
3875 4047
3876 protected: 4048 protected:
3877 virtual bool DataEquals(HValue* other) { return true; } 4049 virtual bool DataEquals(HValue* other) { return true; }
3878 4050
3879 private: 4051 private:
4052 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
4053 set_representation(Representation::Integer32());
4054 SetFlag(kUseGVN);
4055 }
4056
3880 virtual bool IsDeletable() const { return true; } 4057 virtual bool IsDeletable() const { return true; }
3881 }; 4058 };
3882 4059
3883 4060
3884 class HAccessArgumentsAt: public HTemplateInstruction<3> { 4061 class HAccessArgumentsAt: public HTemplateInstruction<3> {
3885 public: 4062 public:
3886 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 4063 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
3887 set_representation(Representation::Tagged()); 4064 set_representation(Representation::Tagged());
3888 SetFlag(kUseGVN); 4065 SetFlag(kUseGVN);
3889 SetOperandAt(0, arguments); 4066 SetOperandAt(0, arguments);
(...skipping 18 matching lines...) Expand all
3908 4085
3909 virtual bool DataEquals(HValue* other) { return true; } 4086 virtual bool DataEquals(HValue* other) { return true; }
3910 }; 4087 };
3911 4088
3912 4089
3913 class HBoundsCheckBaseIndexInformation; 4090 class HBoundsCheckBaseIndexInformation;
3914 4091
3915 4092
3916 class HBoundsCheck: public HTemplateInstruction<2> { 4093 class HBoundsCheck: public HTemplateInstruction<2> {
3917 public: 4094 public:
3918 // Normally HBoundsCheck should be created using the 4095 DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*);
3919 // HGraphBuilder::AddBoundsCheck() helper.
3920 // However when building stubs, where we know that the arguments are Int32,
3921 // it makes sense to invoke this constructor directly.
3922 HBoundsCheck(HValue* index, HValue* length)
3923 : skip_check_(false),
3924 base_(NULL), offset_(0), scale_(0),
3925 responsibility_direction_(DIRECTION_NONE),
3926 allow_equality_(false) {
3927 SetOperandAt(0, index);
3928 SetOperandAt(1, length);
3929 SetFlag(kFlexibleRepresentation);
3930 SetFlag(kUseGVN);
3931 }
3932 4096
3933 bool skip_check() const { return skip_check_; } 4097 bool skip_check() const { return skip_check_; }
3934 void set_skip_check() { skip_check_ = true; } 4098 void set_skip_check() { skip_check_ = true; }
4099
3935 HValue* base() { return base_; } 4100 HValue* base() { return base_; }
3936 int offset() { return offset_; } 4101 int offset() { return offset_; }
3937 int scale() { return scale_; } 4102 int scale() { return scale_; }
3938 bool index_can_increase() { 4103 bool index_can_increase() {
3939 return (responsibility_direction_ & DIRECTION_LOWER) == 0; 4104 return (responsibility_direction_ & DIRECTION_LOWER) == 0;
3940 } 4105 }
3941 bool index_can_decrease() { 4106 bool index_can_decrease() {
3942 return (responsibility_direction_ & DIRECTION_UPPER) == 0; 4107 return (responsibility_direction_ & DIRECTION_UPPER) == 0;
3943 } 4108 }
3944 4109
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3994 virtual bool DataEquals(HValue* other) { return true; } 4159 virtual bool DataEquals(HValue* other) { return true; }
3995 virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context); 4160 virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context);
3996 bool skip_check_; 4161 bool skip_check_;
3997 HValue* base_; 4162 HValue* base_;
3998 int offset_; 4163 int offset_;
3999 int scale_; 4164 int scale_;
4000 RangeGuaranteeDirection responsibility_direction_; 4165 RangeGuaranteeDirection responsibility_direction_;
4001 bool allow_equality_; 4166 bool allow_equality_;
4002 4167
4003 private: 4168 private:
4169 // Normally HBoundsCheck should be created using the
4170 // HGraphBuilder::AddBoundsCheck() helper.
4171 // However when building stubs, where we know that the arguments are Int32,
4172 // it makes sense to invoke this constructor directly.
4173 HBoundsCheck(HValue* index, HValue* length)
4174 : skip_check_(false),
4175 base_(NULL), offset_(0), scale_(0),
4176 responsibility_direction_(DIRECTION_NONE),
4177 allow_equality_(false) {
4178 SetOperandAt(0, index);
4179 SetOperandAt(1, length);
4180 SetFlag(kFlexibleRepresentation);
4181 SetFlag(kUseGVN);
4182 }
4183
4004 virtual bool IsDeletable() const { 4184 virtual bool IsDeletable() const {
4005 return skip_check() && !FLAG_debug_code; 4185 return skip_check() && !FLAG_debug_code;
4006 } 4186 }
4007 }; 4187 };
4008 4188
4009 4189
4010 class HBoundsCheckBaseIndexInformation: public HTemplateInstruction<2> { 4190 class HBoundsCheckBaseIndexInformation: public HTemplateInstruction<2> {
4011 public: 4191 public:
4012 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { 4192 explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) {
4013 DecompositionResult decomposition; 4193 DecompositionResult decomposition;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
4091 4271
4092 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) 4272 DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation)
4093 4273
4094 private: 4274 private:
4095 virtual bool IsDeletable() const { return true; } 4275 virtual bool IsDeletable() const { return true; }
4096 }; 4276 };
4097 4277
4098 4278
4099 class HMathFloorOfDiv: public HBinaryOperation { 4279 class HMathFloorOfDiv: public HBinaryOperation {
4100 public: 4280 public:
4101 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right) 4281 static HMathFloorOfDiv* New(Zone* zone,
4102 : HBinaryOperation(context, left, right) { 4282 HValue* context,
4103 set_representation(Representation::Integer32()); 4283 HValue* left,
4104 SetFlag(kUseGVN); 4284 HValue* right) {
4105 SetFlag(kCanOverflow); 4285 return new(zone) HMathFloorOfDiv(context, left, right);
4106 if (!right->IsConstant()) {
4107 SetFlag(kCanBeDivByZero);
4108 }
4109 SetFlag(kAllowUndefinedAsNaN);
4110 } 4286 }
4111 4287
4112 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 4288 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
4113 4289
4114 virtual Representation RequiredInputRepresentation(int index) { 4290 virtual Representation RequiredInputRepresentation(int index) {
4115 return Representation::Integer32(); 4291 return Representation::Integer32();
4116 } 4292 }
4117 4293
4118 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv) 4294 DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv)
4119 4295
4120 protected: 4296 protected:
4121 virtual bool DataEquals(HValue* other) { return true; } 4297 virtual bool DataEquals(HValue* other) { return true; }
4122 4298
4123 private: 4299 private:
4300 HMathFloorOfDiv(HValue* context, HValue* left, HValue* right)
4301 : HBinaryOperation(context, left, right) {
4302 set_representation(Representation::Integer32());
4303 SetFlag(kUseGVN);
4304 SetFlag(kCanOverflow);
4305 if (!right->IsConstant()) {
4306 SetFlag(kCanBeDivByZero);
4307 }
4308 SetFlag(kAllowUndefinedAsNaN);
4309 }
4310
4124 virtual bool IsDeletable() const { return true; } 4311 virtual bool IsDeletable() const { return true; }
4125 }; 4312 };
4126 4313
4127 4314
4128 class HArithmeticBinaryOperation: public HBinaryOperation { 4315 class HArithmeticBinaryOperation: public HBinaryOperation {
4129 public: 4316 public:
4130 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) 4317 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
4131 : HBinaryOperation(context, left, right) { 4318 : HBinaryOperation(context, left, right) {
4132 SetAllSideEffects(); 4319 SetAllSideEffects();
4133 SetFlag(kFlexibleRepresentation); 4320 SetFlag(kFlexibleRepresentation);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
4218 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) 4405 DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch)
4219 4406
4220 private: 4407 private:
4221 Representation observed_input_representation_[2]; 4408 Representation observed_input_representation_[2];
4222 Token::Value token_; 4409 Token::Value token_;
4223 }; 4410 };
4224 4411
4225 4412
4226 class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> { 4413 class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
4227 public: 4414 public:
4228 HCompareObjectEqAndBranch(HValue* left, HValue* right) { 4415 // TODO(danno): make this private when the IfBuilder properly constructs
4416 // control flow instructions.lithium
Toon Verwaest 2013/07/31 12:56:37 Left-over "lithium" at the end of the sentence.
danno 2013/07/31 14:10:09 Done.
4417 HCompareObjectEqAndBranch(HValue* left,
4418 HValue* right) {
4229 SetOperandAt(0, left); 4419 SetOperandAt(0, left);
4230 SetOperandAt(1, right); 4420 SetOperandAt(1, right);
4231 } 4421 }
4232 4422
4423 DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*);
4424
4233 HValue* left() { return OperandAt(0); } 4425 HValue* left() { return OperandAt(0); }
4234 HValue* right() { return OperandAt(1); } 4426 HValue* right() { return OperandAt(1); }
4235 4427
4236 virtual void PrintDataTo(StringStream* stream); 4428 virtual void PrintDataTo(StringStream* stream);
4237 4429
4238 virtual Representation RequiredInputRepresentation(int index) { 4430 virtual Representation RequiredInputRepresentation(int index) {
4239 return Representation::Tagged(); 4431 return Representation::Tagged();
4240 } 4432 }
4241 4433
4242 virtual Representation observed_input_representation(int index) { 4434 virtual Representation observed_input_representation(int index) {
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
4512 virtual Representation RequiredInputRepresentation(int index) { 4704 virtual Representation RequiredInputRepresentation(int index) {
4513 return Representation::Tagged(); 4705 return Representation::Tagged();
4514 } 4706 }
4515 4707
4516 DECLARE_CONCRETE_INSTRUCTION(InstanceSize) 4708 DECLARE_CONCRETE_INSTRUCTION(InstanceSize)
4517 }; 4709 };
4518 4710
4519 4711
4520 class HPower: public HTemplateInstruction<2> { 4712 class HPower: public HTemplateInstruction<2> {
4521 public: 4713 public:
4522 static HInstruction* New(Zone* zone, HValue* left, HValue* right); 4714 static HInstruction* New(Zone* zone,
4715 HValue* context,
4716 HValue* left,
4717 HValue* right);
4523 4718
4524 HValue* left() { return OperandAt(0); } 4719 HValue* left() { return OperandAt(0); }
4525 HValue* right() const { return OperandAt(1); } 4720 HValue* right() const { return OperandAt(1); }
4526 4721
4527 virtual Representation RequiredInputRepresentation(int index) { 4722 virtual Representation RequiredInputRepresentation(int index) {
4528 return index == 0 4723 return index == 0
4529 ? Representation::Double() 4724 ? Representation::Double()
4530 : Representation::None(); 4725 : Representation::None();
4531 } 4726 }
4532 virtual Representation observed_input_representation(int index) { 4727 virtual Representation observed_input_representation(int index) {
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
4849 : HArithmeticBinaryOperation(context, left, right), 5044 : HArithmeticBinaryOperation(context, left, right),
4850 operation_(op) { } 5045 operation_(op) { }
4851 5046
4852 Operation operation_; 5047 Operation operation_;
4853 }; 5048 };
4854 5049
4855 5050
4856 class HBitwise: public HBitwiseBinaryOperation { 5051 class HBitwise: public HBitwiseBinaryOperation {
4857 public: 5052 public:
4858 static HInstruction* New(Zone* zone, 5053 static HInstruction* New(Zone* zone,
5054 HValue* context,
4859 Token::Value op, 5055 Token::Value op,
4860 HValue* context,
4861 HValue* left, 5056 HValue* left,
4862 HValue* right); 5057 HValue* right);
4863 5058
4864 Token::Value op() const { return op_; } 5059 Token::Value op() const { return op_; }
4865 5060
4866 virtual bool IsCommutative() const { return true; } 5061 virtual bool IsCommutative() const { return true; }
4867 5062
4868 virtual HValue* Canonicalize(); 5063 virtual HValue* Canonicalize();
4869 5064
4870 virtual void PrintDataTo(StringStream* stream); 5065 virtual void PrintDataTo(StringStream* stream);
4871 5066
4872 DECLARE_CONCRETE_INSTRUCTION(Bitwise) 5067 DECLARE_CONCRETE_INSTRUCTION(Bitwise)
4873 5068
4874 protected: 5069 protected:
4875 virtual bool DataEquals(HValue* other) { 5070 virtual bool DataEquals(HValue* other) {
4876 return op() == HBitwise::cast(other)->op(); 5071 return op() == HBitwise::cast(other)->op();
4877 } 5072 }
4878 5073
4879 virtual Range* InferRange(Zone* zone); 5074 virtual Range* InferRange(Zone* zone);
4880 5075
4881 private: 5076 private:
4882 HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right) 5077 HBitwise(HValue* context, Token::Value op, HValue* left, HValue* right)
4883 : HBitwiseBinaryOperation(context, left, right), op_(op) { 5078 : HBitwiseBinaryOperation(context, left, right), op_(op) {
4884 ASSERT(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); 5079 ASSERT(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR);
4885 // BIT_AND with a smi-range positive value will always unset the 5080 // BIT_AND with a smi-range positive value will always unset the
4886 // entire sign-extension of the smi-sign. 5081 // entire sign-extension of the smi-sign.
4887 if (op == Token::BIT_AND && 5082 if (op == Token::BIT_AND &&
4888 ((left->IsConstant() && 5083 ((left->IsConstant() &&
4889 left->representation().IsSmi() && 5084 left->representation().IsSmi() &&
4890 HConstant::cast(left)->Integer32Value() >= 0) || 5085 HConstant::cast(left)->Integer32Value() >= 0) ||
4891 (right->IsConstant() && 5086 (right->IsConstant() &&
4892 right->representation().IsSmi() && 5087 right->representation().IsSmi() &&
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
5034 5229
5035 DECLARE_CONCRETE_INSTRUCTION(Ror) 5230 DECLARE_CONCRETE_INSTRUCTION(Ror)
5036 5231
5037 protected: 5232 protected:
5038 virtual bool DataEquals(HValue* other) { return true; } 5233 virtual bool DataEquals(HValue* other) { return true; }
5039 }; 5234 };
5040 5235
5041 5236
5042 class HOsrEntry: public HTemplateInstruction<0> { 5237 class HOsrEntry: public HTemplateInstruction<0> {
5043 public: 5238 public:
5044 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) { 5239 DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId);
5045 SetGVNFlag(kChangesOsrEntries);
5046 SetGVNFlag(kChangesNewSpacePromotion);
5047 }
5048 5240
5049 BailoutId ast_id() const { return ast_id_; } 5241 BailoutId ast_id() const { return ast_id_; }
5050 5242
5051 virtual Representation RequiredInputRepresentation(int index) { 5243 virtual Representation RequiredInputRepresentation(int index) {
5052 return Representation::None(); 5244 return Representation::None();
5053 } 5245 }
5054 5246
5055 DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 5247 DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
5056 5248
5057 private: 5249 private:
5250 explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) {
5251 SetGVNFlag(kChangesOsrEntries);
5252 SetGVNFlag(kChangesNewSpacePromotion);
5253 }
5254
5058 BailoutId ast_id_; 5255 BailoutId ast_id_;
5059 }; 5256 };
5060 5257
5061 5258
5062 class HParameter: public HTemplateInstruction<0> { 5259 class HParameter: public HTemplateInstruction<0> {
5063 public: 5260 public:
5064 enum ParameterKind { 5261 enum ParameterKind {
5065 STACK_PARAMETER, 5262 STACK_PARAMETER,
5066 REGISTER_PARAMETER 5263 REGISTER_PARAMETER
5067 }; 5264 };
5068 5265
5266 DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned);
5267 DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind);
5268 DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind,
5269 Representation);
5270
5271 unsigned index() const { return index_; }
5272 ParameterKind kind() const { return kind_; }
5273
5274 virtual void PrintDataTo(StringStream* stream);
5275
5276 virtual Representation RequiredInputRepresentation(int index) {
5277 return Representation::None();
5278 }
5279
5280 DECLARE_CONCRETE_INSTRUCTION(Parameter)
5281
5282 private:
5069 explicit HParameter(unsigned index, 5283 explicit HParameter(unsigned index,
5070 ParameterKind kind = STACK_PARAMETER) 5284 ParameterKind kind = STACK_PARAMETER)
5071 : index_(index), 5285 : index_(index),
5072 kind_(kind) { 5286 kind_(kind) {
5073 set_representation(Representation::Tagged()); 5287 set_representation(Representation::Tagged());
5074 } 5288 }
5075 5289
5076 explicit HParameter(unsigned index, 5290 explicit HParameter(unsigned index,
5077 ParameterKind kind, 5291 ParameterKind kind,
5078 Representation r) 5292 Representation r)
5079 : index_(index), 5293 : index_(index),
5080 kind_(kind) { 5294 kind_(kind) {
5081 set_representation(r); 5295 set_representation(r);
5082 } 5296 }
5083 5297
5084 unsigned index() const { return index_; }
5085 ParameterKind kind() const { return kind_; }
5086
5087 virtual void PrintDataTo(StringStream* stream);
5088
5089 virtual Representation RequiredInputRepresentation(int index) {
5090 return Representation::None();
5091 }
5092
5093 DECLARE_CONCRETE_INSTRUCTION(Parameter)
5094
5095 private:
5096 unsigned index_; 5298 unsigned index_;
5097 ParameterKind kind_; 5299 ParameterKind kind_;
5098 }; 5300 };
5099 5301
5100 5302
5101 class HCallStub: public HUnaryCall { 5303 class HCallStub: public HUnaryCall {
5102 public: 5304 public:
5103 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) 5305 HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
5104 : HUnaryCall(context, argument_count), 5306 : HUnaryCall(context, argument_count),
5105 major_key_(major_key), 5307 major_key_(major_key),
(...skipping 20 matching lines...) Expand all
5126 DECLARE_CONCRETE_INSTRUCTION(CallStub) 5328 DECLARE_CONCRETE_INSTRUCTION(CallStub)
5127 5329
5128 private: 5330 private:
5129 CodeStub::Major major_key_; 5331 CodeStub::Major major_key_;
5130 TranscendentalCache::Type transcendental_type_; 5332 TranscendentalCache::Type transcendental_type_;
5131 }; 5333 };
5132 5334
5133 5335
5134 class HUnknownOSRValue: public HTemplateInstruction<0> { 5336 class HUnknownOSRValue: public HTemplateInstruction<0> {
5135 public: 5337 public:
5136 HUnknownOSRValue() 5338 DECLARE_INSTRUCTION_FACTORY_P0(HUnknownOSRValue)
5137 : incoming_value_(NULL) {
5138 set_representation(Representation::Tagged());
5139 }
5140 5339
5141 virtual Representation RequiredInputRepresentation(int index) { 5340 virtual Representation RequiredInputRepresentation(int index) {
5142 return Representation::None(); 5341 return Representation::None();
5143 } 5342 }
5144 5343
5145 void set_incoming_value(HPhi* value) { 5344 void set_incoming_value(HPhi* value) {
5146 incoming_value_ = value; 5345 incoming_value_ = value;
5147 } 5346 }
5148 5347
5149 HPhi* incoming_value() { 5348 HPhi* incoming_value() {
5150 return incoming_value_; 5349 return incoming_value_;
5151 } 5350 }
5152 5351
5153 virtual Representation KnownOptimalRepresentation() { 5352 virtual Representation KnownOptimalRepresentation() {
5154 if (incoming_value_ == NULL) return Representation::None(); 5353 if (incoming_value_ == NULL) return Representation::None();
5155 return incoming_value_->KnownOptimalRepresentation(); 5354 return incoming_value_->KnownOptimalRepresentation();
5156 } 5355 }
5157 5356
5158 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) 5357 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue)
5159 5358
5160 private: 5359 private:
5360 HUnknownOSRValue()
5361 : incoming_value_(NULL) {
5362 set_representation(Representation::Tagged());
5363 }
5364
5161 HPhi* incoming_value_; 5365 HPhi* incoming_value_;
5162 }; 5366 };
5163 5367
5164 5368
5165 class HLoadGlobalCell: public HTemplateInstruction<0> { 5369 class HLoadGlobalCell: public HTemplateInstruction<0> {
5166 public: 5370 public:
5167 HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details) 5371 HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details)
5168 : cell_(cell), details_(details), unique_id_() { 5372 : cell_(cell), details_(details), unique_id_() {
5169 set_representation(Representation::Tagged()); 5373 set_representation(Representation::Tagged());
5170 SetFlag(kUseGVN); 5374 SetFlag(kUseGVN);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
5241 class HAllocate: public HTemplateInstruction<2> { 5445 class HAllocate: public HTemplateInstruction<2> {
5242 public: 5446 public:
5243 enum Flags { 5447 enum Flags {
5244 CAN_ALLOCATE_IN_NEW_SPACE = 1 << 0, 5448 CAN_ALLOCATE_IN_NEW_SPACE = 1 << 0,
5245 CAN_ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, 5449 CAN_ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1,
5246 CAN_ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, 5450 CAN_ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2,
5247 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, 5451 ALLOCATE_DOUBLE_ALIGNED = 1 << 3,
5248 PREFILL_WITH_FILLER = 1 << 4 5452 PREFILL_WITH_FILLER = 1 << 4
5249 }; 5453 };
5250 5454
5251 HAllocate(HValue* context, HValue* size, HType type, Flags flags) 5455 static HAllocate* New(Zone* zone,
5252 : flags_(flags) { 5456 HValue* context,
5253 SetOperandAt(0, context); 5457 HValue* size,
5254 SetOperandAt(1, size); 5458 HType type,
5255 set_type(type); 5459 Flags flags) {
5256 set_representation(Representation::Tagged()); 5460 return new(zone) HAllocate(context, size, type, flags);
5257 SetFlag(kTrackSideEffectDominators);
5258 SetGVNFlag(kChangesNewSpacePromotion);
5259 SetGVNFlag(kDependsOnNewSpacePromotion);
5260 } 5461 }
5261 5462
5262 // Maximum instance size for which allocations will be inlined. 5463 // Maximum instance size for which allocations will be inlined.
5263 static const int kMaxInlineSize = 64 * kPointerSize; 5464 static const int kMaxInlineSize = 64 * kPointerSize;
5264 5465
5265 static Flags DefaultFlags() { 5466 static Flags DefaultFlags() {
5266 return CAN_ALLOCATE_IN_NEW_SPACE; 5467 return CAN_ALLOCATE_IN_NEW_SPACE;
5267 } 5468 }
5268 5469
5269 static Flags DefaultFlags(ElementsKind kind) { 5470 static Flags DefaultFlags(ElementsKind kind) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
5332 } 5533 }
5333 5534
5334 virtual void HandleSideEffectDominator(GVNFlag side_effect, 5535 virtual void HandleSideEffectDominator(GVNFlag side_effect,
5335 HValue* dominator); 5536 HValue* dominator);
5336 5537
5337 virtual void PrintDataTo(StringStream* stream); 5538 virtual void PrintDataTo(StringStream* stream);
5338 5539
5339 DECLARE_CONCRETE_INSTRUCTION(Allocate) 5540 DECLARE_CONCRETE_INSTRUCTION(Allocate)
5340 5541
5341 private: 5542 private:
5543 HAllocate(HValue* context, HValue* size, HType type, Flags flags)
5544 : flags_(flags) {
5545 SetOperandAt(0, context);
5546 SetOperandAt(1, size);
5547 set_type(type);
5548 set_representation(Representation::Tagged());
5549 SetFlag(kTrackSideEffectDominators);
5550 SetGVNFlag(kChangesNewSpacePromotion);
5551 SetGVNFlag(kDependsOnNewSpacePromotion);
5552 }
5553
5342 Flags flags_; 5554 Flags flags_;
5343 Handle<Map> known_initial_map_; 5555 Handle<Map> known_initial_map_;
5344 }; 5556 };
5345 5557
5346 5558
5347 class HInnerAllocatedObject: public HTemplateInstruction<1> { 5559 class HInnerAllocatedObject: public HTemplateInstruction<1> {
5348 public: 5560 public:
5349 HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged()) 5561 static HInnerAllocatedObject* New(Zone* zone,
5350 : offset_(offset) { 5562 HValue* context,
5351 ASSERT(value->IsAllocate()); 5563 HValue* value,
5352 SetOperandAt(0, value); 5564 int offset,
5353 set_type(type); 5565 HType type = HType::Tagged()) {
5354 set_representation(Representation::Tagged()); 5566 return new(zone) HInnerAllocatedObject(value, offset, type);
5355 } 5567 }
5356 5568
5357 HValue* base_object() { return OperandAt(0); } 5569 HValue* base_object() { return OperandAt(0); }
5358 int offset() { return offset_; } 5570 int offset() { return offset_; }
5359 5571
5360 virtual Representation RequiredInputRepresentation(int index) { 5572 virtual Representation RequiredInputRepresentation(int index) {
5361 return Representation::Tagged(); 5573 return Representation::Tagged();
5362 } 5574 }
5363 5575
5364 virtual void PrintDataTo(StringStream* stream); 5576 virtual void PrintDataTo(StringStream* stream);
5365 5577
5366 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) 5578 DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject)
5367 5579
5368 private: 5580 private:
5581 HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged())
5582 : offset_(offset) {
5583 ASSERT(value->IsAllocate());
5584 SetOperandAt(0, value);
5585 set_type(type);
5586 set_representation(Representation::Tagged());
5587 }
5588
5369 int offset_; 5589 int offset_;
5370 }; 5590 };
5371 5591
5372 5592
5373 inline bool StoringValueNeedsWriteBarrier(HValue* value) { 5593 inline bool StoringValueNeedsWriteBarrier(HValue* value) {
5374 return !value->type().IsBoolean() 5594 return !value->type().IsBoolean()
5375 && !value->type().IsSmi() 5595 && !value->type().IsSmi()
5376 && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable()); 5596 && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable());
5377 } 5597 }
5378 5598
(...skipping 11 matching lines...) Expand all
5390 if (object != new_space_dominator) return true; 5610 if (object != new_space_dominator) return true;
5391 if (object->IsAllocate()) { 5611 if (object->IsAllocate()) {
5392 return !HAllocate::cast(object)->GuaranteedInNewSpace(); 5612 return !HAllocate::cast(object)->GuaranteedInNewSpace();
5393 } 5613 }
5394 return true; 5614 return true;
5395 } 5615 }
5396 5616
5397 5617
5398 class HStoreGlobalCell: public HUnaryOperation { 5618 class HStoreGlobalCell: public HUnaryOperation {
5399 public: 5619 public:
5400 HStoreGlobalCell(HValue* value, 5620 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*,
5401 Handle<PropertyCell> cell, 5621 Handle<PropertyCell>, PropertyDetails);
5402 PropertyDetails details)
5403 : HUnaryOperation(value),
5404 cell_(cell),
5405 details_(details) {
5406 SetGVNFlag(kChangesGlobalVars);
5407 }
5408 5622
5409 Handle<PropertyCell> cell() const { return cell_; } 5623 Handle<PropertyCell> cell() const { return cell_; }
5410 bool RequiresHoleCheck() { 5624 bool RequiresHoleCheck() {
5411 return !details_.IsDontDelete() || details_.IsReadOnly(); 5625 return !details_.IsDontDelete() || details_.IsReadOnly();
5412 } 5626 }
5413 bool NeedsWriteBarrier() { 5627 bool NeedsWriteBarrier() {
5414 return StoringValueNeedsWriteBarrier(value()); 5628 return StoringValueNeedsWriteBarrier(value());
5415 } 5629 }
5416 5630
5417 virtual Representation RequiredInputRepresentation(int index) { 5631 virtual Representation RequiredInputRepresentation(int index) {
5418 return Representation::Tagged(); 5632 return Representation::Tagged();
5419 } 5633 }
5420 virtual void PrintDataTo(StringStream* stream); 5634 virtual void PrintDataTo(StringStream* stream);
5421 5635
5422 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 5636 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
5423 5637
5424 private: 5638 private:
5639 HStoreGlobalCell(HValue* value,
5640 Handle<PropertyCell> cell,
5641 PropertyDetails details)
5642 : HUnaryOperation(value),
5643 cell_(cell),
5644 details_(details) {
5645 SetGVNFlag(kChangesGlobalVars);
5646 }
5647
5425 Handle<PropertyCell> cell_; 5648 Handle<PropertyCell> cell_;
5426 PropertyDetails details_; 5649 PropertyDetails details_;
5427 }; 5650 };
5428 5651
5429 5652
5430 class HStoreGlobalGeneric: public HTemplateInstruction<3> { 5653 class HStoreGlobalGeneric: public HTemplateInstruction<3> {
5431 public: 5654 public:
5432 HStoreGlobalGeneric(HValue* context, 5655 inline static HStoreGlobalGeneric* New(Zone* zone,
5433 HValue* global_object, 5656 HValue* context,
5434 Handle<Object> name, 5657 HValue* global_object,
5435 HValue* value, 5658 Handle<Object> name,
5436 StrictModeFlag strict_mode_flag) 5659 HValue* value,
5437 : name_(name), 5660 StrictModeFlag strict_mode_flag) {
5438 strict_mode_flag_(strict_mode_flag) { 5661 return new(zone) HStoreGlobalGeneric(context, global_object,
5439 SetOperandAt(0, context); 5662 name, value, strict_mode_flag);
5440 SetOperandAt(1, global_object);
5441 SetOperandAt(2, value);
5442 set_representation(Representation::Tagged());
5443 SetAllSideEffects();
5444 } 5663 }
5445 5664
5446 HValue* context() { return OperandAt(0); } 5665 HValue* context() { return OperandAt(0); }
5447 HValue* global_object() { return OperandAt(1); } 5666 HValue* global_object() { return OperandAt(1); }
5448 Handle<Object> name() const { return name_; } 5667 Handle<Object> name() const { return name_; }
5449 HValue* value() { return OperandAt(2); } 5668 HValue* value() { return OperandAt(2); }
5450 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 5669 StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
5451 5670
5452 virtual void PrintDataTo(StringStream* stream); 5671 virtual void PrintDataTo(StringStream* stream);
5453 5672
5454 virtual Representation RequiredInputRepresentation(int index) { 5673 virtual Representation RequiredInputRepresentation(int index) {
5455 return Representation::Tagged(); 5674 return Representation::Tagged();
5456 } 5675 }
5457 5676
5458 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric) 5677 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric)
5459 5678
5460 private: 5679 private:
5680 HStoreGlobalGeneric(HValue* context,
5681 HValue* global_object,
5682 Handle<Object> name,
5683 HValue* value,
5684 StrictModeFlag strict_mode_flag)
5685 : name_(name),
5686 strict_mode_flag_(strict_mode_flag) {
5687 SetOperandAt(0, context);
5688 SetOperandAt(1, global_object);
5689 SetOperandAt(2, value);
5690 set_representation(Representation::Tagged());
5691 SetAllSideEffects();
5692 }
5693
5461 Handle<Object> name_; 5694 Handle<Object> name_;
5462 StrictModeFlag strict_mode_flag_; 5695 StrictModeFlag strict_mode_flag_;
5463 }; 5696 };
5464 5697
5465 5698
5466 class HLoadContextSlot: public HUnaryOperation { 5699 class HLoadContextSlot: public HUnaryOperation {
5467 public: 5700 public:
5468 enum Mode { 5701 enum Mode {
5469 // Perform a normal load of the context slot without checking its value. 5702 // Perform a normal load of the context slot without checking its value.
5470 kNoCheck, 5703 kNoCheck,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
5538 kNoCheck, 5771 kNoCheck,
5539 // Check the previous value of the context slot and deoptimize if it's the 5772 // Check the previous value of the context slot and deoptimize if it's the
5540 // hole value. This is used for checking for assignments to uninitialized 5773 // hole value. This is used for checking for assignments to uninitialized
5541 // harmony bindings where we deoptimize into full-codegen generated code 5774 // harmony bindings where we deoptimize into full-codegen generated code
5542 // which will subsequently throw a reference error. 5775 // which will subsequently throw a reference error.
5543 kCheckDeoptimize, 5776 kCheckDeoptimize,
5544 // Check the previous value and ignore assignment if it isn't a hole value 5777 // Check the previous value and ignore assignment if it isn't a hole value
5545 kCheckIgnoreAssignment 5778 kCheckIgnoreAssignment
5546 }; 5779 };
5547 5780
5548 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) 5781 DECLARE_INSTRUCTION_FACTORY_P4(HStoreContextSlot, HValue*, int,
5549 : slot_index_(slot_index), mode_(mode) { 5782 Mode, HValue*);
5550 SetOperandAt(0, context);
5551 SetOperandAt(1, value);
5552 SetGVNFlag(kChangesContextSlots);
5553 }
5554 5783
5555 HValue* context() { return OperandAt(0); } 5784 HValue* context() { return OperandAt(0); }
5556 HValue* value() { return OperandAt(1); } 5785 HValue* value() { return OperandAt(1); }
5557 int slot_index() const { return slot_index_; } 5786 int slot_index() const { return slot_index_; }
5558 Mode mode() const { return mode_; } 5787 Mode mode() const { return mode_; }
5559 5788
5560 bool NeedsWriteBarrier() { 5789 bool NeedsWriteBarrier() {
5561 return StoringValueNeedsWriteBarrier(value()); 5790 return StoringValueNeedsWriteBarrier(value());
5562 } 5791 }
5563 5792
5564 bool DeoptimizesOnHole() { 5793 bool DeoptimizesOnHole() {
5565 return mode_ == kCheckDeoptimize; 5794 return mode_ == kCheckDeoptimize;
5566 } 5795 }
5567 5796
5568 bool RequiresHoleCheck() { 5797 bool RequiresHoleCheck() {
5569 return mode_ != kNoCheck; 5798 return mode_ != kNoCheck;
5570 } 5799 }
5571 5800
5572 virtual Representation RequiredInputRepresentation(int index) { 5801 virtual Representation RequiredInputRepresentation(int index) {
5573 return Representation::Tagged(); 5802 return Representation::Tagged();
5574 } 5803 }
5575 5804
5576 virtual void PrintDataTo(StringStream* stream); 5805 virtual void PrintDataTo(StringStream* stream);
5577 5806
5578 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) 5807 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot)
5579 5808
5580 private: 5809 private:
5810 HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value)
5811 : slot_index_(slot_index), mode_(mode) {
5812 SetOperandAt(0, context);
5813 SetOperandAt(1, value);
5814 SetGVNFlag(kChangesContextSlots);
5815 }
5816
5581 int slot_index_; 5817 int slot_index_;
5582 Mode mode_; 5818 Mode mode_;
5583 }; 5819 };
5584 5820
5585 5821
5586 // Represents an access to a portion of an object, such as the map pointer, 5822 // Represents an access to a portion of an object, such as the map pointer,
5587 // array elements pointer, etc, but not accesses to array elements themselves. 5823 // array elements pointer, etc, but not accesses to array elements themselves.
5588 class HObjectAccess { 5824 class HObjectAccess {
5589 public: 5825 public:
5590 inline bool IsInobject() const { 5826 inline bool IsInobject() const {
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
5743 }; 5979 };
5744 5980
5745 5981
5746 class HLinkObjectInList: public HUnaryOperation { 5982 class HLinkObjectInList: public HUnaryOperation {
5747 public: 5983 public:
5748 // There needs to be a mapping from every KnownList to an external reference 5984 // There needs to be a mapping from every KnownList to an external reference
5749 enum KnownList { 5985 enum KnownList {
5750 ALLOCATION_SITE_LIST 5986 ALLOCATION_SITE_LIST
5751 }; 5987 };
5752 5988
5753 HLinkObjectInList(HValue* object, HObjectAccess store_field, 5989 DECLARE_INSTRUCTION_FACTORY_P3(HLinkObjectInList, HValue*,
5754 KnownList known_list) 5990 HObjectAccess, KnownList);
5755 : HUnaryOperation(object),
5756 store_field_(store_field),
5757 known_list_(known_list) {
5758 set_representation(Representation::Tagged());
5759 }
5760 5991
5761 HObjectAccess store_field() const { return store_field_; } 5992 HObjectAccess store_field() const { return store_field_; }
5762 KnownList known_list() const { return known_list_; } 5993 KnownList known_list() const { return known_list_; }
5763 5994
5764 virtual Representation RequiredInputRepresentation(int index) { 5995 virtual Representation RequiredInputRepresentation(int index) {
5765 return Representation::Tagged(); 5996 return Representation::Tagged();
5766 } 5997 }
5767 5998
5768 virtual void PrintDataTo(StringStream* stream); 5999 virtual void PrintDataTo(StringStream* stream);
5769 6000
5770 DECLARE_CONCRETE_INSTRUCTION(LinkObjectInList) 6001 DECLARE_CONCRETE_INSTRUCTION(LinkObjectInList)
5771 6002
5772 private: 6003 private:
6004 HLinkObjectInList(HValue* object, HObjectAccess store_field,
6005 KnownList known_list)
6006 : HUnaryOperation(object),
6007 store_field_(store_field),
6008 known_list_(known_list) {
6009 set_representation(Representation::Tagged());
6010 }
6011
5773 HObjectAccess store_field_; 6012 HObjectAccess store_field_;
5774 KnownList known_list_; 6013 KnownList known_list_;
5775 }; 6014 };
5776 6015
5777 6016
5778 class HLoadNamedField: public HTemplateInstruction<2> { 6017 class HLoadNamedField: public HTemplateInstruction<2> {
5779 public: 6018 public:
5780 HLoadNamedField(HValue* object, 6019 DECLARE_INSTRUCTION_FACTORY_P2(HLoadNamedField, HValue*, HObjectAccess);
5781 HObjectAccess access, 6020 DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, HObjectAccess,
5782 HValue* typecheck = NULL) 6021 HValue*);
5783 : access_(access) {
5784 ASSERT(object != NULL);
5785 SetOperandAt(0, object);
5786 SetOperandAt(1, typecheck != NULL ? typecheck : object);
5787
5788 Representation representation = access.representation();
5789 if (representation.IsSmi()) {
5790 set_type(HType::Smi());
5791 set_representation(representation);
5792 } else if (representation.IsDouble() ||
5793 representation.IsExternal() ||
5794 representation.IsInteger32()) {
5795 set_representation(representation);
5796 } else if (FLAG_track_heap_object_fields &&
5797 representation.IsHeapObject()) {
5798 set_type(HType::NonPrimitive());
5799 set_representation(Representation::Tagged());
5800 } else {
5801 set_representation(Representation::Tagged());
5802 }
5803 access.SetGVNFlags(this, false);
5804 }
5805 6022
5806 HValue* object() { return OperandAt(0); } 6023 HValue* object() { return OperandAt(0); }
5807 HValue* typecheck() { 6024 HValue* typecheck() {
5808 ASSERT(HasTypeCheck()); 6025 ASSERT(HasTypeCheck());
5809 return OperandAt(1); 6026 return OperandAt(1);
5810 } 6027 }
5811 6028
5812 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } 6029 bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); }
5813 HObjectAccess access() const { return access_; } 6030 HObjectAccess access() const { return access_; }
5814 Representation field_representation() const { 6031 Representation field_representation() const {
(...skipping 12 matching lines...) Expand all
5827 6044
5828 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 6045 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
5829 6046
5830 protected: 6047 protected:
5831 virtual bool DataEquals(HValue* other) { 6048 virtual bool DataEquals(HValue* other) {
5832 HLoadNamedField* b = HLoadNamedField::cast(other); 6049 HLoadNamedField* b = HLoadNamedField::cast(other);
5833 return access_.Equals(b->access_); 6050 return access_.Equals(b->access_);
5834 } 6051 }
5835 6052
5836 private: 6053 private:
6054 HLoadNamedField(HValue* object,
6055 HObjectAccess access,
6056 HValue* typecheck = NULL)
6057 : access_(access) {
6058 ASSERT(object != NULL);
6059 SetOperandAt(0, object);
6060 SetOperandAt(1, typecheck != NULL ? typecheck : object);
6061
6062 Representation representation = access.representation();
6063 if (representation.IsSmi()) {
6064 set_type(HType::Smi());
6065 set_representation(representation);
6066 } else if (representation.IsDouble() ||
6067 representation.IsExternal() ||
6068 representation.IsInteger32()) {
6069 set_representation(representation);
6070 } else if (FLAG_track_heap_object_fields &&
6071 representation.IsHeapObject()) {
6072 set_type(HType::NonPrimitive());
6073 set_representation(Representation::Tagged());
6074 } else {
6075 set_representation(Representation::Tagged());
6076 }
6077 access.SetGVNFlags(this, false);
6078 }
6079
5837 virtual bool IsDeletable() const { return true; } 6080 virtual bool IsDeletable() const { return true; }
5838 6081
5839 HObjectAccess access_; 6082 HObjectAccess access_;
5840 }; 6083 };
5841 6084
5842 6085
5843 class HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> { 6086 class HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> {
5844 public: 6087 public:
5845 HLoadNamedFieldPolymorphic(HValue* context, 6088 HLoadNamedFieldPolymorphic(HValue* context,
5846 HValue* object, 6089 HValue* object,
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
5945 6188
5946 enum LoadKeyedHoleMode { 6189 enum LoadKeyedHoleMode {
5947 NEVER_RETURN_HOLE, 6190 NEVER_RETURN_HOLE,
5948 ALLOW_RETURN_HOLE 6191 ALLOW_RETURN_HOLE
5949 }; 6192 };
5950 6193
5951 6194
5952 class HLoadKeyed 6195 class HLoadKeyed
5953 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6196 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
5954 public: 6197 public:
5955 HLoadKeyed(HValue* obj, 6198 DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*,
5956 HValue* key, 6199 ElementsKind);
5957 HValue* dependency, 6200 DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*,
5958 ElementsKind elements_kind, 6201 ElementsKind, LoadKeyedHoleMode);
5959 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE)
5960 : bit_field_(0) {
5961 bit_field_ = ElementsKindField::encode(elements_kind) |
5962 HoleModeField::encode(mode);
5963
5964 SetOperandAt(0, obj);
5965 SetOperandAt(1, key);
5966 SetOperandAt(2, dependency != NULL ? dependency : obj);
5967
5968 if (!is_external()) {
5969 // I can detect the case between storing double (holey and fast) and
5970 // smi/object by looking at elements_kind_.
5971 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) ||
5972 IsFastDoubleElementsKind(elements_kind));
5973
5974 if (IsFastSmiOrObjectElementsKind(elements_kind)) {
5975 if (IsFastSmiElementsKind(elements_kind) &&
5976 (!IsHoleyElementsKind(elements_kind) ||
5977 mode == NEVER_RETURN_HOLE)) {
5978 set_type(HType::Smi());
5979 set_representation(Representation::Smi());
5980 } else {
5981 set_representation(Representation::Tagged());
5982 }
5983
5984 SetGVNFlag(kDependsOnArrayElements);
5985 } else {
5986 set_representation(Representation::Double());
5987 SetGVNFlag(kDependsOnDoubleArrayElements);
5988 }
5989 } else {
5990 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
5991 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
5992 set_representation(Representation::Double());
5993 } else {
5994 set_representation(Representation::Integer32());
5995 }
5996
5997 SetGVNFlag(kDependsOnExternalMemory);
5998 // Native code could change the specialized array.
5999 SetGVNFlag(kDependsOnCalls);
6000 }
6001
6002 SetFlag(kUseGVN);
6003 }
6004 6202
6005 bool is_external() const { 6203 bool is_external() const {
6006 return IsExternalArrayElementsKind(elements_kind()); 6204 return IsExternalArrayElementsKind(elements_kind());
6007 } 6205 }
6008 HValue* elements() { return OperandAt(0); } 6206 HValue* elements() { return OperandAt(0); }
6009 HValue* key() { return OperandAt(1); } 6207 HValue* key() { return OperandAt(1); }
6010 HValue* dependency() { 6208 HValue* dependency() {
6011 ASSERT(HasDependency()); 6209 ASSERT(HasDependency());
6012 return OperandAt(2); 6210 return OperandAt(2);
6013 } 6211 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
6062 virtual bool DataEquals(HValue* other) { 6260 virtual bool DataEquals(HValue* other) {
6063 if (!other->IsLoadKeyed()) return false; 6261 if (!other->IsLoadKeyed()) return false;
6064 HLoadKeyed* other_load = HLoadKeyed::cast(other); 6262 HLoadKeyed* other_load = HLoadKeyed::cast(other);
6065 6263
6066 if (IsDehoisted() && index_offset() != other_load->index_offset()) 6264 if (IsDehoisted() && index_offset() != other_load->index_offset())
6067 return false; 6265 return false;
6068 return elements_kind() == other_load->elements_kind(); 6266 return elements_kind() == other_load->elements_kind();
6069 } 6267 }
6070 6268
6071 private: 6269 private:
6270 HLoadKeyed(HValue* obj,
6271 HValue* key,
6272 HValue* dependency,
6273 ElementsKind elements_kind,
6274 LoadKeyedHoleMode mode = NEVER_RETURN_HOLE)
6275 : bit_field_(0) {
6276 bit_field_ = ElementsKindField::encode(elements_kind) |
6277 HoleModeField::encode(mode);
6278
6279 SetOperandAt(0, obj);
6280 SetOperandAt(1, key);
6281 SetOperandAt(2, dependency != NULL ? dependency : obj);
6282
6283 if (!is_external()) {
6284 // I can detect the case between storing double (holey and fast) and
6285 // smi/object by looking at elements_kind_.
6286 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) ||
6287 IsFastDoubleElementsKind(elements_kind));
6288
6289 if (IsFastSmiOrObjectElementsKind(elements_kind)) {
6290 if (IsFastSmiElementsKind(elements_kind) &&
6291 (!IsHoleyElementsKind(elements_kind) ||
6292 mode == NEVER_RETURN_HOLE)) {
6293 set_type(HType::Smi());
6294 set_representation(Representation::Smi());
6295 } else {
6296 set_representation(Representation::Tagged());
6297 }
6298
6299 SetGVNFlag(kDependsOnArrayElements);
6300 } else {
6301 set_representation(Representation::Double());
6302 SetGVNFlag(kDependsOnDoubleArrayElements);
6303 }
6304 } else {
6305 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
6306 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
6307 set_representation(Representation::Double());
6308 } else {
6309 set_representation(Representation::Integer32());
6310 }
6311
6312 SetGVNFlag(kDependsOnExternalMemory);
6313 // Native code could change the specialized array.
6314 SetGVNFlag(kDependsOnCalls);
6315 }
6316
6317 SetFlag(kUseGVN);
6318 }
6319
6072 virtual bool IsDeletable() const { 6320 virtual bool IsDeletable() const {
6073 return !RequiresHoleCheck(); 6321 return !RequiresHoleCheck();
6074 } 6322 }
6075 6323
6076 // Establish some checks around our packed fields 6324 // Establish some checks around our packed fields
6077 enum LoadKeyedBits { 6325 enum LoadKeyedBits {
6078 kBitsForElementsKind = 5, 6326 kBitsForElementsKind = 5,
6079 kBitsForHoleMode = 1, 6327 kBitsForHoleMode = 1,
6080 kBitsForIndexOffset = 25, 6328 kBitsForIndexOffset = 25,
6081 kBitsForIsDehoisted = 1, 6329 kBitsForIsDehoisted = 1,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
6127 } 6375 }
6128 6376
6129 virtual HValue* Canonicalize(); 6377 virtual HValue* Canonicalize();
6130 6378
6131 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 6379 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
6132 }; 6380 };
6133 6381
6134 6382
6135 class HStoreNamedField: public HTemplateInstruction<2> { 6383 class HStoreNamedField: public HTemplateInstruction<2> {
6136 public: 6384 public:
6137 HStoreNamedField(HValue* obj, 6385 DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
6138 HObjectAccess access, 6386 HObjectAccess, HValue*);
6139 HValue* val)
6140 : access_(access),
6141 transition_(),
6142 transition_unique_id_(),
6143 new_space_dominator_(NULL),
6144 write_barrier_mode_(UPDATE_WRITE_BARRIER) {
6145 SetOperandAt(0, obj);
6146 SetOperandAt(1, val);
6147 access.SetGVNFlags(this, true);
6148 }
6149 6387
6150 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 6388 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
6151 6389
6152 virtual bool HasEscapingOperandAt(int index) { return index == 1; } 6390 virtual bool HasEscapingOperandAt(int index) { return index == 1; }
6153 virtual Representation RequiredInputRepresentation(int index) { 6391 virtual Representation RequiredInputRepresentation(int index) {
6154 if (index == 0 && access().IsExternalMemory()) { 6392 if (index == 0 && access().IsExternalMemory()) {
6155 // object must be external in case of external memory access 6393 // object must be external in case of external memory access
6156 return Representation::External(); 6394 return Representation::External();
6157 } else if (index == 1 && 6395 } else if (index == 1 &&
6158 (field_representation().IsDouble() || 6396 (field_representation().IsDouble() ||
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
6207 6445
6208 virtual void FinalizeUniqueValueId() { 6446 virtual void FinalizeUniqueValueId() {
6209 transition_unique_id_ = UniqueValueId(transition_); 6447 transition_unique_id_ = UniqueValueId(transition_);
6210 } 6448 }
6211 6449
6212 Representation field_representation() const { 6450 Representation field_representation() const {
6213 return access_.representation(); 6451 return access_.representation();
6214 } 6452 }
6215 6453
6216 private: 6454 private:
6455 HStoreNamedField(HValue* obj,
6456 HObjectAccess access,
6457 HValue* val)
6458 : access_(access),
6459 transition_(),
6460 transition_unique_id_(),
6461 new_space_dominator_(NULL),
6462 write_barrier_mode_(UPDATE_WRITE_BARRIER) {
6463 SetOperandAt(0, obj);
6464 SetOperandAt(1, val);
6465 access.SetGVNFlags(this, true);
6466 }
6467
6217 HObjectAccess access_; 6468 HObjectAccess access_;
6218 Handle<Map> transition_; 6469 Handle<Map> transition_;
6219 UniqueValueId transition_unique_id_; 6470 UniqueValueId transition_unique_id_;
6220 HValue* new_space_dominator_; 6471 HValue* new_space_dominator_;
6221 WriteBarrierMode write_barrier_mode_; 6472 WriteBarrierMode write_barrier_mode_;
6222 }; 6473 };
6223 6474
6224 6475
6225 class HStoreNamedGeneric: public HTemplateInstruction<3> { 6476 class HStoreNamedGeneric: public HTemplateInstruction<3> {
6226 public: 6477 public:
(...skipping 26 matching lines...) Expand all
6253 6504
6254 private: 6505 private:
6255 Handle<String> name_; 6506 Handle<String> name_;
6256 StrictModeFlag strict_mode_flag_; 6507 StrictModeFlag strict_mode_flag_;
6257 }; 6508 };
6258 6509
6259 6510
6260 class HStoreKeyed 6511 class HStoreKeyed
6261 : public HTemplateInstruction<3>, public ArrayInstructionInterface { 6512 : public HTemplateInstruction<3>, public ArrayInstructionInterface {
6262 public: 6513 public:
6263 HStoreKeyed(HValue* obj, HValue* key, HValue* val, 6514 DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6264 ElementsKind elements_kind) 6515 ElementsKind);
6265 : elements_kind_(elements_kind),
6266 index_offset_(0),
6267 is_dehoisted_(false),
6268 is_uninitialized_(false),
6269 new_space_dominator_(NULL) {
6270 SetOperandAt(0, obj);
6271 SetOperandAt(1, key);
6272 SetOperandAt(2, val);
6273
6274 if (IsFastObjectElementsKind(elements_kind)) {
6275 SetFlag(kTrackSideEffectDominators);
6276 SetGVNFlag(kDependsOnNewSpacePromotion);
6277 }
6278 if (is_external()) {
6279 SetGVNFlag(kChangesExternalMemory);
6280 SetFlag(kAllowUndefinedAsNaN);
6281 } else if (IsFastDoubleElementsKind(elements_kind)) {
6282 SetGVNFlag(kChangesDoubleArrayElements);
6283 } else if (IsFastSmiElementsKind(elements_kind)) {
6284 SetGVNFlag(kChangesArrayElements);
6285 } else {
6286 SetGVNFlag(kChangesArrayElements);
6287 }
6288
6289 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
6290 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
6291 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
6292 SetFlag(kTruncatingToInt32);
6293 }
6294 }
6295 6516
6296 virtual bool HasEscapingOperandAt(int index) { return index != 0; } 6517 virtual bool HasEscapingOperandAt(int index) { return index != 0; }
6297 virtual Representation RequiredInputRepresentation(int index) { 6518 virtual Representation RequiredInputRepresentation(int index) {
6298 // kind_fast: tagged[int32] = tagged 6519 // kind_fast: tagged[int32] = tagged
6299 // kind_double: tagged[int32] = double 6520 // kind_double: tagged[int32] = double
6300 // kind_smi : tagged[int32] = smi 6521 // kind_smi : tagged[int32] = smi
6301 // kind_external: external[int32] = (double | int32) 6522 // kind_external: external[int32] = (double | int32)
6302 if (index == 0) { 6523 if (index == 0) {
6303 return is_external() ? Representation::External() 6524 return is_external() ? Representation::External()
6304 : Representation::Tagged(); 6525 : Representation::Tagged();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
6381 } 6602 }
6382 } 6603 }
6383 6604
6384 bool NeedsCanonicalization(); 6605 bool NeedsCanonicalization();
6385 6606
6386 virtual void PrintDataTo(StringStream* stream); 6607 virtual void PrintDataTo(StringStream* stream);
6387 6608
6388 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 6609 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
6389 6610
6390 private: 6611 private:
6612 HStoreKeyed(HValue* obj, HValue* key, HValue* val,
6613 ElementsKind elements_kind)
6614 : elements_kind_(elements_kind),
6615 index_offset_(0),
6616 is_dehoisted_(false),
6617 is_uninitialized_(false),
6618 new_space_dominator_(NULL) {
6619 SetOperandAt(0, obj);
6620 SetOperandAt(1, key);
6621 SetOperandAt(2, val);
6622
6623 if (IsFastObjectElementsKind(elements_kind)) {
6624 SetFlag(kTrackSideEffectDominators);
6625 SetGVNFlag(kDependsOnNewSpacePromotion);
6626 }
6627 if (is_external()) {
6628 SetGVNFlag(kChangesExternalMemory);
6629 SetFlag(kAllowUndefinedAsNaN);
6630 } else if (IsFastDoubleElementsKind(elements_kind)) {
6631 SetGVNFlag(kChangesDoubleArrayElements);
6632 } else if (IsFastSmiElementsKind(elements_kind)) {
6633 SetGVNFlag(kChangesArrayElements);
6634 } else {
6635 SetGVNFlag(kChangesArrayElements);
6636 }
6637
6638 // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
6639 if (elements_kind >= EXTERNAL_BYTE_ELEMENTS &&
6640 elements_kind <= EXTERNAL_UNSIGNED_INT_ELEMENTS) {
6641 SetFlag(kTruncatingToInt32);
6642 }
6643 }
6644
6391 ElementsKind elements_kind_; 6645 ElementsKind elements_kind_;
6392 uint32_t index_offset_; 6646 uint32_t index_offset_;
6393 bool is_dehoisted_ : 1; 6647 bool is_dehoisted_ : 1;
6394 bool is_uninitialized_ : 1; 6648 bool is_uninitialized_ : 1;
6395 HValue* new_space_dominator_; 6649 HValue* new_space_dominator_;
6396 }; 6650 };
6397 6651
6398 6652
6399 class HStoreKeyedGeneric: public HTemplateInstruction<4> { 6653 class HStoreKeyedGeneric: public HTemplateInstruction<4> {
6400 public: 6654 public:
(...skipping 25 matching lines...) Expand all
6426 6680
6427 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) 6681 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric)
6428 6682
6429 private: 6683 private:
6430 StrictModeFlag strict_mode_flag_; 6684 StrictModeFlag strict_mode_flag_;
6431 }; 6685 };
6432 6686
6433 6687
6434 class HTransitionElementsKind: public HTemplateInstruction<2> { 6688 class HTransitionElementsKind: public HTemplateInstruction<2> {
6435 public: 6689 public:
6436 HTransitionElementsKind(HValue* context, 6690 inline static HTransitionElementsKind* New(Zone* zone,
6437 HValue* object, 6691 HValue* context,
6438 Handle<Map> original_map, 6692 HValue* object,
6439 Handle<Map> transitioned_map) 6693 Handle<Map> original_map,
6440 : original_map_(original_map), 6694 Handle<Map> transitioned_map) {
6441 transitioned_map_(transitioned_map), 6695 return new(zone) HTransitionElementsKind(context, object,
6442 original_map_unique_id_(), 6696 original_map, transitioned_map);
6443 transitioned_map_unique_id_(),
6444 from_kind_(original_map->elements_kind()),
6445 to_kind_(transitioned_map->elements_kind()) {
6446 SetOperandAt(0, object);
6447 SetOperandAt(1, context);
6448 SetFlag(kUseGVN);
6449 SetGVNFlag(kChangesElementsKind);
6450 if (original_map->has_fast_double_elements()) {
6451 SetGVNFlag(kChangesElementsPointer);
6452 SetGVNFlag(kChangesNewSpacePromotion);
6453 }
6454 if (transitioned_map->has_fast_double_elements()) {
6455 SetGVNFlag(kChangesElementsPointer);
6456 SetGVNFlag(kChangesNewSpacePromotion);
6457 }
6458 set_representation(Representation::Tagged());
6459 } 6697 }
6460 6698
6461 virtual Representation RequiredInputRepresentation(int index) { 6699 virtual Representation RequiredInputRepresentation(int index) {
6462 return Representation::Tagged(); 6700 return Representation::Tagged();
6463 } 6701 }
6464 6702
6465 HValue* object() { return OperandAt(0); } 6703 HValue* object() { return OperandAt(0); }
6466 HValue* context() { return OperandAt(1); } 6704 HValue* context() { return OperandAt(1); }
6467 Handle<Map> original_map() { return original_map_; } 6705 Handle<Map> original_map() { return original_map_; }
6468 Handle<Map> transitioned_map() { return transitioned_map_; } 6706 Handle<Map> transitioned_map() { return transitioned_map_; }
(...skipping 10 matching lines...) Expand all
6479 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) 6717 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind)
6480 6718
6481 protected: 6719 protected:
6482 virtual bool DataEquals(HValue* other) { 6720 virtual bool DataEquals(HValue* other) {
6483 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); 6721 HTransitionElementsKind* instr = HTransitionElementsKind::cast(other);
6484 return original_map_unique_id_ == instr->original_map_unique_id_ && 6722 return original_map_unique_id_ == instr->original_map_unique_id_ &&
6485 transitioned_map_unique_id_ == instr->transitioned_map_unique_id_; 6723 transitioned_map_unique_id_ == instr->transitioned_map_unique_id_;
6486 } 6724 }
6487 6725
6488 private: 6726 private:
6727 HTransitionElementsKind(HValue* context,
6728 HValue* object,
6729 Handle<Map> original_map,
6730 Handle<Map> transitioned_map)
6731 : original_map_(original_map),
6732 transitioned_map_(transitioned_map),
6733 original_map_unique_id_(),
6734 transitioned_map_unique_id_(),
6735 from_kind_(original_map->elements_kind()),
6736 to_kind_(transitioned_map->elements_kind()) {
6737 SetOperandAt(0, object);
6738 SetOperandAt(1, context);
6739 SetFlag(kUseGVN);
6740 SetGVNFlag(kChangesElementsKind);
6741 if (original_map->has_fast_double_elements()) {
6742 SetGVNFlag(kChangesElementsPointer);
6743 SetGVNFlag(kChangesNewSpacePromotion);
6744 }
6745 if (transitioned_map->has_fast_double_elements()) {
6746 SetGVNFlag(kChangesElementsPointer);
6747 SetGVNFlag(kChangesNewSpacePromotion);
6748 }
6749 set_representation(Representation::Tagged());
6750 }
6751
6489 Handle<Map> original_map_; 6752 Handle<Map> original_map_;
6490 Handle<Map> transitioned_map_; 6753 Handle<Map> transitioned_map_;
6491 UniqueValueId original_map_unique_id_; 6754 UniqueValueId original_map_unique_id_;
6492 UniqueValueId transitioned_map_unique_id_; 6755 UniqueValueId transitioned_map_unique_id_;
6493 ElementsKind from_kind_; 6756 ElementsKind from_kind_;
6494 ElementsKind to_kind_; 6757 ElementsKind to_kind_;
6495 }; 6758 };
6496 6759
6497 6760
6498 class HStringAdd: public HBinaryOperation { 6761 class HStringAdd: public HBinaryOperation {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6530 // No side-effects except possible allocation. 6793 // No side-effects except possible allocation.
6531 // NOTE: this instruction _does not_ call ToString() on its inputs. 6794 // NOTE: this instruction _does not_ call ToString() on its inputs.
6532 virtual bool IsDeletable() const { return true; } 6795 virtual bool IsDeletable() const { return true; }
6533 6796
6534 const StringAddFlags flags_; 6797 const StringAddFlags flags_;
6535 }; 6798 };
6536 6799
6537 6800
6538 class HStringCharCodeAt: public HTemplateInstruction<3> { 6801 class HStringCharCodeAt: public HTemplateInstruction<3> {
6539 public: 6802 public:
6540 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { 6803 static HStringCharCodeAt* New(Zone* zone,
6541 SetOperandAt(0, context); 6804 HValue* context,
6542 SetOperandAt(1, string); 6805 HValue* string,
6543 SetOperandAt(2, index); 6806 HValue* index) {
6544 set_representation(Representation::Integer32()); 6807 return new(zone) HStringCharCodeAt(context, string, index);
6545 SetFlag(kUseGVN);
6546 SetGVNFlag(kDependsOnMaps);
6547 SetGVNFlag(kChangesNewSpacePromotion);
6548 } 6808 }
6549 6809
6550 virtual Representation RequiredInputRepresentation(int index) { 6810 virtual Representation RequiredInputRepresentation(int index) {
6551 // The index is supposed to be Integer32. 6811 // The index is supposed to be Integer32.
6552 return index == 2 6812 return index == 2
6553 ? Representation::Integer32() 6813 ? Representation::Integer32()
6554 : Representation::Tagged(); 6814 : Representation::Tagged();
6555 } 6815 }
6556 6816
6557 HValue* context() const { return OperandAt(0); } 6817 HValue* context() const { return OperandAt(0); }
6558 HValue* string() const { return OperandAt(1); } 6818 HValue* string() const { return OperandAt(1); }
6559 HValue* index() const { return OperandAt(2); } 6819 HValue* index() const { return OperandAt(2); }
6560 6820
6561 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) 6821 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
6562 6822
6563 protected: 6823 protected:
6564 virtual bool DataEquals(HValue* other) { return true; } 6824 virtual bool DataEquals(HValue* other) { return true; }
6565 6825
6566 virtual Range* InferRange(Zone* zone) { 6826 virtual Range* InferRange(Zone* zone) {
6567 return new(zone) Range(0, String::kMaxUtf16CodeUnit); 6827 return new(zone) Range(0, String::kMaxUtf16CodeUnit);
6568 } 6828 }
6569 6829
6570 private: 6830 private:
6831 HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
6832 SetOperandAt(0, context);
6833 SetOperandAt(1, string);
6834 SetOperandAt(2, index);
6835 set_representation(Representation::Integer32());
6836 SetFlag(kUseGVN);
6837 SetGVNFlag(kDependsOnMaps);
6838 SetGVNFlag(kChangesNewSpacePromotion);
6839 }
6840
6571 // No side effects: runtime function assumes string + number inputs. 6841 // No side effects: runtime function assumes string + number inputs.
6572 virtual bool IsDeletable() const { return true; } 6842 virtual bool IsDeletable() const { return true; }
6573 }; 6843 };
6574 6844
6575 6845
6576 class HStringCharFromCode: public HTemplateInstruction<2> { 6846 class HStringCharFromCode: public HTemplateInstruction<2> {
6577 public: 6847 public:
6578 static HInstruction* New(Zone* zone, 6848 static HInstruction* New(Zone* zone,
6579 HValue* context, 6849 HValue* context,
6580 HValue* char_code); 6850 HValue* char_code);
(...skipping 22 matching lines...) Expand all
6603 } 6873 }
6604 6874
6605 virtual bool IsDeletable() const { 6875 virtual bool IsDeletable() const {
6606 return !value()->ToNumberCanBeObserved(); 6876 return !value()->ToNumberCanBeObserved();
6607 } 6877 }
6608 }; 6878 };
6609 6879
6610 6880
6611 class HStringLength: public HUnaryOperation { 6881 class HStringLength: public HUnaryOperation {
6612 public: 6882 public:
6613 static HInstruction* New(Zone* zone, HValue* string); 6883 static HInstruction* New(Zone* zone, HValue* context, HValue* string);
6614 6884
6615 virtual Representation RequiredInputRepresentation(int index) { 6885 virtual Representation RequiredInputRepresentation(int index) {
6616 return Representation::Tagged(); 6886 return Representation::Tagged();
6617 } 6887 }
6618 6888
6619 virtual HType CalculateInferredType() { 6889 virtual HType CalculateInferredType() {
6620 STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); 6890 STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
6621 return HType::Smi(); 6891 return HType::Smi();
6622 } 6892 }
6623 6893
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
6764 7034
6765 DECLARE_CONCRETE_INSTRUCTION(Typeof) 7035 DECLARE_CONCRETE_INSTRUCTION(Typeof)
6766 7036
6767 private: 7037 private:
6768 virtual bool IsDeletable() const { return true; } 7038 virtual bool IsDeletable() const { return true; }
6769 }; 7039 };
6770 7040
6771 7041
6772 class HTrapAllocationMemento : public HTemplateInstruction<1> { 7042 class HTrapAllocationMemento : public HTemplateInstruction<1> {
6773 public: 7043 public:
6774 explicit HTrapAllocationMemento(HValue* obj) { 7044 DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*);
6775 SetOperandAt(0, obj);
6776 }
6777 7045
6778 virtual Representation RequiredInputRepresentation(int index) { 7046 virtual Representation RequiredInputRepresentation(int index) {
6779 return Representation::Tagged(); 7047 return Representation::Tagged();
6780 } 7048 }
6781 7049
6782 HValue* object() { return OperandAt(0); } 7050 HValue* object() { return OperandAt(0); }
6783 7051
6784 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento) 7052 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento)
7053
7054 private:
7055 explicit HTrapAllocationMemento(HValue* obj) {
7056 SetOperandAt(0, obj);
7057 }
6785 }; 7058 };
6786 7059
6787 7060
6788 class HToFastProperties: public HUnaryOperation { 7061 class HToFastProperties: public HUnaryOperation {
6789 public: 7062 public:
7063 DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*);
7064
7065 virtual Representation RequiredInputRepresentation(int index) {
7066 return Representation::Tagged();
7067 }
7068
7069 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
7070
7071 private:
6790 explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { 7072 explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
6791 // This instruction is not marked as having side effects, but 7073 // This instruction is not marked as having side effects, but
6792 // changes the map of the input operand. Use it only when creating 7074 // changes the map of the input operand. Use it only when creating
6793 // object literals via a runtime call. 7075 // object literals via a runtime call.
6794 ASSERT(value->IsCallRuntime()); 7076 ASSERT(value->IsCallRuntime());
6795 #ifdef DEBUG 7077 #ifdef DEBUG
6796 const Runtime::Function* function = HCallRuntime::cast(value)->function(); 7078 const Runtime::Function* function = HCallRuntime::cast(value)->function();
6797 ASSERT(function->function_id == Runtime::kCreateObjectLiteral || 7079 ASSERT(function->function_id == Runtime::kCreateObjectLiteral ||
6798 function->function_id == Runtime::kCreateObjectLiteralShallow); 7080 function->function_id == Runtime::kCreateObjectLiteralShallow);
6799 #endif 7081 #endif
6800 set_representation(Representation::Tagged()); 7082 set_representation(Representation::Tagged());
6801 } 7083 }
6802 7084
6803 virtual Representation RequiredInputRepresentation(int index) {
6804 return Representation::Tagged();
6805 }
6806
6807 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
6808
6809 private:
6810 virtual bool IsDeletable() const { return true; } 7085 virtual bool IsDeletable() const { return true; }
6811 }; 7086 };
6812 7087
6813 7088
6814 class HValueOf: public HUnaryOperation { 7089 class HValueOf: public HUnaryOperation {
6815 public: 7090 public:
6816 explicit HValueOf(HValue* value) : HUnaryOperation(value) { 7091 explicit HValueOf(HValue* value) : HUnaryOperation(value) {
6817 set_representation(Representation::Tagged()); 7092 set_representation(Representation::Tagged());
6818 } 7093 }
6819 7094
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
6872 7147
6873 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar) 7148 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar)
6874 7149
6875 private: 7150 private:
6876 String::Encoding encoding_; 7151 String::Encoding encoding_;
6877 }; 7152 };
6878 7153
6879 7154
6880 class HCheckMapValue: public HTemplateInstruction<2> { 7155 class HCheckMapValue: public HTemplateInstruction<2> {
6881 public: 7156 public:
6882 HCheckMapValue(HValue* value, 7157 DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*);
6883 HValue* map) {
6884 SetOperandAt(0, value);
6885 SetOperandAt(1, map);
6886 set_representation(Representation::Tagged());
6887 SetFlag(kUseGVN);
6888 SetGVNFlag(kDependsOnMaps);
6889 SetGVNFlag(kDependsOnElementsKind);
6890 }
6891 7158
6892 virtual Representation RequiredInputRepresentation(int index) { 7159 virtual Representation RequiredInputRepresentation(int index) {
6893 return Representation::Tagged(); 7160 return Representation::Tagged();
6894 } 7161 }
6895 7162
6896 virtual void PrintDataTo(StringStream* stream); 7163 virtual void PrintDataTo(StringStream* stream);
6897 7164
6898 virtual HType CalculateInferredType() { 7165 virtual HType CalculateInferredType() {
6899 return HType::Tagged(); 7166 return HType::Tagged();
6900 } 7167 }
6901 7168
6902 HValue* value() { return OperandAt(0); } 7169 HValue* value() { return OperandAt(0); }
6903 HValue* map() { return OperandAt(1); } 7170 HValue* map() { return OperandAt(1); }
6904 7171
6905 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) 7172 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue)
6906 7173
6907 protected: 7174 protected:
6908 virtual bool DataEquals(HValue* other) { 7175 virtual bool DataEquals(HValue* other) {
6909 return true; 7176 return true;
6910 } 7177 }
7178
7179 private:
7180 HCheckMapValue(HValue* value,
7181 HValue* map) {
7182 SetOperandAt(0, value);
7183 SetOperandAt(1, map);
7184 set_representation(Representation::Tagged());
7185 SetFlag(kUseGVN);
7186 SetGVNFlag(kDependsOnMaps);
7187 SetGVNFlag(kDependsOnElementsKind);
7188 }
6911 }; 7189 };
6912 7190
6913 7191
6914 class HForInPrepareMap : public HTemplateInstruction<2> { 7192 class HForInPrepareMap : public HTemplateInstruction<2> {
6915 public: 7193 public:
6916 HForInPrepareMap(HValue* context, 7194 static HForInPrepareMap* New(Zone* zone,
6917 HValue* object) { 7195 HValue* context,
6918 SetOperandAt(0, context); 7196 HValue* object) {
6919 SetOperandAt(1, object); 7197 return new(zone) HForInPrepareMap(context, object);
6920 set_representation(Representation::Tagged());
6921 SetAllSideEffects();
6922 } 7198 }
6923 7199
6924 virtual Representation RequiredInputRepresentation(int index) { 7200 virtual Representation RequiredInputRepresentation(int index) {
6925 return Representation::Tagged(); 7201 return Representation::Tagged();
6926 } 7202 }
6927 7203
6928 HValue* context() { return OperandAt(0); } 7204 HValue* context() { return OperandAt(0); }
6929 HValue* enumerable() { return OperandAt(1); } 7205 HValue* enumerable() { return OperandAt(1); }
6930 7206
6931 virtual void PrintDataTo(StringStream* stream); 7207 virtual void PrintDataTo(StringStream* stream);
6932 7208
6933 virtual HType CalculateInferredType() { 7209 virtual HType CalculateInferredType() {
6934 return HType::Tagged(); 7210 return HType::Tagged();
6935 } 7211 }
6936 7212
6937 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); 7213 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap);
7214
7215 private:
7216 HForInPrepareMap(HValue* context,
7217 HValue* object) {
7218 SetOperandAt(0, context);
7219 SetOperandAt(1, object);
7220 set_representation(Representation::Tagged());
7221 SetAllSideEffects();
7222 }
6938 }; 7223 };
6939 7224
6940 7225
6941 class HForInCacheArray : public HTemplateInstruction<2> { 7226 class HForInCacheArray : public HTemplateInstruction<2> {
6942 public: 7227 public:
6943 HForInCacheArray(HValue* enumerable, 7228 DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int);
6944 HValue* keys,
6945 int idx) : idx_(idx) {
6946 SetOperandAt(0, enumerable);
6947 SetOperandAt(1, keys);
6948 set_representation(Representation::Tagged());
6949 }
6950 7229
6951 virtual Representation RequiredInputRepresentation(int index) { 7230 virtual Representation RequiredInputRepresentation(int index) {
6952 return Representation::Tagged(); 7231 return Representation::Tagged();
6953 } 7232 }
6954 7233
6955 HValue* enumerable() { return OperandAt(0); } 7234 HValue* enumerable() { return OperandAt(0); }
6956 HValue* map() { return OperandAt(1); } 7235 HValue* map() { return OperandAt(1); }
6957 int idx() { return idx_; } 7236 int idx() { return idx_; }
6958 7237
6959 HForInCacheArray* index_cache() { 7238 HForInCacheArray* index_cache() {
6960 return index_cache_; 7239 return index_cache_;
6961 } 7240 }
6962 7241
6963 void set_index_cache(HForInCacheArray* index_cache) { 7242 void set_index_cache(HForInCacheArray* index_cache) {
6964 index_cache_ = index_cache; 7243 index_cache_ = index_cache;
6965 } 7244 }
6966 7245
6967 virtual void PrintDataTo(StringStream* stream); 7246 virtual void PrintDataTo(StringStream* stream);
6968 7247
6969 virtual HType CalculateInferredType() { 7248 virtual HType CalculateInferredType() {
6970 return HType::Tagged(); 7249 return HType::Tagged();
6971 } 7250 }
6972 7251
6973 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); 7252 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray);
6974 7253
6975 private: 7254 private:
7255 HForInCacheArray(HValue* enumerable,
7256 HValue* keys,
7257 int idx) : idx_(idx) {
7258 SetOperandAt(0, enumerable);
7259 SetOperandAt(1, keys);
7260 set_representation(Representation::Tagged());
7261 }
7262
6976 int idx_; 7263 int idx_;
6977 HForInCacheArray* index_cache_; 7264 HForInCacheArray* index_cache_;
6978 }; 7265 };
6979 7266
6980 7267
6981 class HLoadFieldByIndex : public HTemplateInstruction<2> { 7268 class HLoadFieldByIndex : public HTemplateInstruction<2> {
6982 public: 7269 public:
6983 HLoadFieldByIndex(HValue* object, 7270 HLoadFieldByIndex(HValue* object,
6984 HValue* index) { 7271 HValue* index) {
6985 SetOperandAt(0, object); 7272 SetOperandAt(0, object);
(...skipping 20 matching lines...) Expand all
7006 virtual bool IsDeletable() const { return true; } 7293 virtual bool IsDeletable() const { return true; }
7007 }; 7294 };
7008 7295
7009 7296
7010 #undef DECLARE_INSTRUCTION 7297 #undef DECLARE_INSTRUCTION
7011 #undef DECLARE_CONCRETE_INSTRUCTION 7298 #undef DECLARE_CONCRETE_INSTRUCTION
7012 7299
7013 } } // namespace v8::internal 7300 } } // namespace v8::internal
7014 7301
7015 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7302 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698