OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/typer.h" | 5 #include "src/compiler/typer.h" |
6 | 6 |
7 #include "src/base/flags.h" | 7 #include "src/base/flags.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
10 #include "src/compiler/common-operator.h" | 10 #include "src/compiler/common-operator.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 JS_SIMPLE_BINOP_LIST(DECLARE_CASE) | 90 JS_SIMPLE_BINOP_LIST(DECLARE_CASE) |
91 #undef DECLARE_CASE | 91 #undef DECLARE_CASE |
92 | 92 |
93 #define DECLARE_CASE(x) \ | 93 #define DECLARE_CASE(x) \ |
94 case IrOpcode::k##x: \ | 94 case IrOpcode::k##x: \ |
95 return UpdateType(node, Type##x(node)); | 95 return UpdateType(node, Type##x(node)); |
96 DECLARE_CASE(Start) | 96 DECLARE_CASE(Start) |
97 DECLARE_CASE(IfException) | 97 DECLARE_CASE(IfException) |
98 // VALUE_OP_LIST without JS_SIMPLE_BINOP_LIST: | 98 // VALUE_OP_LIST without JS_SIMPLE_BINOP_LIST: |
99 COMMON_OP_LIST(DECLARE_CASE) | 99 COMMON_OP_LIST(DECLARE_CASE) |
100 SIMPLIFIED_OP_LIST(DECLARE_CASE) | 100 SIMPLIFIED_COMPARE_BINOP_LIST(DECLARE_CASE) |
| 101 SIMPLIFIED_OTHER_OP_LIST(DECLARE_CASE) |
101 MACHINE_OP_LIST(DECLARE_CASE) | 102 MACHINE_OP_LIST(DECLARE_CASE) |
102 MACHINE_SIMD_OP_LIST(DECLARE_CASE) | 103 MACHINE_SIMD_OP_LIST(DECLARE_CASE) |
103 JS_SIMPLE_UNOP_LIST(DECLARE_CASE) | 104 JS_SIMPLE_UNOP_LIST(DECLARE_CASE) |
104 JS_OBJECT_OP_LIST(DECLARE_CASE) | 105 JS_OBJECT_OP_LIST(DECLARE_CASE) |
105 JS_CONTEXT_OP_LIST(DECLARE_CASE) | 106 JS_CONTEXT_OP_LIST(DECLARE_CASE) |
106 JS_OTHER_OP_LIST(DECLARE_CASE) | 107 JS_OTHER_OP_LIST(DECLARE_CASE) |
107 #undef DECLARE_CASE | 108 #undef DECLARE_CASE |
108 | 109 |
109 #define DECLARE_CASE(x) case IrOpcode::k##x: | 110 #define DECLARE_CASE(x) case IrOpcode::k##x: |
110 DECLARE_CASE(Loop) | 111 DECLARE_CASE(Loop) |
111 DECLARE_CASE(Branch) | 112 DECLARE_CASE(Branch) |
112 DECLARE_CASE(IfTrue) | 113 DECLARE_CASE(IfTrue) |
113 DECLARE_CASE(IfFalse) | 114 DECLARE_CASE(IfFalse) |
114 DECLARE_CASE(IfSuccess) | 115 DECLARE_CASE(IfSuccess) |
115 DECLARE_CASE(Switch) | 116 DECLARE_CASE(Switch) |
116 DECLARE_CASE(IfValue) | 117 DECLARE_CASE(IfValue) |
117 DECLARE_CASE(IfDefault) | 118 DECLARE_CASE(IfDefault) |
118 DECLARE_CASE(Merge) | 119 DECLARE_CASE(Merge) |
119 DECLARE_CASE(Deoptimize) | 120 DECLARE_CASE(Deoptimize) |
120 DECLARE_CASE(DeoptimizeIf) | 121 DECLARE_CASE(DeoptimizeIf) |
121 DECLARE_CASE(DeoptimizeUnless) | 122 DECLARE_CASE(DeoptimizeUnless) |
122 DECLARE_CASE(Return) | 123 DECLARE_CASE(Return) |
123 DECLARE_CASE(TailCall) | 124 DECLARE_CASE(TailCall) |
124 DECLARE_CASE(Terminate) | 125 DECLARE_CASE(Terminate) |
125 DECLARE_CASE(OsrNormalEntry) | 126 DECLARE_CASE(OsrNormalEntry) |
126 DECLARE_CASE(OsrLoopEntry) | 127 DECLARE_CASE(OsrLoopEntry) |
127 DECLARE_CASE(Throw) | 128 DECLARE_CASE(Throw) |
128 DECLARE_CASE(End) | 129 DECLARE_CASE(End) |
| 130 SIMPLIFIED_CHANGE_OP_LIST(DECLARE_CASE) |
| 131 SIMPLIFIED_CHECKED_OP_LIST(DECLARE_CASE) |
129 #undef DECLARE_CASE | 132 #undef DECLARE_CASE |
130 break; | 133 break; |
131 } | 134 } |
132 return NoChange(); | 135 return NoChange(); |
133 } | 136 } |
134 | 137 |
135 Type* TypeNode(Node* node) { | 138 Type* TypeNode(Node* node) { |
136 switch (node->opcode()) { | 139 switch (node->opcode()) { |
137 #define DECLARE_CASE(x) \ | 140 #define DECLARE_CASE(x) \ |
138 case IrOpcode::k##x: return TypeBinaryOp(node, x##Typer); | 141 case IrOpcode::k##x: return TypeBinaryOp(node, x##Typer); |
139 JS_SIMPLE_BINOP_LIST(DECLARE_CASE) | 142 JS_SIMPLE_BINOP_LIST(DECLARE_CASE) |
140 #undef DECLARE_CASE | 143 #undef DECLARE_CASE |
141 | 144 |
142 #define DECLARE_CASE(x) case IrOpcode::k##x: return Type##x(node); | 145 #define DECLARE_CASE(x) case IrOpcode::k##x: return Type##x(node); |
143 DECLARE_CASE(Start) | 146 DECLARE_CASE(Start) |
144 DECLARE_CASE(IfException) | 147 DECLARE_CASE(IfException) |
145 // VALUE_OP_LIST without JS_SIMPLE_BINOP_LIST: | 148 // VALUE_OP_LIST without JS_SIMPLE_BINOP_LIST: |
146 COMMON_OP_LIST(DECLARE_CASE) | 149 COMMON_OP_LIST(DECLARE_CASE) |
147 SIMPLIFIED_OP_LIST(DECLARE_CASE) | 150 SIMPLIFIED_COMPARE_BINOP_LIST(DECLARE_CASE) |
| 151 SIMPLIFIED_OTHER_OP_LIST(DECLARE_CASE) |
148 MACHINE_OP_LIST(DECLARE_CASE) | 152 MACHINE_OP_LIST(DECLARE_CASE) |
149 MACHINE_SIMD_OP_LIST(DECLARE_CASE) | 153 MACHINE_SIMD_OP_LIST(DECLARE_CASE) |
150 JS_SIMPLE_UNOP_LIST(DECLARE_CASE) | 154 JS_SIMPLE_UNOP_LIST(DECLARE_CASE) |
151 JS_OBJECT_OP_LIST(DECLARE_CASE) | 155 JS_OBJECT_OP_LIST(DECLARE_CASE) |
152 JS_CONTEXT_OP_LIST(DECLARE_CASE) | 156 JS_CONTEXT_OP_LIST(DECLARE_CASE) |
153 JS_OTHER_OP_LIST(DECLARE_CASE) | 157 JS_OTHER_OP_LIST(DECLARE_CASE) |
154 #undef DECLARE_CASE | 158 #undef DECLARE_CASE |
155 | 159 |
156 #define DECLARE_CASE(x) case IrOpcode::k##x: | 160 #define DECLARE_CASE(x) case IrOpcode::k##x: |
157 DECLARE_CASE(Loop) | 161 DECLARE_CASE(Loop) |
158 DECLARE_CASE(Branch) | 162 DECLARE_CASE(Branch) |
159 DECLARE_CASE(IfTrue) | 163 DECLARE_CASE(IfTrue) |
160 DECLARE_CASE(IfFalse) | 164 DECLARE_CASE(IfFalse) |
161 DECLARE_CASE(IfSuccess) | 165 DECLARE_CASE(IfSuccess) |
162 DECLARE_CASE(Switch) | 166 DECLARE_CASE(Switch) |
163 DECLARE_CASE(IfValue) | 167 DECLARE_CASE(IfValue) |
164 DECLARE_CASE(IfDefault) | 168 DECLARE_CASE(IfDefault) |
165 DECLARE_CASE(Merge) | 169 DECLARE_CASE(Merge) |
166 DECLARE_CASE(Deoptimize) | 170 DECLARE_CASE(Deoptimize) |
167 DECLARE_CASE(DeoptimizeIf) | 171 DECLARE_CASE(DeoptimizeIf) |
168 DECLARE_CASE(DeoptimizeUnless) | 172 DECLARE_CASE(DeoptimizeUnless) |
169 DECLARE_CASE(Return) | 173 DECLARE_CASE(Return) |
170 DECLARE_CASE(TailCall) | 174 DECLARE_CASE(TailCall) |
171 DECLARE_CASE(Terminate) | 175 DECLARE_CASE(Terminate) |
172 DECLARE_CASE(OsrNormalEntry) | 176 DECLARE_CASE(OsrNormalEntry) |
173 DECLARE_CASE(OsrLoopEntry) | 177 DECLARE_CASE(OsrLoopEntry) |
174 DECLARE_CASE(Throw) | 178 DECLARE_CASE(Throw) |
175 DECLARE_CASE(End) | 179 DECLARE_CASE(End) |
| 180 SIMPLIFIED_CHANGE_OP_LIST(DECLARE_CASE) |
| 181 SIMPLIFIED_CHECKED_OP_LIST(DECLARE_CASE) |
176 #undef DECLARE_CASE | 182 #undef DECLARE_CASE |
177 break; | 183 break; |
178 } | 184 } |
179 UNREACHABLE(); | 185 UNREACHABLE(); |
180 return nullptr; | 186 return nullptr; |
181 } | 187 } |
182 | 188 |
183 Type* TypeConstant(Handle<Object> value); | 189 Type* TypeConstant(Handle<Object> value); |
184 | 190 |
185 private: | 191 private: |
186 Typer* typer_; | 192 Typer* typer_; |
187 ZoneSet<NodeId> weakened_nodes_; | 193 ZoneSet<NodeId> weakened_nodes_; |
188 | 194 |
189 #define DECLARE_METHOD(x) inline Type* Type##x(Node* node); | 195 #define DECLARE_METHOD(x) inline Type* Type##x(Node* node); |
190 DECLARE_METHOD(Start) | 196 DECLARE_METHOD(Start) |
191 DECLARE_METHOD(IfException) | 197 DECLARE_METHOD(IfException) |
192 VALUE_OP_LIST(DECLARE_METHOD) | 198 COMMON_OP_LIST(DECLARE_METHOD) |
| 199 SIMPLIFIED_COMPARE_BINOP_LIST(DECLARE_METHOD) |
| 200 SIMPLIFIED_OTHER_OP_LIST(DECLARE_METHOD) |
| 201 MACHINE_OP_LIST(DECLARE_METHOD) |
| 202 MACHINE_SIMD_OP_LIST(DECLARE_METHOD) |
| 203 JS_OP_LIST(DECLARE_METHOD) |
193 #undef DECLARE_METHOD | 204 #undef DECLARE_METHOD |
194 | 205 |
195 Type* TypeOrNone(Node* node) { | 206 Type* TypeOrNone(Node* node) { |
196 return NodeProperties::IsTyped(node) ? NodeProperties::GetType(node) | 207 return NodeProperties::IsTyped(node) ? NodeProperties::GetType(node) |
197 : Type::None(); | 208 : Type::None(); |
198 } | 209 } |
199 | 210 |
200 Type* Operand(Node* node, int i) { | 211 Type* Operand(Node* node, int i) { |
201 Node* operand_node = NodeProperties::GetValueInput(node, i); | 212 Node* operand_node = NodeProperties::GetValueInput(node, i); |
202 return TypeOrNone(operand_node); | 213 return TypeOrNone(operand_node); |
(...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 } | 1729 } |
1719 | 1730 |
1720 Type* Typer::Visitor::TypeStringFromCharCode(Node* node) { | 1731 Type* Typer::Visitor::TypeStringFromCharCode(Node* node) { |
1721 return TypeUnaryOp(node, StringFromCharCodeTyper); | 1732 return TypeUnaryOp(node, StringFromCharCodeTyper); |
1722 } | 1733 } |
1723 | 1734 |
1724 Type* Typer::Visitor::TypeStringToNumber(Node* node) { | 1735 Type* Typer::Visitor::TypeStringToNumber(Node* node) { |
1725 return TypeUnaryOp(node, ToNumber); | 1736 return TypeUnaryOp(node, ToNumber); |
1726 } | 1737 } |
1727 | 1738 |
1728 namespace { | |
1729 | |
1730 Type* ChangeRepresentation(Type* type, Type* rep, Zone* zone) { | |
1731 return Type::Union(Type::Semantic(type, zone), | |
1732 Type::Representation(rep, zone), zone); | |
1733 } | |
1734 | |
1735 } // namespace | |
1736 | |
1737 Type* Typer::Visitor::TypeChangeTaggedSignedToInt32(Node* node) { | |
1738 Type* arg = Operand(node, 0); | |
1739 // TODO(jarin): DCHECK(arg->Is(Type::Signed32())); | |
1740 // Many tests fail this check. | |
1741 return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone()); | |
1742 } | |
1743 | |
1744 Type* Typer::Visitor::TypeChangeTaggedToInt32(Node* node) { | |
1745 Type* arg = Operand(node, 0); | |
1746 DCHECK(arg->Is(Type::Signed32())); | |
1747 return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone()); | |
1748 } | |
1749 | |
1750 | |
1751 Type* Typer::Visitor::TypeChangeTaggedToUint32(Node* node) { | |
1752 Type* arg = Operand(node, 0); | |
1753 DCHECK(arg->Is(Type::Unsigned32())); | |
1754 return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone()); | |
1755 } | |
1756 | |
1757 | |
1758 Type* Typer::Visitor::TypeChangeTaggedToFloat64(Node* node) { | |
1759 Type* arg = Operand(node, 0); | |
1760 DCHECK(arg->Is(Type::Number())); | |
1761 return ChangeRepresentation(arg, Type::UntaggedFloat64(), zone()); | |
1762 } | |
1763 | |
1764 Type* Typer::Visitor::TypeTruncateTaggedToFloat64(Node* node) { | |
1765 Type* arg = Operand(node, 0); | |
1766 // TODO(jarin) This DCHECK does not work because of speculative feedback. | |
1767 // Re-enable once we record the speculative feedback in types. | |
1768 // DCHECK(arg->Is(Type::NumberOrOddball())); | |
1769 return ChangeRepresentation(arg, Type::UntaggedFloat64(), zone()); | |
1770 } | |
1771 | |
1772 Type* Typer::Visitor::TypeChangeInt31ToTaggedSigned(Node* node) { | |
1773 Type* arg = Operand(node, 0); | |
1774 // TODO(jarin): DCHECK(arg->Is(Type::Signed31())); | |
1775 // Some mjsunit/asm and mjsunit/wasm tests fail this check. | |
1776 // For instance, asm/int32-umod fails with Signed32/UntaggedIntegral32 in | |
1777 // simplified-lowering (after propagation). | |
1778 Type* rep = | |
1779 arg->Is(Type::SignedSmall()) ? Type::TaggedSigned() : Type::Tagged(); | |
1780 return ChangeRepresentation(arg, rep, zone()); | |
1781 } | |
1782 | |
1783 Type* Typer::Visitor::TypeChangeInt32ToTagged(Node* node) { | |
1784 Type* arg = Operand(node, 0); | |
1785 // TODO(jarin): DCHECK(arg->Is(Type::Signed32())); | |
1786 // Two tests fail this check: mjsunit/asm/sqlite3/sqlite-safe-heap and | |
1787 // mjsunit/wasm/embenchen/lua_binarytrees. The first one fails with Any/Any in | |
1788 // simplified-lowering (after propagation). | |
1789 Type* rep = | |
1790 arg->Is(Type::SignedSmall()) ? Type::TaggedSigned() : Type::Tagged(); | |
1791 return ChangeRepresentation(arg, rep, zone()); | |
1792 } | |
1793 | |
1794 Type* Typer::Visitor::TypeChangeUint32ToTagged(Node* node) { | |
1795 Type* arg = Operand(node, 0); | |
1796 // TODO(jarin): DCHECK(arg->Is(Type::Unsigned32())); | |
1797 // This fails in benchmarks/octane/mandreel (--turbo). | |
1798 return ChangeRepresentation(arg, Type::Tagged(), zone()); | |
1799 } | |
1800 | |
1801 Type* Typer::Visitor::TypeChangeFloat64ToTagged(Node* node) { | |
1802 Type* arg = Operand(node, 0); | |
1803 // TODO(jarin): DCHECK(arg->Is(Type::Number())); | |
1804 // Some (or all) mjsunit/wasm/embenchen/ tests fail this check when run with | |
1805 // --turbo and --always-opt. | |
1806 return ChangeRepresentation(arg, Type::Tagged(), zone()); | |
1807 } | |
1808 | |
1809 Type* Typer::Visitor::TypeChangeTaggedToBit(Node* node) { | |
1810 Type* arg = Operand(node, 0); | |
1811 DCHECK(arg->Is(Type::Boolean())); | |
1812 return ChangeRepresentation(arg, Type::UntaggedBit(), zone()); | |
1813 } | |
1814 | |
1815 Type* Typer::Visitor::TypeChangeBitToTagged(Node* node) { | |
1816 Type* arg = Operand(node, 0); | |
1817 return ChangeRepresentation(arg, Type::TaggedPointer(), zone()); | |
1818 } | |
1819 | |
1820 Type* Typer::Visitor::TypeCheckBounds(Node* node) { | 1739 Type* Typer::Visitor::TypeCheckBounds(Node* node) { |
1821 // TODO(bmeurer): We could do better here based on the limit. | 1740 // TODO(bmeurer): We could do better here based on the limit. |
1822 return Type::Unsigned31(); | 1741 return Type::Unsigned31(); |
1823 } | 1742 } |
1824 | 1743 |
1825 Type* Typer::Visitor::TypeCheckNumber(Node* node) { | 1744 Type* Typer::Visitor::TypeCheckNumber(Node* node) { |
1826 Type* arg = Operand(node, 0); | 1745 Type* arg = Operand(node, 0); |
1827 return Type::Intersect(arg, Type::Number(), zone()); | 1746 return Type::Intersect(arg, Type::Number(), zone()); |
1828 } | 1747 } |
1829 | 1748 |
1830 Type* Typer::Visitor::TypeCheckTaggedPointer(Node* node) { | 1749 Type* Typer::Visitor::TypeCheckTaggedPointer(Node* node) { |
1831 Type* arg = Operand(node, 0); | 1750 Type* arg = Operand(node, 0); |
1832 return Type::Intersect(arg, Type::TaggedPointer(), zone()); | 1751 return Type::Intersect(arg, Type::TaggedPointer(), zone()); |
1833 } | 1752 } |
1834 | 1753 |
1835 Type* Typer::Visitor::TypeCheckTaggedSigned(Node* node) { | 1754 Type* Typer::Visitor::TypeCheckTaggedSigned(Node* node) { |
1836 Type* arg = Operand(node, 0); | 1755 Type* arg = Operand(node, 0); |
1837 return Type::Intersect(arg, typer_->cache_.kSmi, zone()); | 1756 return Type::Intersect(arg, typer_->cache_.kSmi, zone()); |
1838 } | 1757 } |
1839 | 1758 |
1840 Type* Typer::Visitor::TypeCheckedInt32Add(Node* node) { | |
1841 return Type::Integral32(); | |
1842 } | |
1843 | |
1844 Type* Typer::Visitor::TypeCheckedInt32Sub(Node* node) { | |
1845 return Type::Integral32(); | |
1846 } | |
1847 | |
1848 Type* Typer::Visitor::TypeCheckedUint32ToInt32(Node* node) { | |
1849 return Type::Signed32(); | |
1850 } | |
1851 | |
1852 Type* Typer::Visitor::TypeCheckedFloat64ToInt32(Node* node) { | |
1853 return Type::Signed32(); | |
1854 } | |
1855 | |
1856 Type* Typer::Visitor::TypeCheckedTaggedToInt32(Node* node) { | |
1857 return Type::Signed32(); | |
1858 } | |
1859 | |
1860 Type* Typer::Visitor::TypeCheckedTaggedToFloat64(Node* node) { | |
1861 return Type::Number(); | |
1862 } | |
1863 | |
1864 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) { | 1759 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) { |
1865 Type* type = Operand(node, 0); | 1760 Type* type = Operand(node, 0); |
1866 return type; | 1761 return type; |
1867 } | 1762 } |
1868 | 1763 |
1869 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) { | 1764 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) { |
1870 CheckTaggedHoleMode mode = CheckTaggedHoleModeOf(node->op()); | 1765 CheckTaggedHoleMode mode = CheckTaggedHoleModeOf(node->op()); |
1871 Type* type = Operand(node, 0); | 1766 Type* type = Operand(node, 0); |
1872 type = Type::Intersect(type, Type::NonInternal(), zone()); | 1767 type = Type::Intersect(type, Type::NonInternal(), zone()); |
1873 switch (mode) { | 1768 switch (mode) { |
1874 case CheckTaggedHoleMode::kConvertHoleToUndefined: { | 1769 case CheckTaggedHoleMode::kConvertHoleToUndefined: { |
1875 // The hole is turned into undefined. | 1770 // The hole is turned into undefined. |
1876 type = Type::Union(type, Type::Undefined(), zone()); | 1771 type = Type::Union(type, Type::Undefined(), zone()); |
1877 break; | 1772 break; |
1878 } | 1773 } |
1879 case CheckTaggedHoleMode::kNeverReturnHole: { | 1774 case CheckTaggedHoleMode::kNeverReturnHole: { |
1880 // We deoptimize in case of the hole. | 1775 // We deoptimize in case of the hole. |
1881 break; | 1776 break; |
1882 } | 1777 } |
1883 } | 1778 } |
1884 return type; | 1779 return type; |
1885 } | 1780 } |
1886 | 1781 |
1887 Type* Typer::Visitor::TypeTruncateTaggedToWord32(Node* node) { | |
1888 Type* arg = Operand(node, 0); | |
1889 // TODO(jarin): DCHECK(arg->Is(Type::NumberOrUndefined())); | |
1890 // Several mjsunit and cctest tests fail this check. For instance, | |
1891 // mjsunit/compiler/regress-607493 fails with Any/Any in simplified-lowering | |
1892 // (after propagation). | |
1893 return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone()); | |
1894 } | |
1895 | |
1896 Type* Typer::Visitor::TypeAllocate(Node* node) { return Type::TaggedPointer(); } | 1782 Type* Typer::Visitor::TypeAllocate(Node* node) { return Type::TaggedPointer(); } |
1897 | 1783 |
1898 | 1784 |
1899 namespace { | 1785 namespace { |
1900 | 1786 |
1901 MaybeHandle<Map> GetStableMapFromObjectType(Type* object_type) { | 1787 MaybeHandle<Map> GetStableMapFromObjectType(Type* object_type) { |
1902 if (object_type->IsConstant() && | 1788 if (object_type->IsConstant() && |
1903 object_type->AsConstant()->Value()->IsHeapObject()) { | 1789 object_type->AsConstant()->Value()->IsHeapObject()) { |
1904 Handle<Map> object_map( | 1790 Handle<Map> object_map( |
1905 Handle<HeapObject>::cast(object_type->AsConstant()->Value())->map()); | 1791 Handle<HeapObject>::cast(object_type->AsConstant()->Value())->map()); |
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2618 } | 2504 } |
2619 if (Type::IsInteger(*value)) { | 2505 if (Type::IsInteger(*value)) { |
2620 return Type::Range(value->Number(), value->Number(), zone()); | 2506 return Type::Range(value->Number(), value->Number(), zone()); |
2621 } | 2507 } |
2622 return Type::Constant(value, zone()); | 2508 return Type::Constant(value, zone()); |
2623 } | 2509 } |
2624 | 2510 |
2625 } // namespace compiler | 2511 } // namespace compiler |
2626 } // namespace internal | 2512 } // namespace internal |
2627 } // namespace v8 | 2513 } // namespace v8 |
OLD | NEW |