Version 2.14.0-55.0.dev

Merge commit '820cdc926551e62f1b491a9e7f48c4bf92b2aac9' into 'dev'
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 9dfcc4e..47e9439 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -155,7 +155,7 @@
       LeaveCompilerScope cs(H.thread());
       field.RecordStore(Object::null_object());
     } else {
-      ASSERT(field.is_nullable(/* silence_assert = */ true));
+      ASSERT(field.is_nullable_unsafe());
     }
     return Fragment();
   }
@@ -187,7 +187,7 @@
       LeaveCompilerScope cs(H.thread());
       field.RecordStore(Object::null_object());
     } else {
-      ASSERT(field.is_nullable(/* silence_assert = */ true));
+      ASSERT(field.is_nullable_unsafe());
     }
     return Fragment();
   }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 3c3c21a..ade7623 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -10235,21 +10235,18 @@
       &untag()->guarded_cid_);
 }
 
-bool Field::is_nullable(bool silence_assert) const {
+bool Field::is_nullable() const {
 #if defined(DEBUG)
-  if (!silence_assert) {
-    // Same assert as guarded_cid(), because is_nullable() also needs to be
-    // consistent for the background compiler.
-    Thread* thread = Thread::Current();
-    ASSERT(
-        !thread->IsInsideCompiler() ||
+  // Same assert as guarded_cid(), because is_nullable() also needs to be
+  // consistent for the background compiler.
+  Thread* thread = Thread::Current();
+  ASSERT(!thread->IsInsideCompiler() ||
 #if !defined(DART_PRECOMPILED_RUNTIME)
-        ((CompilerState::Current().should_clone_fields() == !IsOriginal())) ||
+         ((CompilerState::Current().should_clone_fields() == !IsOriginal())) ||
 #endif
-        is_static());
-  }
+         is_static());
 #endif
-  return untag()->is_nullable_ == kNullCid;
+  return is_nullable_unsafe();
 }
 
 void Field::SetOriginal(const Field& value) const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 078af85..75bab66 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4224,14 +4224,19 @@
   // Internally we is_nullable_ field contains either kNullCid (nullable) or
   // kInvalidCid (non-nullable) instead of boolean. This is done to simplify
   // guarding sequence in the generated code.
-  bool is_nullable(bool silence_assert = false) const;
+  bool is_nullable() const;
   void set_is_nullable(bool val) const {
     DEBUG_ASSERT(
         IsolateGroup::Current()->program_lock()->IsCurrentThreadWriter());
     set_is_nullable_unsafe(val);
   }
+  bool is_nullable_unsafe() const {
+    return LoadNonPointer<ClassIdTagType, std::memory_order_relaxed>(
+               &untag()->is_nullable_) == kNullCid;
+  }
   void set_is_nullable_unsafe(bool val) const {
-    StoreNonPointer(&untag()->is_nullable_, val ? kNullCid : kIllegalCid);
+    StoreNonPointer<ClassIdTagType, ClassIdTagType, std::memory_order_relaxed>(
+        &untag()->is_nullable_, val ? kNullCid : kIllegalCid);
   }
   static intptr_t is_nullable_offset() {
     return OFFSET_OF(UntaggedField, is_nullable_);
diff --git a/tools/VERSION b/tools/VERSION
index 2bb6277..4343132 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 54
+PRERELEASE 55
 PRERELEASE_PATCH 0
\ No newline at end of file