| Index: src/compiler/js-global-object-specialization.cc
|
| diff --git a/src/compiler/js-global-object-specialization.cc b/src/compiler/js-global-object-specialization.cc
|
| index bfc424e9dc1344e754e5f2fd80b16641158924e0..cbb7ce8275e546d42ad9bf44b9bfff0abaaac603 100644
|
| --- a/src/compiler/js-global-object-specialization.cc
|
| +++ b/src/compiler/js-global-object-specialization.cc
|
| @@ -49,7 +49,8 @@ Reduction JSGlobalObjectSpecialization::Reduce(Node* node) {
|
| namespace {
|
|
|
| FieldAccess ForPropertyCellValue(MachineRepresentation representation,
|
| - Type* type, Handle<Name> name) {
|
| + Type* type, MaybeHandle<Map> map,
|
| + Handle<Name> name) {
|
| WriteBarrierKind kind = kFullWriteBarrier;
|
| if (representation == MachineRepresentation::kTaggedSigned) {
|
| kind = kNoWriteBarrier;
|
| @@ -57,8 +58,8 @@ FieldAccess ForPropertyCellValue(MachineRepresentation representation,
|
| kind = kPointerWriteBarrier;
|
| }
|
| MachineType r = MachineType::TypeForRepresentation(representation);
|
| - FieldAccess access = {kTaggedBase, PropertyCell::kValueOffset, name, type, r,
|
| - kind};
|
| + FieldAccess access = {
|
| + kTaggedBase, PropertyCell::kValueOffset, name, map, type, r, kind};
|
| return access;
|
| }
|
| } // namespace
|
| @@ -115,6 +116,7 @@ Reduction JSGlobalObjectSpecialization::ReduceJSLoadGlobal(Node* node) {
|
| }
|
|
|
| // Load from constant type cell can benefit from type feedback.
|
| + MaybeHandle<Map> map;
|
| Type* property_cell_value_type = Type::NonInternal();
|
| MachineRepresentation representation = MachineRepresentation::kTagged;
|
| if (property_details.cell_type() == PropertyCellType::kConstantType) {
|
| @@ -126,18 +128,24 @@ Reduction JSGlobalObjectSpecialization::ReduceJSLoadGlobal(Node* node) {
|
| property_cell_value_type = Type::Number();
|
| representation = MachineRepresentation::kTaggedPointer;
|
| } else {
|
| - // TODO(turbofan): Track the property_cell_value_map on the FieldAccess
|
| - // below and use it in LoadElimination to eliminate map checks.
|
| Handle<Map> property_cell_value_map(
|
| Handle<HeapObject>::cast(property_cell_value)->map(), isolate());
|
| property_cell_value_type = Type::For(property_cell_value_map);
|
| representation = MachineRepresentation::kTaggedPointer;
|
| +
|
| + // We can only use the property cell value map for map check elimination
|
| + // if it's stable, i.e. the HeapObject wasn't mutated without the cell
|
| + // state being updated.
|
| + if (property_cell_value_map->is_stable()) {
|
| + dependencies()->AssumeMapStable(property_cell_value_map);
|
| + map = property_cell_value_map;
|
| + }
|
| }
|
| }
|
| - Node* value = effect =
|
| - graph()->NewNode(simplified()->LoadField(ForPropertyCellValue(
|
| - representation, property_cell_value_type, name)),
|
| - jsgraph()->HeapConstant(property_cell), effect, control);
|
| + Node* value = effect = graph()->NewNode(
|
| + simplified()->LoadField(ForPropertyCellValue(
|
| + representation, property_cell_value_type, map, name)),
|
| + jsgraph()->HeapConstant(property_cell), effect, control);
|
| ReplaceWithValue(node, value, effect, control);
|
| return Replace(value);
|
| }
|
| @@ -218,10 +226,11 @@ Reduction JSGlobalObjectSpecialization::ReduceJSStoreGlobal(Node* node) {
|
| property_cell_value_type = Type::SignedSmall();
|
| representation = MachineRepresentation::kTaggedSigned;
|
| }
|
| - effect = graph()->NewNode(
|
| - simplified()->StoreField(ForPropertyCellValue(
|
| - representation, property_cell_value_type, name)),
|
| - jsgraph()->HeapConstant(property_cell), value, effect, control);
|
| + effect = graph()->NewNode(simplified()->StoreField(ForPropertyCellValue(
|
| + representation, property_cell_value_type,
|
| + MaybeHandle<Map>(), name)),
|
| + jsgraph()->HeapConstant(property_cell), value,
|
| + effect, control);
|
| break;
|
| }
|
| case PropertyCellType::kMutable: {
|
| @@ -230,7 +239,8 @@ Reduction JSGlobalObjectSpecialization::ReduceJSStoreGlobal(Node* node) {
|
| dependencies()->AssumePropertyCell(property_cell);
|
| effect = graph()->NewNode(
|
| simplified()->StoreField(ForPropertyCellValue(
|
| - MachineRepresentation::kTagged, Type::NonInternal(), name)),
|
| + MachineRepresentation::kTagged, Type::NonInternal(),
|
| + MaybeHandle<Map>(), name)),
|
| jsgraph()->HeapConstant(property_cell), value, effect, control);
|
| break;
|
| }
|
|
|