Cherry-pick "[vm, gc] Account for AllocateArray or CloneContext returning objects that have already been added to the remembered set."

Change-Id: I3eb26504c85f1d881837748e990d72183690ae7f
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 490f4c1..11ad1e8 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -56,7 +56,7 @@
   }
   // [R0] already contains first argument.
   __ mov(R1, Operand(THR));
-  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
   if (preserve_registers) {
     __ LeaveCallRuntimeFrame();
   }
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index a477f9e..5fdff33 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -54,7 +54,7 @@
   }
   // [R0] already contains first argument.
   __ mov(R1, THR);
-  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
   if (preserve_registers) {
     __ LeaveCallRuntimeFrame();
   }
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 328a17a..17f6dab 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -54,7 +54,7 @@
   }
   __ movl(Address(ESP, 1 * target::kWordSize), THR);
   __ movl(Address(ESP, 0 * target::kWordSize), EAX);
-  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
   if (preserve_registers) {
     __ LeaveCallRuntimeFrame();
   }
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 8bcf076..26f2e51 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -56,7 +56,7 @@
   }
   __ movq(CallingConventions::kArg1Reg, RAX);
   __ movq(CallingConventions::kArg2Reg, THR);
-  __ CallRuntime(kAddAllocatedObjectToRememberedSetRuntimeEntry, 2);
+  __ CallRuntime(kEnsureRememberedAndMarkingDeferredRuntimeEntry, 2);
   if (preserve_registers) {
     __ LeaveCallRuntimeFrame();
   }
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 1a097cc..23b442c 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -320,13 +320,13 @@
 }
 
 DEFINE_LEAF_RUNTIME_ENTRY(RawObject*,
-                          AddAllocatedObjectToRememberedSet,
+                          EnsureRememberedAndMarkingDeferred,
                           2,
                           RawObject* object,
                           Thread* thread) {
-  // The allocation stubs in will call this leaf method for newly allocated
+  // The allocation stubs will call this leaf method for newly allocated
   // old space objects.
-  RELEASE_ASSERT(object->IsOldObject() && !object->IsRemembered());
+  RELEASE_ASSERT(object->IsOldObject());
 
   // If we eliminate a generational write barriers on allocations of an object
   // we need to ensure it's either a new-space object or it has been added to
@@ -338,7 +338,13 @@
   // outermost runtime code (to which the genenerated Dart code might not return
   // in a long time).
   bool add_to_remembered_set = true;
-  if (object->IsArray()) {
+  if (object->IsRemembered()) {
+    // Objects must not be added to the remembered set twice because the
+    // scavenger's visitor is not idempotent.
+    // Might already be remembered because of type argument store in
+    // AllocateArray or any field in CloneContext.
+    add_to_remembered_set = false;
+  } else if (object->IsArray()) {
     const intptr_t length =
         Array::LengthOf(reinterpret_cast<RawArray*>(object));
     add_to_remembered_set =
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index cd9c4d6..204f78f 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -67,7 +67,7 @@
   V(void, StoreBufferBlockProcess, Thread*)                                    \
   V(void, MarkingStackBlockProcess, Thread*)                                   \
   V(void, RememberCard, RawObject*, RawObject**)                               \
-  V(RawObject*, AddAllocatedObjectToRememberedSet, RawObject* object,          \
+  V(RawObject*, EnsureRememberedAndMarkingDeferred, RawObject* object,         \
     Thread* thread)                                                            \
   V(double, LibcPow, double, double)                                           \
   V(double, DartModulo, double, double)                                        \