Index: src/compiler/access-info.cc |
diff --git a/src/compiler/access-info.cc b/src/compiler/access-info.cc |
index 1172bfbc835960b166098bfeccd1479bf21e0e2c..262aa3cb06388f116a06495f9e6e9067b8c6996f 100644 |
--- a/src/compiler/access-info.cc |
+++ b/src/compiler/access-info.cc |
@@ -79,10 +79,11 @@ PropertyAccessInfo PropertyAccessInfo::DataConstant( |
// static |
PropertyAccessInfo PropertyAccessInfo::DataField( |
- MapList const& receiver_maps, FieldIndex field_index, Type* field_type, |
+ MapList const& receiver_maps, FieldIndex field_index, |
+ MachineRepresentation field_representation, Type* field_type, |
MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map) { |
- return PropertyAccessInfo(holder, transition_map, field_index, field_type, |
- receiver_maps); |
+ return PropertyAccessInfo(holder, transition_map, field_index, |
+ field_representation, field_type, receiver_maps); |
} |
// static |
@@ -93,13 +94,16 @@ PropertyAccessInfo PropertyAccessInfo::AccessorConstant( |
} |
PropertyAccessInfo::PropertyAccessInfo() |
- : kind_(kInvalid), field_type_(Type::None()) {} |
+ : kind_(kInvalid), |
+ field_representation_(MachineRepresentation::kNone), |
+ field_type_(Type::None()) {} |
PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder, |
MapList const& receiver_maps) |
: kind_(kNotFound), |
receiver_maps_(receiver_maps), |
holder_(holder), |
+ field_representation_(MachineRepresentation::kNone), |
field_type_(Type::None()) {} |
PropertyAccessInfo::PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, |
@@ -109,17 +113,19 @@ PropertyAccessInfo::PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, |
receiver_maps_(receiver_maps), |
constant_(constant), |
holder_(holder), |
+ field_representation_(MachineRepresentation::kNone), |
field_type_(Type::Any()) {} |
-PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder, |
- MaybeHandle<Map> transition_map, |
- FieldIndex field_index, Type* field_type, |
- MapList const& receiver_maps) |
+PropertyAccessInfo::PropertyAccessInfo( |
+ MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map, |
+ FieldIndex field_index, MachineRepresentation field_representation, |
+ Type* field_type, MapList const& receiver_maps) |
: kind_(kDataField), |
receiver_maps_(receiver_maps), |
transition_map_(transition_map), |
holder_(holder), |
field_index_(field_index), |
+ field_representation_(field_representation), |
field_type_(field_type) {} |
bool PropertyAccessInfo::Merge(PropertyAccessInfo const* that) { |
@@ -138,7 +144,8 @@ bool PropertyAccessInfo::Merge(PropertyAccessInfo const* that) { |
if (this->transition_map_.address() == that->transition_map_.address() && |
this->field_index_ == that->field_index_ && |
this->field_type_->Is(that->field_type_) && |
- that->field_type_->Is(this->field_type_)) { |
+ that->field_type_->Is(this->field_type_) && |
+ this->field_representation_ == that->field_representation_) { |
this->receiver_maps_.insert(this->receiver_maps_.end(), |
that->receiver_maps_.begin(), |
that->receiver_maps_.end()); |
@@ -283,20 +290,23 @@ bool AccessInfoFactory::ComputePropertyAccessInfo( |
} |
case DATA: { |
int index = descriptors->GetFieldIndex(number); |
- Representation field_representation = details.representation(); |
+ Representation details_representation = details.representation(); |
FieldIndex field_index = FieldIndex::ForPropertyIndex( |
- *map, index, field_representation.IsDouble()); |
+ *map, index, details_representation.IsDouble()); |
Type* field_type = Type::Tagged(); |
- if (field_representation.IsSmi()) { |
+ MachineRepresentation field_representation = |
+ MachineRepresentation::kTagged; |
+ if (details_representation.IsSmi()) { |
field_type = type_cache_.kSmi; |
- } else if (field_representation.IsDouble()) { |
+ field_representation = MachineRepresentation::kTaggedSigned; |
+ } else if (details_representation.IsDouble()) { |
field_type = type_cache_.kFloat64; |
- } else if (field_representation.IsHeapObject()) { |
+ field_representation = MachineRepresentation::kFloat64; |
+ } else if (details_representation.IsHeapObject()) { |
// Extract the field type from the property details (make sure its |
// representation is TaggedPointer to reflect the heap object case). |
- field_type = Type::Intersect( |
- descriptors->GetFieldType(number)->Convert(zone()), |
- Type::TaggedPointer(), zone()); |
+ field_representation = MachineRepresentation::kTaggedPointer; |
+ field_type = descriptors->GetFieldType(number)->Convert(zone()); |
if (field_type->Is(Type::None())) { |
// Store is not safe if the field type was cleared. |
if (access_mode == AccessMode::kStore) return false; |
@@ -305,17 +315,18 @@ bool AccessInfoFactory::ComputePropertyAccessInfo( |
// about the contents now. |
// TODO(bmeurer): It would be awesome to make this saner in the |
// runtime/GC interaction. |
- field_type = Type::TaggedPointer(); |
+ field_type = Type::Any(); |
} else if (!Type::Any()->Is(field_type)) { |
// Add proper code dependencies in case of stable field map(s). |
+ field_representation = MachineRepresentation::kTaggedPointer; |
Handle<Map> field_owner_map(map->FindFieldOwner(number), |
isolate()); |
dependencies()->AssumeFieldType(field_owner_map); |
} |
- DCHECK(field_type->Is(Type::TaggedPointer())); |
} |
*access_info = PropertyAccessInfo::DataField( |
- MapList{receiver_map}, field_index, field_type, holder); |
+ MapList{receiver_map}, field_index, field_representation, |
+ field_type, holder); |
return true; |
} |
case ACCESSOR_CONSTANT: { |
@@ -422,11 +433,13 @@ bool AccessInfoFactory::LookupSpecialFieldAccessor( |
if (Accessors::IsJSObjectFieldAccessor(map, name, &offset)) { |
FieldIndex field_index = FieldIndex::ForInObjectOffset(offset); |
Type* field_type = Type::Tagged(); |
+ MachineRepresentation field_representation = MachineRepresentation::kTagged; |
if (map->IsStringMap()) { |
DCHECK(Name::Equals(factory()->length_string(), name)); |
// The String::length property is always a smi in the range |
// [0, String::kMaxLength]. |
field_type = type_cache_.kStringLengthType; |
+ field_representation = MachineRepresentation::kTaggedSigned; |
} else if (map->IsJSArrayMap()) { |
DCHECK(Name::Equals(factory()->length_string(), name)); |
// The JSArray::length property is a smi in the range |
@@ -436,14 +449,16 @@ bool AccessInfoFactory::LookupSpecialFieldAccessor( |
// case of other arrays. |
if (IsFastDoubleElementsKind(map->elements_kind())) { |
field_type = type_cache_.kFixedDoubleArrayLengthType; |
+ field_representation = MachineRepresentation::kTaggedSigned; |
} else if (IsFastElementsKind(map->elements_kind())) { |
field_type = type_cache_.kFixedArrayLengthType; |
+ field_representation = MachineRepresentation::kTaggedSigned; |
} else { |
field_type = type_cache_.kJSArrayLengthType; |
} |
} |
- *access_info = |
- PropertyAccessInfo::DataField(MapList{map}, field_index, field_type); |
+ *access_info = PropertyAccessInfo::DataField( |
+ MapList{map}, field_index, field_representation, field_type); |
return true; |
} |
return false; |
@@ -466,21 +481,24 @@ bool AccessInfoFactory::LookupTransition(Handle<Map> map, Handle<Name> name, |
// TODO(bmeurer): Handle transition to data constant? |
if (details.type() != DATA) return false; |
int const index = details.field_index(); |
- Representation field_representation = details.representation(); |
+ Representation details_representation = details.representation(); |
FieldIndex field_index = FieldIndex::ForPropertyIndex( |
- *transition_map, index, field_representation.IsDouble()); |
+ *transition_map, index, details_representation.IsDouble()); |
Type* field_type = Type::Tagged(); |
- if (field_representation.IsSmi()) { |
+ MachineRepresentation field_representation = MachineRepresentation::kTagged; |
+ if (details_representation.IsSmi()) { |
field_type = type_cache_.kSmi; |
- } else if (field_representation.IsDouble()) { |
+ field_representation = MachineRepresentation::kTaggedSigned; |
+ } else if (details_representation.IsDouble()) { |
field_type = type_cache_.kFloat64; |
- } else if (field_representation.IsHeapObject()) { |
+ field_representation = MachineRepresentation::kFloat64; |
+ } else if (details_representation.IsHeapObject()) { |
// Extract the field type from the property details (make sure its |
// representation is TaggedPointer to reflect the heap object case). |
- field_type = Type::Intersect( |
+ field_representation = MachineRepresentation::kTaggedPointer; |
+ field_type = |
transition_map->instance_descriptors()->GetFieldType(number)->Convert( |
- zone()), |
- Type::TaggedPointer(), zone()); |
+ zone()); |
if (field_type->Is(Type::None())) { |
// Store is not safe if the field type was cleared. |
return false; |
@@ -490,11 +508,11 @@ bool AccessInfoFactory::LookupTransition(Handle<Map> map, Handle<Name> name, |
isolate()); |
dependencies()->AssumeFieldType(field_owner_map); |
} |
- DCHECK(field_type->Is(Type::TaggedPointer())); |
} |
dependencies()->AssumeMapNotDeprecated(transition_map); |
*access_info = PropertyAccessInfo::DataField( |
- MapList{map}, field_index, field_type, holder, transition_map); |
+ MapList{map}, field_index, field_representation, field_type, holder, |
+ transition_map); |
return true; |
} |
return false; |