OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/operation-typer.h" | 5 #include "src/compiler/operation-typer.h" |
6 | 6 |
7 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
8 #include "src/factory.h" | 8 #include "src/factory.h" |
9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
10 #include "src/type-cache.h" | 10 #include "src/type-cache.h" |
11 #include "src/types.h" | 11 #include "src/types.h" |
12 | 12 |
13 #include "src/objects-inl.h" | 13 #include "src/objects-inl.h" |
14 | 14 |
15 namespace v8 { | 15 namespace v8 { |
16 namespace internal { | 16 namespace internal { |
17 namespace compiler { | 17 namespace compiler { |
18 | 18 |
19 OperationTyper::OperationTyper(Isolate* isolate, Zone* zone) | 19 OperationTyper::OperationTyper(Isolate* isolate, Zone* zone) |
20 : zone_(zone), cache_(TypeCache::Get()) { | 20 : isolate_(isolate), zone_(zone), cache_(TypeCache::Get()) { |
21 Factory* factory = isolate->factory(); | 21 Factory* factory = isolate->factory(); |
22 infinity_ = Type::Constant(factory->infinity_value(), zone); | 22 infinity_ = Type::Constant(factory->infinity_value(), zone); |
23 minus_infinity_ = Type::Constant(factory->minus_infinity_value(), zone); | 23 minus_infinity_ = Type::Constant(factory->minus_infinity_value(), zone); |
24 // Unfortunately, the infinities created in other places might be different | 24 // Unfortunately, the infinities created in other places might be different |
25 // ones (eg the result of NewNumber in TypeNumberConstant). | 25 // ones (eg the result of NewNumber in TypeNumberConstant). |
26 Type* truncating_to_zero = | 26 Type* truncating_to_zero = |
27 Type::Union(Type::Union(infinity_, minus_infinity_, zone), | 27 Type::Union(Type::Union(infinity_, minus_infinity_, zone), |
28 Type::MinusZeroOrNaN(), zone); | 28 Type::MinusZeroOrNaN(), zone); |
29 DCHECK(!truncating_to_zero->Maybe(Type::Integral32())); | 29 DCHECK(!truncating_to_zero->Maybe(Type::Integral32())); |
30 | 30 |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 | 477 |
478 if (type->Is(Type::Unsigned32())) return type; | 478 if (type->Is(Type::Unsigned32())) return type; |
479 if (type->Is(cache_.kZeroish)) return cache_.kSingletonZero; | 479 if (type->Is(cache_.kZeroish)) return cache_.kSingletonZero; |
480 if (type->Is(unsigned32ish_)) { | 480 if (type->Is(unsigned32ish_)) { |
481 return Type::Intersect(Type::Union(type, cache_.kSingletonZero, zone()), | 481 return Type::Intersect(Type::Union(type, cache_.kSingletonZero, zone()), |
482 Type::Unsigned32(), zone()); | 482 Type::Unsigned32(), zone()); |
483 } | 483 } |
484 return Type::Unsigned32(); | 484 return Type::Unsigned32(); |
485 } | 485 } |
486 | 486 |
| 487 Type* OperationTyper::NumberToString(Type* lhs, Type* rhs) { |
| 488 DCHECK(lhs->Is(Type::Number())); |
| 489 DCHECK(rhs->Is(Type::Unsigned30())); |
| 490 if (!lhs->IsInhabited()) return Type::None(); |
| 491 if (lhs->Is(Type::NaN())) { |
| 492 return Type::Constant(factory()->nan_string(), zone()); |
| 493 } |
| 494 if (lhs->Is(cache_.kZeroish)) { |
| 495 return Type::Constant(factory()->zero_string(), zone()); |
| 496 } |
| 497 if (lhs->Is(infinity_)) { |
| 498 return Type::Constant(factory()->infinity_string(), zone()); |
| 499 } |
| 500 if (lhs->Is(minus_infinity_)) { |
| 501 return Type::Constant(factory()->minus_infinity_string(), zone()); |
| 502 } |
| 503 return Type::String(); |
| 504 } |
| 505 |
487 Type* OperationTyper::NumberSilenceNaN(Type* type) { | 506 Type* OperationTyper::NumberSilenceNaN(Type* type) { |
488 DCHECK(type->Is(Type::Number())); | 507 DCHECK(type->Is(Type::Number())); |
489 // TODO(jarin): This is a terrible hack; we definitely need a dedicated type | 508 // TODO(jarin): This is a terrible hack; we definitely need a dedicated type |
490 // for the hole (tagged and/or double). Otherwise if the input is the hole | 509 // for the hole (tagged and/or double). Otherwise if the input is the hole |
491 // NaN constant, we'd just eliminate this node in JSTypedLowering. | 510 // NaN constant, we'd just eliminate this node in JSTypedLowering. |
492 if (type->Maybe(Type::NaN())) return Type::Number(); | 511 if (type->Maybe(Type::NaN())) return Type::Number(); |
493 return type; | 512 return type; |
494 } | 513 } |
495 | 514 |
496 Type* OperationTyper::NumberAdd(Type* lhs, Type* rhs) { | 515 Type* OperationTyper::NumberAdd(Type* lhs, Type* rhs) { |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 } | 975 } |
957 // Type should be non empty, so we know it should be true. | 976 // Type should be non empty, so we know it should be true. |
958 DCHECK((outcome & kComparisonTrue) != 0); | 977 DCHECK((outcome & kComparisonTrue) != 0); |
959 return singleton_true(); | 978 return singleton_true(); |
960 } | 979 } |
961 | 980 |
962 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { | 981 Type* OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type* input) { |
963 return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); | 982 return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone()); |
964 } | 983 } |
965 | 984 |
| 985 Factory* OperationTyper::factory() const { return isolate()->factory(); } |
| 986 |
966 } // namespace compiler | 987 } // namespace compiler |
967 } // namespace internal | 988 } // namespace internal |
968 } // namespace v8 | 989 } // namespace v8 |
OLD | NEW |