From 3b5b596f4be00cbe275c589c804d0794255ccc31 Mon Sep 17 00:00:00 2001
From: Nils Eliasson <neliasso@openjdk.org>
Date: Thu, 7 Nov 2019 09:23:55 +0100
Subject: [PATCH] 8233783: Make 8232896 patch complete

Reviewed-by: pliden, kvn
---
 src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp   | 99 ++++++++++---------
 src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp   |  3 +-
 src/hotspot/share/gc/z/zBarrier.hpp           |  1 -
 src/hotspot/share/gc/z/zBarrier.inline.hpp    |  4 -
 src/hotspot/share/gc/z/zBarrierSetRuntime.cpp |  8 +-
 src/hotspot/share/gc/z/zBarrierSetRuntime.hpp |  4 +-
 6 files changed, 59 insertions(+), 60 deletions(-)

diff --git a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
index 33a376c1283..a201630a8f4 100644
--- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
+++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
@@ -37,7 +37,7 @@
 #include "opto/node.hpp"
 #include "opto/regalloc.hpp"
 #include "opto/rootnode.hpp"
-#include "opto/runtime.hpp"
+#include "opto/type.hpp"
 #include "utilities/growableArray.hpp"
 #include "utilities/macros.hpp"
 
@@ -226,6 +226,56 @@ bool ZBarrierSetC2::array_copy_requires_gc_barriers(bool tightly_coupled_alloc,
   return type == T_OBJECT || type == T_ARRAY;
 }
 
+static const TypeFunc* clone_type() {
+  // Create input type (domain)
+  const Type** domain_fields = TypeTuple::fields(3);
+  domain_fields[TypeFunc::Parms + 0] = TypeInstPtr::NOTNULL;  // src
+  domain_fields[TypeFunc::Parms + 1] = TypeInstPtr::NOTNULL;  // dst
+  domain_fields[TypeFunc::Parms + 2] = TypeLong::LONG;        // size
+  const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms + 3, domain_fields);
+
+  // Create result type (range)
+  const Type** range_fields = TypeTuple::fields(0);
+  const TypeTuple* range = TypeTuple::make(TypeFunc::Parms + 0, range_fields);
+
+  return TypeFunc::make(domain, range);
+}
+
+void ZBarrierSetC2::clone_at_expansion(PhaseMacroExpand* phase, ArrayCopyNode* ac) const {
+  Node* const src = ac->in(ArrayCopyNode::Src);
+
+  if (src->bottom_type()->isa_aryptr()) {
+    // Clone primitive array
+    BarrierSetC2::clone_at_expansion(phase, ac);
+    return;
+  }
+
+  // Clone instance
+  Node* const ctrl = ac->in(TypeFunc::Control);
+  Node* const mem = ac->in(TypeFunc::Memory);
+  Node* const dst = ac->in(ArrayCopyNode::Dest);
+  Node* const src_offset = ac->in(ArrayCopyNode::SrcPos);
+  Node* const dst_offset = ac->in(ArrayCopyNode::DestPos);
+  Node* const size = ac->in(ArrayCopyNode::Length);
+
+  assert(src->bottom_type()->isa_instptr(), "Should be an instance");
+  assert(dst->bottom_type()->isa_instptr(), "Should be an instance");
+  assert(src_offset == NULL, "Should be null");
+  assert(dst_offset == NULL, "Should be null");
+
+  Node* const call = phase->make_leaf_call(ctrl,
+                                           mem,
+                                           clone_type(),
+                                           ZBarrierSetRuntime::clone_addr(),
+                                           "ZBarrierSetRuntime::clone",
+                                           TypeRawPtr::BOTTOM,
+                                           src,
+                                           dst,
+                                           size);
+  phase->transform_later(call);
+  phase->igvn().replace_node(ac, call);
+}
+
 // == Dominating barrier elision ==
 
 static bool block_has_safepoint(const Block* block, uint from, uint to) {
@@ -432,50 +482,3 @@ void ZBarrierSetC2::compute_liveness_at_stubs() const {
     }
   }
 }
-
-const TypeFunc *oop_clone_Type() {
-  // create input type (domain)
-  const Type **fields = TypeTuple::fields(3);
-  fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;  // src Object
-  fields[TypeFunc::Parms+1] = TypeInstPtr::NOTNULL;  // dst Object
-  fields[TypeFunc::Parms+2] = TypeInt::INT;          // Object size
-  const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+3, fields);
-
-  // create result type (range)
-  fields = TypeTuple::fields(0);
-
-  const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
-
-  return TypeFunc::make(domain, range);
-}
-
-void ZBarrierSetC2::clone_at_expansion(PhaseMacroExpand* phase, ArrayCopyNode* ac) const {
-  Node *ctrl = ac->in(TypeFunc::Control);
-  Node *mem = ac->in(TypeFunc::Memory);
-  Node *src = ac->in(ArrayCopyNode::Src);
-  Node *src_offset = ac->in(ArrayCopyNode::SrcPos);
-  Node *dest = ac->in(ArrayCopyNode::Dest);
-  Node *dest_offset = ac->in(ArrayCopyNode::DestPos);
-  Node *length = ac->in(ArrayCopyNode::Length);
-
-  assert (src_offset == NULL,  "for clone offsets should be null");
-  assert (dest_offset == NULL, "for clone offsets should be null");
-
-  if (src->bottom_type()->isa_instptr()) {
-    // Instances must have all oop fiels healed before cloning - call runtime leaf
-    const char *clonefunc_name = "clone_oop";
-    address clonefunc_addr = ZBarrierSetRuntime::clone_oop_addr();
-    const TypePtr *raw_adr_type = TypeRawPtr::BOTTOM;
-    const TypeFunc *call_type = oop_clone_Type();
-
-    Node *call = phase->make_leaf_call(ctrl, mem, call_type, clonefunc_addr, clonefunc_name, raw_adr_type, src, dest,
-                                       length);
-    phase->transform_later(call);
-    phase->igvn().replace_node(ac, call);
-  } else {
-    assert(src->bottom_type()->isa_aryptr() != NULL, "Only arrays");
-
-    // Clones of primitive arrays go here
-    BarrierSetC2::clone_at_expansion(phase, ac);
-  }
-}
diff --git a/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp b/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
index 87fbed061e0..1b40760a453 100644
--- a/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
+++ b/src/hotspot/share/gc/z/c2/zBarrierSetC2.hpp
@@ -82,11 +82,12 @@ public:
                                                BasicType type,
                                                bool is_clone,
                                                ArrayCopyPhase phase) const;
