| 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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 static Type* ToName(Type*, Typer*); | 241 static Type* ToName(Type*, Typer*); |
| 242 static Type* ToNumber(Type*, Typer*); | 242 static Type* ToNumber(Type*, Typer*); |
| 243 static Type* ToObject(Type*, Typer*); | 243 static Type* ToObject(Type*, Typer*); |
| 244 static Type* ToString(Type*, Typer*); | 244 static Type* ToString(Type*, Typer*); |
| 245 static Type* NumberCeil(Type*, Typer*); | 245 static Type* NumberCeil(Type*, Typer*); |
| 246 static Type* NumberFloor(Type*, Typer*); | 246 static Type* NumberFloor(Type*, Typer*); |
| 247 static Type* NumberRound(Type*, Typer*); | 247 static Type* NumberRound(Type*, Typer*); |
| 248 static Type* NumberTrunc(Type*, Typer*); | 248 static Type* NumberTrunc(Type*, Typer*); |
| 249 static Type* NumberToInt32(Type*, Typer*); | 249 static Type* NumberToInt32(Type*, Typer*); |
| 250 static Type* NumberToUint32(Type*, Typer*); | 250 static Type* NumberToUint32(Type*, Typer*); |
| 251 static Type* NumberConvertHoleNaN(Type*, Typer*); | |
| 252 | 251 |
| 253 static Type* ObjectIsCallable(Type*, Typer*); | 252 static Type* ObjectIsCallable(Type*, Typer*); |
| 254 static Type* ObjectIsNumber(Type*, Typer*); | 253 static Type* ObjectIsNumber(Type*, Typer*); |
| 255 static Type* ObjectIsReceiver(Type*, Typer*); | 254 static Type* ObjectIsReceiver(Type*, Typer*); |
| 256 static Type* ObjectIsSmi(Type*, Typer*); | 255 static Type* ObjectIsSmi(Type*, Typer*); |
| 257 static Type* ObjectIsString(Type*, Typer*); | 256 static Type* ObjectIsString(Type*, Typer*); |
| 258 static Type* ObjectIsUndetectable(Type*, Typer*); | 257 static Type* ObjectIsUndetectable(Type*, Typer*); |
| 259 | 258 |
| 260 static Type* JSAddRanger(RangeType*, RangeType*, Typer*); | 259 static Type* JSAddRanger(RangeType*, RangeType*, Typer*); |
| 261 static Type* JSSubtractRanger(RangeType*, RangeType*, Typer*); | 260 static Type* JSSubtractRanger(RangeType*, RangeType*, Typer*); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 if (type->Is(Type::Unsigned32())) return type; | 549 if (type->Is(Type::Unsigned32())) return type; |
| 551 if (type->Is(t->cache_.kZeroish)) return t->cache_.kSingletonZero; | 550 if (type->Is(t->cache_.kZeroish)) return t->cache_.kSingletonZero; |
| 552 if (type->Is(t->unsigned32ish_)) { | 551 if (type->Is(t->unsigned32ish_)) { |
| 553 return Type::Intersect( | 552 return Type::Intersect( |
| 554 Type::Union(type, t->cache_.kSingletonZero, t->zone()), | 553 Type::Union(type, t->cache_.kSingletonZero, t->zone()), |
| 555 Type::Unsigned32(), t->zone()); | 554 Type::Unsigned32(), t->zone()); |
| 556 } | 555 } |
| 557 return Type::Unsigned32(); | 556 return Type::Unsigned32(); |
| 558 } | 557 } |
| 559 | 558 |
| 560 Type* Typer::Visitor::NumberConvertHoleNaN(Type* type, Typer* t) { | |
| 561 return Type::Union(type, Type::Undefined(), t->zone()); | |
| 562 } | |
| 563 | |
| 564 // Type checks. | 559 // Type checks. |
| 565 | 560 |
| 566 Type* Typer::Visitor::ObjectIsCallable(Type* type, Typer* t) { | 561 Type* Typer::Visitor::ObjectIsCallable(Type* type, Typer* t) { |
| 567 if (type->Is(Type::Function())) return t->singleton_true_; | 562 if (type->Is(Type::Function())) return t->singleton_true_; |
| 568 if (type->Is(Type::Primitive())) return t->singleton_false_; | 563 if (type->Is(Type::Primitive())) return t->singleton_false_; |
| 569 return Type::Boolean(); | 564 return Type::Boolean(); |
| 570 } | 565 } |
| 571 | 566 |
| 572 Type* Typer::Visitor::ObjectIsNumber(Type* type, Typer* t) { | 567 Type* Typer::Visitor::ObjectIsNumber(Type* type, Typer* t) { |
| 573 if (type->Is(Type::Number())) return t->singleton_true_; | 568 if (type->Is(Type::Number())) return t->singleton_true_; |
| (...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1811 Type* Typer::Visitor::TypeNumberToInt32(Node* node) { | 1806 Type* Typer::Visitor::TypeNumberToInt32(Node* node) { |
| 1812 return TypeUnaryOp(node, NumberToInt32); | 1807 return TypeUnaryOp(node, NumberToInt32); |
| 1813 } | 1808 } |
| 1814 | 1809 |
| 1815 | 1810 |
| 1816 Type* Typer::Visitor::TypeNumberToUint32(Node* node) { | 1811 Type* Typer::Visitor::TypeNumberToUint32(Node* node) { |
| 1817 return TypeUnaryOp(node, NumberToUint32); | 1812 return TypeUnaryOp(node, NumberToUint32); |
| 1818 } | 1813 } |
| 1819 | 1814 |
| 1820 | 1815 |
| 1821 Type* Typer::Visitor::TypeNumberIsHoleNaN(Node* node) { | |
| 1822 return Type::Boolean(); | |
| 1823 } | |
| 1824 | |
| 1825 Type* Typer::Visitor::TypeNumberConvertHoleNaN(Node* node) { | |
| 1826 return TypeUnaryOp(node, NumberConvertHoleNaN); | |
| 1827 } | |
| 1828 | |
| 1829 // static | 1816 // static |
| 1830 Type* Typer::Visitor::ReferenceEqualTyper(Type* lhs, Type* rhs, Typer* t) { | 1817 Type* Typer::Visitor::ReferenceEqualTyper(Type* lhs, Type* rhs, Typer* t) { |
| 1831 if (lhs->IsConstant() && rhs->Is(lhs)) { | 1818 if (lhs->IsConstant() && rhs->Is(lhs)) { |
| 1832 return t->singleton_true_; | 1819 return t->singleton_true_; |
| 1833 } | 1820 } |
| 1834 return Type::Boolean(); | 1821 return Type::Boolean(); |
| 1835 } | 1822 } |
| 1836 | 1823 |
| 1837 | 1824 |
| 1838 Type* Typer::Visitor::TypeReferenceEqual(Node* node) { | 1825 Type* Typer::Visitor::TypeReferenceEqual(Node* node) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1967 } | 1954 } |
| 1968 | 1955 |
| 1969 Type* Typer::Visitor::TypeCheckedTaggedToInt32(Node* node) { | 1956 Type* Typer::Visitor::TypeCheckedTaggedToInt32(Node* node) { |
| 1970 return Type::Signed32(); | 1957 return Type::Signed32(); |
| 1971 } | 1958 } |
| 1972 | 1959 |
| 1973 Type* Typer::Visitor::TypeCheckedTaggedToFloat64(Node* node) { | 1960 Type* Typer::Visitor::TypeCheckedTaggedToFloat64(Node* node) { |
| 1974 return Type::Number(); | 1961 return Type::Number(); |
| 1975 } | 1962 } |
| 1976 | 1963 |
| 1964 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) { |
| 1965 Type* type = Operand(node, 0); |
| 1966 return type; |
| 1967 } |
| 1968 |
| 1969 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) { |
| 1970 CheckTaggedHoleMode mode = CheckTaggedHoleModeOf(node->op()); |
| 1971 Type* type = Operand(node, 0); |
| 1972 type = Type::Intersect(type, Type::NonInternal(), zone()); |
| 1973 switch (mode) { |
| 1974 case CheckTaggedHoleMode::kConvertHoleToUndefined: { |
| 1975 // The hole is turned into undefined. |
| 1976 type = Type::Union(type, Type::Undefined(), zone()); |
| 1977 break; |
| 1978 } |
| 1979 case CheckTaggedHoleMode::kNeverReturnHole: { |
| 1980 // We deoptimize in case of the hole. |
| 1981 break; |
| 1982 } |
| 1983 } |
| 1984 return type; |
| 1985 } |
| 1986 |
| 1977 Type* Typer::Visitor::TypeCheckIf(Node* node) { | 1987 Type* Typer::Visitor::TypeCheckIf(Node* node) { |
| 1978 UNREACHABLE(); | 1988 UNREACHABLE(); |
| 1979 return nullptr; | 1989 return nullptr; |
| 1980 } | 1990 } |
| 1981 | 1991 |
| 1982 Type* Typer::Visitor::TypeTruncateTaggedToWord32(Node* node) { | 1992 Type* Typer::Visitor::TypeTruncateTaggedToWord32(Node* node) { |
| 1983 Type* arg = Operand(node, 0); | 1993 Type* arg = Operand(node, 0); |
| 1984 // TODO(jarin): DCHECK(arg->Is(Type::NumberOrUndefined())); | 1994 // TODO(jarin): DCHECK(arg->Is(Type::NumberOrUndefined())); |
| 1985 // Several mjsunit and cctest tests fail this check. For instance, | 1995 // Several mjsunit and cctest tests fail this check. For instance, |
| 1986 // mjsunit/compiler/regress-607493 fails with Any/Any in simplified-lowering | 1996 // mjsunit/compiler/regress-607493 fails with Any/Any in simplified-lowering |
| (...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2694 } | 2704 } |
| 2695 if (Type::IsInteger(*value)) { | 2705 if (Type::IsInteger(*value)) { |
| 2696 return Type::Range(value->Number(), value->Number(), zone()); | 2706 return Type::Range(value->Number(), value->Number(), zone()); |
| 2697 } | 2707 } |
| 2698 return Type::Constant(value, zone()); | 2708 return Type::Constant(value, zone()); |
| 2699 } | 2709 } |
| 2700 | 2710 |
| 2701 } // namespace compiler | 2711 } // namespace compiler |
| 2702 } // namespace internal | 2712 } // namespace internal |
| 2703 } // namespace v8 | 2713 } // namespace v8 |
| OLD | NEW |