Revert "[vm, compiler] Treat _uninitializedData/Index as effectively const." This reverts commit 562af5de3562584dd15a115d27808cfb14eefc85. Reason for revert: regression, loses exact type for initial value? Original change's description: > [vm, compiler] Treat _uninitializedData/Index as effectively const. > > This avoids static field initialization checks in the default map and set constructors, which in turn avoids write barriers and the frame build. > > TEST=ci > Change-Id: Ie12840ae1799cd97645b2132ad94ec6525126f74 > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/398760 > Reviewed-by: Alexander Markov <alexmarkov@google.com> > Commit-Queue: Ryan Macnak <rmacnak@google.com> Change-Id: I41af0247277f6456ba9c5dfcdb8da43cebc64cc0 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400222 Commit-Queue: Siva Annamalai <asiva@google.com> Reviewed-by: Siva Annamalai <asiva@google.com> Auto-Submit: Ryan Macnak <rmacnak@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc index 8bba947..f56846f 100644 --- a/runtime/vm/compiler/backend/constant_propagator.cc +++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -857,10 +857,9 @@ } void ConstantPropagator::VisitLoadStaticField(LoadStaticFieldInstr* instr) { - // We cannot generally take the current value for an initialized constant - // field because the same code will be used when the AppAOT or AppJIT starts - // over with everything uninitialized or another isolate in the isolate group - // starts with everything uninitialized. + // Cannot treat an initialized field as constant because the same code will be + // used when the AppAOT or AppJIT starts over with everything uninitialized or + // another isolate in the isolate group starts with everything uninitialized. SetValue(instr, non_constant_); }
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc index 9c74a54..552c010 100644 --- a/runtime/vm/compiler/backend/il_serializer.cc +++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -30,11 +30,7 @@ zone_(Thread::Current()->zone()), thread_(Thread::Current()), isolate_group_(IsolateGroup::Current()), - heap_(IsolateGroup::Current()->heap()) { - // We want to preserve the identity of these, even though they are not const. - AddBaseObject(Object::uninitialized_index()); - AddBaseObject(Object::uninitialized_data()); -} + heap_(IsolateGroup::Current()->heap()) {} FlowGraphSerializer::~FlowGraphSerializer() { heap_->ResetObjectIdTable(); @@ -47,11 +43,7 @@ stream_(stream), zone_(Thread::Current()->zone()), thread_(Thread::Current()), - isolate_group_(IsolateGroup::Current()) { - // We want to preserve the identity of these, even though they are not const. - AddBaseObject(Object::uninitialized_index()); - AddBaseObject(Object::uninitialized_data()); -} + isolate_group_(IsolateGroup::Current()) {} ClassPtr FlowGraphDeserializer::GetClassById(classid_t id) const { return isolate_group()->class_table()->At(id); @@ -1411,11 +1403,6 @@ MoveOperands::MoveOperands(FlowGraphDeserializer* d) : dest_(Location::Read(d)), src_(Location::Read(d)) {} -void FlowGraphSerializer::AddBaseObject(const Object& x) { - const intptr_t object_index = object_counter_++; - heap()->SetObjectId(x.ptr(), object_index + 1); -} - template <> void FlowGraphSerializer::WriteTrait<const Object&>::Write( FlowGraphSerializer* s, @@ -1436,12 +1423,6 @@ s->WriteObjectImpl(x, cid, object_index); } -void FlowGraphDeserializer::AddBaseObject(const Object& x) { - const intptr_t object_index = object_counter_; - object_counter_++; - SetObjectAt(object_index, x); -} - template <> const Object& FlowGraphDeserializer::ReadTrait<const Object&>::Read( FlowGraphDeserializer* d) {
diff --git a/runtime/vm/compiler/backend/il_serializer.h b/runtime/vm/compiler/backend/il_serializer.h index cd93656..13d448c 100644 --- a/runtime/vm/compiler/backend/il_serializer.h +++ b/runtime/vm/compiler/backend/il_serializer.h
@@ -304,7 +304,6 @@ bool can_write_refs() const { return can_write_refs_; } private: - void AddBaseObject(const Object& x); void WriteObjectImpl(const Object& x, intptr_t cid, intptr_t object_index); bool IsWritten(const Object& obj); bool HasEnclosingTypes(const Object& obj); @@ -498,7 +497,6 @@ } private: - void AddBaseObject(const Object& x); ClassPtr GetClassById(classid_t id) const; const Object& ReadObjectImpl(intptr_t cid, intptr_t object_index); void SetObjectAt(intptr_t object_index, const Object& object);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc index 8493aa3..96f8006 100644 --- a/runtime/vm/compiler/frontend/kernel_to_il.cc +++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -1115,8 +1115,6 @@ case MethodRecognizer::kUtf8DecoderScan: case MethodRecognizer::kHas63BitSmis: case MethodRecognizer::kExtensionStreamHasListener: - case MethodRecognizer::kCompactHash_uninitializedIndex: - case MethodRecognizer::kCompactHash_uninitializedData: case MethodRecognizer::kSmi_hashCode: case MethodRecognizer::kMint_hashCode: case MethodRecognizer::kDouble_hashCode: @@ -1728,12 +1726,6 @@ body += IntToBool(); #endif // PRODUCT } break; - case MethodRecognizer::kCompactHash_uninitializedIndex: { - body += Constant(Object::uninitialized_index()); - } break; - case MethodRecognizer::kCompactHash_uninitializedData: { - body += Constant(Object::uninitialized_data()); - } break; case MethodRecognizer::kSmi_hashCode: { // TODO(dartbug.com/38985): We should make this LoadLocal+Unbox+ // IntegerHash+Box. Though this would make use of unboxed values on stack
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h index 59e7a44..b0aba41 100644 --- a/runtime/vm/compiler/recognized_methods_list.h +++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -101,10 +101,6 @@ ImmutableLinkedHashBase_getIndex, 0xfe7649ae) \ V(CompactHashLibrary, _HashVMImmutableBase, set:_index, \ ImmutableLinkedHashBase_setIndexStoreRelease, 0xcf36944c) \ - V(CompactHashLibrary, ::, get:_uninitializedIndex, \ - CompactHash_uninitializedIndex, 0xa25a7625) \ - V(CompactHashLibrary, ::, get:_uninitializedData, \ - CompactHash_uninitializedData, 0x06a5677a) \ V(DeveloperLibrary, ::, get:extensionStreamHasListener, \ ExtensionStreamHasListener, 0xfa975305) \ V(DeveloperLibrary, ::, debugger, Debugger, 0xf0aaff14) \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc index 93369cf..75c99e98 100644 --- a/runtime/vm/object.cc +++ b/runtime/vm/object.cc
@@ -1329,11 +1329,6 @@ KernelBytecode::kVMInternal_ImplicitConstructorClosure); #endif // defined(DART_DYNAMIC_MODULES) - *uninitialized_index_ = - TypedData::New(kTypedDataUint32ArrayCid, - LinkedHashBase::kUninitializedIndexSize, Heap::kOld); - *uninitialized_data_ = Array::New(0, Heap::kOld); - // Some thread fields need to be reinitialized as null constants have not been // initialized until now. thread->ClearStickyError(); @@ -1433,10 +1428,6 @@ ASSERT(implicit_instance_closure_bytecode_->IsBytecode()); ASSERT(!implicit_constructor_closure_bytecode_->IsSmi()); ASSERT(implicit_constructor_closure_bytecode_->IsBytecode()); - ASSERT(!uninitialized_index_->IsSmi()); - ASSERT(uninitialized_index_->IsTypedData()); - ASSERT(!uninitialized_data_->IsSmi()); - ASSERT(uninitialized_data_->IsArray()); } void Object::FinishInit(IsolateGroup* isolate_group) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h index 54d73a0..9cb22bb 100644 --- a/runtime/vm/object.h +++ b/runtime/vm/object.h
@@ -517,9 +517,7 @@ V(Array, vm_isolate_snapshot_object_table) \ V(Type, dynamic_type) \ V(Type, void_type) \ - V(AbstractType, null_abstract_type) \ - V(TypedData, uninitialized_index) \ - V(Array, uninitialized_data) + V(AbstractType, null_abstract_type) #define DEFINE_SHARED_READONLY_HANDLE_GETTER(Type, name) \ static const Type& name() { \ @@ -12149,10 +12147,10 @@ virtual uint32_t CanonicalizeHash() const; virtual void CanonicalizeFieldsLocked(Thread* thread) const; + protected: // Keep this in sync with Dart implementation (lib/compact_hash.dart). static constexpr intptr_t kInitialIndexBits = 2; static constexpr intptr_t kInitialIndexSize = 1 << (kInitialIndexBits + 1); - static constexpr intptr_t kUninitializedIndexSize = 1; private: LinkedHashBasePtr ptr() const { return static_cast<LinkedHashBasePtr>(ptr_); }
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h index fedffda..f120dea 100644 --- a/runtime/vm/object_store.h +++ b/runtime/vm/object_store.h
@@ -528,7 +528,7 @@ #undef DECLARE_LAZY_INIT_ASYNC_GETTER #undef DECLARE_LAZY_INIT_ISOLATE_GETTER #undef DECLARE_LAZY_INIT_INTERNAL_GETTER -#undef DECLARE_LAZY_INIT_FFI_GETTER +#undef DECLARE_LAZY_INIT_TYPED_DATA_GETTER LibraryPtr bootstrap_library(BootstrapLibraryId index) { switch (index) {
diff --git a/sdk/lib/_internal/vm_shared/lib/compact_hash.dart b/sdk/lib/_internal/vm_shared/lib/compact_hash.dart index 2f97f3f..4db0480 100644 --- a/sdk/lib/_internal/vm_shared/lib/compact_hash.dart +++ b/sdk/lib/_internal/vm_shared/lib/compact_hash.dart
@@ -360,16 +360,11 @@ bool _equals(Object? e1, Object? e2) => (_equality as Function)(e1, e2); } -@pragma("vm:prefer-inline") -@pragma("vm:recognized", "other") -external Uint32List get _uninitializedIndex; - +final _uninitializedIndex = new Uint32List(_HashBase._UNINITIALIZED_INDEX_SIZE); // Note: not const. Const arrays are made immutable by having a different class // than regular arrays that throws on element assignment. We want the data field // in maps and sets to be monomorphic. -@pragma("vm:prefer-inline") -@pragma("vm:recognized", "other") -external List<Object?> get _uninitializedData; +final _uninitializedData = new List.filled(0, null); // VM-internalized implementation of a default-constructed LinkedHashMap. Map // literals also create instances of this class.