+  virtual void clone_at_expansion(PhaseMacroExpand* phase,
+                                  ArrayCopyNode* ac) const;
 
   virtual void late_barrier_analysis() const;
   virtual int estimate_stub_size() const;
   virtual void emit_stubs(CodeBuffer& cb) const;
-  virtual void clone_at_expansion(PhaseMacroExpand* phase, ArrayCopyNode* ac) const;
 };
 
 #endif // SHARE_GC_Z_C2_ZBARRIERSETC2_HPP
diff --git a/src/hotspot/share/gc/z/zBarrier.hpp b/src/hotspot/share/gc/z/zBarrier.hpp
index b652fdef9ee..84bf0a41d3a 100644
--- a/src/hotspot/share/gc/z/zBarrier.hpp
+++ b/src/hotspot/share/gc/z/zBarrier.hpp
@@ -119,7 +119,6 @@ public:
   static oop  load_barrier_on_oop_field(volatile narrowOop* p);
   static oop  load_barrier_on_oop_field_preloaded(volatile narrowOop* p, oop o);
   static void load_barrier_on_oop_array(volatile narrowOop* p, size_t length);
-  static void clone_oop(volatile oop src, oop dst, size_t length);
   static oop  load_barrier_on_weak_oop_field_preloaded(volatile narrowOop* p, oop o);
   static oop  load_barrier_on_phantom_oop_field_preloaded(volatile narrowOop* p, oop o);
   static oop  weak_load_barrier_on_oop_field_preloaded(volatile narrowOop* p, oop o);
diff --git a/src/hotspot/share/gc/z/zBarrier.inline.hpp b/src/hotspot/share/gc/z/zBarrier.inline.hpp
index 53381433332..ba6f305c0c0 100644
--- a/src/hotspot/share/gc/z/zBarrier.inline.hpp
+++ b/src/hotspot/share/gc/z/zBarrier.inline.hpp
@@ -175,10 +175,6 @@ inline void ZBarrier::load_barrier_on_oop_array(volatile oop* p, size_t length)
   }
 }
 
-inline void ZBarrier::clone_oop(volatile oop src, oop dst, size_t length) {
-  HeapAccess<>::clone(src, dst, length);
-}
-
 // ON_WEAK barriers should only ever be applied to j.l.r.Reference.referents.
 inline void verify_on_weak(volatile oop* referent_addr) {
 #ifdef ASSERT
diff --git a/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp b/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp
index 8aacd8bf975..d5a1ba08a02 100644
--- a/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp
+++ b/src/hotspot/share/gc/z/zBarrierSetRuntime.cpp
@@ -42,8 +42,8 @@ JRT_LEAF(void, ZBarrierSetRuntime::load_barrier_on_oop_array(oop* p, size_t leng
   ZBarrier::load_barrier_on_oop_array(p, length);
 JRT_END
 
-JRT_LEAF(void, ZBarrierSetRuntime::clone_oop(oop src, oop dst, size_t length))
-  ZBarrier::clone_oop(src, dst, length);
+JRT_LEAF(void, ZBarrierSetRuntime::clone(oop src, oop dst, size_t size))
+  HeapAccess<>::clone(src, dst, size);
 JRT_END
 
 address ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(DecoratorSet decorators) {
@@ -72,6 +72,6 @@ address ZBarrierSetRuntime::load_barrier_on_oop_array_addr() {
   return reinterpret_cast<address>(load_barrier_on_oop_array);
 }
 
-address ZBarrierSetRuntime::clone_oop_addr() {
-  return reinterpret_cast<address>(clone_oop);
+address ZBarrierSetRuntime::clone_addr() {
+  return reinterpret_cast<address>(clone);
 }
diff --git a/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp b/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp
index ef300569dfe..e3e4c5bfc52 100644
--- a/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp
+++ b/src/hotspot/share/gc/z/zBarrierSetRuntime.hpp
@@ -36,7 +36,7 @@ private:
   static oopDesc* load_barrier_on_weak_oop_field_preloaded(oopDesc* o, oop* p);
   static oopDesc* load_barrier_on_phantom_oop_field_preloaded(oopDesc* o, oop* p);
   static void load_barrier_on_oop_array(oop* p, size_t length);
-  static void clone_oop(oop src, oop dst, size_t length);
+  static void clone(oop src, oop dst, size_t size);
 
 public:
   static address load_barrier_on_oop_field_preloaded_addr(DecoratorSet decorators);
@@ -44,7 +44,7 @@ public:
   static address load_barrier_on_weak_oop_field_preloaded_addr();
   static address load_barrier_on_phantom_oop_field_preloaded_addr();
   static address load_barrier_on_oop_array_addr();
-  static address clone_oop_addr();
+  static address clone_addr();
 };
 
 #endif // SHARE_GC_Z_ZBARRIERSETRUNTIME_HPP