[turbofan] Serialize IsUnboxedDoubleField.
I'm also changing the function signature to take the descriptor_index
instead of the FieldIndex, because this lets me reuse the vector of
property descriptors as storage.
Bug: v8:7790
Change-Id: Ie9dadcba2204b6825e5791f9c630fc8b1079a930
Reviewed-on: https://chromium-review.googlesource.com/1227873
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Maya Lekova <mslekova@chromium.org>
Cr-Commit-Position: refs/heads/master@{#55981}
diff --git a/src/compiler/js-create-lowering.cc b/src/compiler/js-create-lowering.cc
index fa47532..4e0d748 100644
--- a/src/compiler/js-create-lowering.cc
+++ b/src/compiler/js-create-lowering.cc
@@ -1667,7 +1667,7 @@
MaybeHandle<Map>(), Type::Any(), MachineType::AnyTagged(),
kFullWriteBarrier};
Node* value;
- if (boilerplate.map().IsUnboxedDoubleField(index)) {
+ if (boilerplate_map.IsUnboxedDoubleField(i)) {
access.machine_type = MachineType::Float64();
access.type = Type::Number();
value = jsgraph()->Constant(boilerplate.RawFastDoublePropertyAt(index));
diff --git a/src/compiler/js-heap-broker.cc b/src/compiler/js-heap-broker.cc
index a20851b..baddcc0 100644
--- a/src/compiler/js-heap-broker.cc
+++ b/src/compiler/js-heap-broker.cc
@@ -494,6 +494,7 @@
FieldIndex field_index;
MapData* field_owner = nullptr;
ObjectData* field_type = nullptr;
+ bool is_unboxed_double_field = false;
};
class MapData : public HeapObjectData {
@@ -1078,6 +1079,8 @@
d.field_owner =
broker()->GetOrCreateData(map->FindFieldOwner(isolate, i))->AsMap();
d.field_type = broker()->GetOrCreateData(descriptors->GetFieldType(i));
+ d.is_unboxed_double_field = map->IsUnboxedDoubleField(d.field_index);
+ // Recurse.
d.field_owner->SerializeDescriptors();
}
descriptors_.push_back(d);
@@ -1567,7 +1570,6 @@
return object<JSObject>()->RawFastDoublePropertyAt(index);
}
JSObjectData* object_data = data()->AsJSObject();
- CHECK(map().IsUnboxedDoubleField(index));
CHECK(index.is_inobject());
return object_data->GetInobjectField(index.property_index()).AsDouble();
}
@@ -1581,7 +1583,6 @@
broker()->isolate()));
}
JSObjectData* object_data = data()->AsJSObject();
- CHECK(!map().IsUnboxedDoubleField(index));
CHECK(index.is_inobject());
return ObjectRef(
object_data->GetInobjectField(index.property_index()).AsObject());
@@ -1688,9 +1689,17 @@
data()->AsMap()->descriptors().at(descriptor_index).field_type);
}
-bool MapRef::IsUnboxedDoubleField(FieldIndex index) const {
- AllowHandleDereference allow_handle_dereference;
- return object<Map>()->IsUnboxedDoubleField(index);
+bool MapRef::IsUnboxedDoubleField(int descriptor_index) const {
+ if (broker()->mode() == JSHeapBroker::kDisabled) {
+ AllowHandleDereference allow_handle_dereference;
+ return object<Map>()->IsUnboxedDoubleField(
+ FieldIndex::ForDescriptor(*object<Map>(), descriptor_index));
+ }
+ return data()
+ ->AsMap()
+ ->descriptors()
+ .at(descriptor_index)
+ .is_unboxed_double_field;
}
uint16_t StringRef::GetFirstChar() {
diff --git a/src/compiler/js-heap-broker.h b/src/compiler/js-heap-broker.h
index 190b0a2..cfd127c 100644
--- a/src/compiler/js-heap-broker.h
+++ b/src/compiler/js-heap-broker.h
@@ -340,7 +340,7 @@
NameRef GetPropertyKey(int descriptor_index) const;
FieldIndex GetFieldIndexFor(int descriptor_index) const;
ObjectRef GetFieldType(int descriptor_index) const;
- bool IsUnboxedDoubleField(FieldIndex index) const;
+ bool IsUnboxedDoubleField(int descriptor_index) const;
};
class FixedArrayBaseRef : public HeapObjectRef {