| Index: src/compiler/js-native-context-specialization.cc
|
| diff --git a/src/compiler/js-native-context-specialization.cc b/src/compiler/js-native-context-specialization.cc
|
| index 4c818cf185ec5e6ddd3e514650dc5b3ed4f73e1b..1bebb4cce128df7b1de57fbc715b114568dfd9e1 100644
|
| --- a/src/compiler/js-native-context-specialization.cc
|
| +++ b/src/compiler/js-native-context-specialization.cc
|
| @@ -13,6 +13,7 @@
|
| #include "src/field-index-inl.h"
|
| #include "src/lookup.h"
|
| #include "src/objects-inl.h" // TODO(mstarzinger): Temporary cycle breaker!
|
| +#include "src/type-cache.h"
|
| #include "src/type-feedback-vector.h"
|
|
|
| namespace v8 {
|
| @@ -36,7 +37,8 @@ JSNativeContextSpecialization::JSNativeContextSpecialization(
|
| global_object_(global_object),
|
| native_context_(global_object->native_context(), isolate()),
|
| dependencies_(dependencies),
|
| - zone_(zone) {}
|
| + zone_(zone),
|
| + type_cache_(TypeCache::Get()) {}
|
|
|
|
|
| Reduction JSNativeContextSpecialization::Reduce(Node* node) {
|
| @@ -114,11 +116,9 @@ Reduction JSNativeContextSpecialization::ReduceJSLoadGlobal(Node* node) {
|
| if (property_details.cell_type() == PropertyCellType::kConstantType) {
|
| // Compute proper type based on the current value in the cell.
|
| if (property_cell_value->IsSmi()) {
|
| - property_cell_value_type = Type::Intersect(
|
| - Type::SignedSmall(), Type::TaggedSigned(), graph()->zone());
|
| + property_cell_value_type = type_cache_.kSmi;
|
| } else if (property_cell_value->IsNumber()) {
|
| - property_cell_value_type = Type::Intersect(
|
| - Type::Number(), Type::TaggedPointer(), graph()->zone());
|
| + property_cell_value_type = type_cache_.kHeapNumber;
|
| } else {
|
| Handle<Map> property_cell_value_map(
|
| Handle<HeapObject>::cast(property_cell_value)->map(), isolate());
|
| @@ -331,9 +331,7 @@ bool JSNativeContextSpecialization::ComputePropertyAccessInfo(
|
| DCHECK(Name::Equals(factory()->length_string(), name));
|
| // The String::length property is always a smi in the range
|
| // [0, String::kMaxLength].
|
| - field_type = Type::Intersect(
|
| - Type::Range(0.0, String::kMaxLength, graph()->zone()),
|
| - Type::TaggedSigned(), graph()->zone());
|
| + field_type = type_cache_.kStringLengthType;
|
| } else if (map->IsJSArrayMap()) {
|
| DCHECK(Name::Equals(factory()->length_string(), name));
|
| // The JSArray::length property is a smi in the range
|
| @@ -341,17 +339,13 @@ bool JSNativeContextSpecialization::ComputePropertyAccessInfo(
|
| // elements, a smi in the range [0, FixedArray::kMaxLength]
|
| // in case of other fast elements, and [0, kMaxUInt32] in
|
| // case of other arrays.
|
| - Type* field_type_rep = Type::Tagged();
|
| - double field_type_upper = kMaxUInt32;
|
| - if (IsFastElementsKind(map->elements_kind())) {
|
| - field_type_rep = Type::TaggedSigned();
|
| - field_type_upper = IsFastDoubleElementsKind(map->elements_kind())
|
| - ? FixedDoubleArray::kMaxLength
|
| - : FixedArray::kMaxLength;
|
| + if (IsFastDoubleElementsKind(map->elements_kind())) {
|
| + field_type = type_cache_.kFixedDoubleArrayLengthType;
|
| + } else if (IsFastElementsKind(map->elements_kind())) {
|
| + field_type = type_cache_.kFixedArrayLengthType;
|
| + } else {
|
| + field_type = type_cache_.kJSArrayLengthType;
|
| }
|
| - field_type =
|
| - Type::Intersect(Type::Range(0.0, field_type_upper, graph()->zone()),
|
| - field_type_rep, graph()->zone());
|
| }
|
| *access_info = PropertyAccessInfo::DataField(receiver_type, field_index,
|
| field_type, holder);
|
| @@ -382,15 +376,13 @@ bool JSNativeContextSpecialization::ComputePropertyAccessInfo(
|
| *map, index, field_representation.IsDouble());
|
| Type* field_type = Type::Tagged();
|
| if (field_representation.IsSmi()) {
|
| - field_type = Type::Intersect(Type::SignedSmall(),
|
| - Type::TaggedSigned(), graph()->zone());
|
| + field_type = type_cache_.kSmi;
|
| } else if (field_representation.IsDouble()) {
|
| if (access_mode == kStore) {
|
| // TODO(bmeurer): Add support for storing to double fields.
|
| break;
|
| }
|
| - field_type = Type::Intersect(Type::Number(), Type::UntaggedFloat64(),
|
| - graph()->zone());
|
| + field_type = type_cache_.kFloat64;
|
| } else if (field_representation.IsHeapObject()) {
|
| // Extract the field type from the property details (make sure its
|
| // representation is TaggedPointer to reflect the heap object case).
|
|
|