summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/property-access-builder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/property-access-builder.cc')
-rw-r--r--deps/v8/src/compiler/property-access-builder.cc54
1 files changed, 43 insertions, 11 deletions
diff --git a/deps/v8/src/compiler/property-access-builder.cc b/deps/v8/src/compiler/property-access-builder.cc
index dc25326735..4235160037 100644
--- a/deps/v8/src/compiler/property-access-builder.cc
+++ b/deps/v8/src/compiler/property-access-builder.cc
@@ -199,17 +199,49 @@ Node* PropertyAccessBuilder::BuildLoadDataField(NameRef const& name,
MachineRepresentation::kFloat64) {
bool const is_heapnumber = !is_inobject || !FLAG_unbox_double_fields;
if (is_heapnumber) {
- FieldAccess const storage_access = {kTaggedBase,
- field_access.offset,
- name.object(),
- MaybeHandle<Map>(),
- Type::OtherInternal(),
- MachineType::TaggedPointer(),
- kPointerWriteBarrier,
- LoadSensitivity::kCritical,
- field_access.const_field_info};
- storage = *effect = graph()->NewNode(
- simplified()->LoadField(storage_access), storage, *effect, *control);
+ if (dependencies() == nullptr) {
+ FieldAccess const storage_access = {kTaggedBase,
+ field_access.offset,
+ name.object(),
+ MaybeHandle<Map>(),
+ Type::Any(),
+ MachineType::AnyTagged(),
+ kPointerWriteBarrier,
+ LoadSensitivity::kCritical,
+ field_access.const_field_info};
+ storage = *effect =
+ graph()->NewNode(simplified()->LoadField(storage_access), storage,
+ *effect, *control);
+ // We expect the loaded value to be a heap number here. With
+ // in-place field representation changes it is possible this is a
+ // no longer a heap number without map transitions. If we haven't taken
+ // a dependency on field representation, we should verify the loaded
+ // value is a heap number.
+ storage = *effect = graph()->NewNode(simplified()->CheckHeapObject(),
+ storage, *effect, *control);
+ Node* map = *effect =
+ graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
+ storage, *effect, *control);
+ Node* is_heap_number =
+ graph()->NewNode(simplified()->ReferenceEqual(), map,
+ jsgraph()->HeapNumberMapConstant());
+ *effect = graph()->NewNode(
+ simplified()->CheckIf(DeoptimizeReason::kNotAHeapNumber),
+ is_heap_number, *effect, *control);
+ } else {
+ FieldAccess const storage_access = {kTaggedBase,
+ field_access.offset,
+ name.object(),
+ MaybeHandle<Map>(),
+ Type::OtherInternal(),
+ MachineType::TaggedPointer(),
+ kPointerWriteBarrier,
+ LoadSensitivity::kCritical,
+ field_access.const_field_info};
+ storage = *effect =
+ graph()->NewNode(simplified()->LoadField(storage_access), storage,
+ *effect, *control);
+ }
field_access.offset = HeapNumber::kValueOffset;
field_access.name = MaybeHandle<Name>();
}