diff options
Diffstat (limited to 'deps/v8/src/compiler/property-access-builder.cc')
-rw-r--r-- | deps/v8/src/compiler/property-access-builder.cc | 54 |
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>(); } |