# HG changeset patch # User rkennke # Date 1568712337 -7200 # Tue Sep 17 11:25:37 2019 +0200 # Node ID b4bc013b67cd62519f4f3ae07a706fd2381bda7f # Parent bb1aaed00341b7a78dc0b1ab517070e1183e448d 8231085: C2/GC: Better GC-interface for expanding clone diff --git a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp --- a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp +++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp @@ -30,6 +30,7 @@ #include "opto/idealKit.hpp" #include "opto/macro.hpp" #include "opto/narrowptrnode.hpp" +#include "opto/runtime.hpp" #include "utilities/macros.hpp" // By default this is a no-op. @@ -794,7 +795,29 @@ return fast_oop; } -void BarrierSetC2::clone_barrier_at_expansion(ArrayCopyNode* ac, Node* call, PhaseIterGVN& igvn) const { - // no barrier - igvn.replace_node(ac, call); +#define XTOP LP64_ONLY(COMMA phase->top()) + +void BarrierSetC2::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 && dest_offset == NULL, "for clone offsets should be null"); + + const char* copyfunc_name = "arraycopy"; + address copyfunc_addr = + phase->basictype2arraycopy(T_LONG, NULL, NULL, + true, copyfunc_name, true); + + const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM; + const TypeFunc* call_type = OptoRuntime::fast_arraycopy_Type(); + + Node* call = phase->make_leaf_call(ctrl, mem, call_type, copyfunc_addr, copyfunc_name, raw_adr_type, src, dest, length XTOP); + phase->transform_later(call); + + phase->igvn().replace_node(ac, call); } diff --git a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp --- a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp +++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp @@ -261,7 +261,7 @@ }; virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const { return false; } - virtual void clone_barrier_at_expansion(ArrayCopyNode* ac, Node* call, PhaseIterGVN& igvn) const; + virtual void clone_at_expansion(PhaseMacroExpand* phase, ArrayCopyNode* ac) const; // Support for GC barriers emitted during parsing virtual bool has_load_barriers() const { return false; } diff --git a/src/hotspot/share/opto/macro.hpp b/src/hotspot/share/opto/macro.hpp --- a/src/hotspot/share/opto/macro.hpp +++ b/src/hotspot/share/opto/macro.hpp @@ -63,6 +63,22 @@ Node* make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt); + Node* make_leaf_call(Node* ctrl, Node* mem, + const TypeFunc* call_type, address call_addr, + const char* call_name, + const TypePtr* adr_type, + Node* parm0 = NULL, Node* parm1 = NULL, + Node* parm2 = NULL, Node* parm3 = NULL, + Node* parm4 = NULL, Node* parm5 = NULL, + Node* parm6 = NULL, Node* parm7 = NULL); + + address basictype2arraycopy(BasicType t, + Node* src_offset, + Node* dest_offset, + bool disjoint_bases, + const char* &name, + bool dest_uninitialized); + private: // projections extracted from a call node ProjNode *_fallthroughproj; @@ -103,14 +119,6 @@ void insert_mem_bar(Node** ctrl, Node** mem, int opcode, Node* precedent = NULL); Node* array_element_address(Node* ary, Node* idx, BasicType elembt); Node* ConvI2L(Node* offset); - Node* make_leaf_call(Node* ctrl, Node* mem, - const TypeFunc* call_type, address call_addr, - const char* call_name, - const TypePtr* adr_type, - Node* parm0 = NULL, Node* parm1 = NULL, - Node* parm2 = NULL, Node* parm3 = NULL, - Node* parm4 = NULL, Node* parm5 = NULL, - Node* parm6 = NULL, Node* parm7 = NULL); // helper methods modeled after LibraryCallKit for array copy Node* generate_guard(Node** ctrl, Node* test, RegionNode* region, float true_prob); @@ -121,12 +129,6 @@ // More helper methods for array copy Node* generate_nonpositive_guard(Node** ctrl, Node* index, bool never_negative); void finish_arraycopy_call(Node* call, Node** ctrl, MergeMemNode** mem, const TypePtr* adr_type); - address basictype2arraycopy(BasicType t, - Node* src_offset, - Node* dest_offset, - bool disjoint_bases, - const char* &name, - bool dest_uninitialized); Node* generate_arraycopy(ArrayCopyNode *ac, AllocateArrayNode* alloc, Node** ctrl, MergeMemNode* mem, Node** io, diff --git a/src/hotspot/share/opto/macroArrayCopy.cpp b/src/hotspot/share/opto/macroArrayCopy.cpp --- a/src/hotspot/share/opto/macroArrayCopy.cpp +++ b/src/hotspot/share/opto/macroArrayCopy.cpp @@ -1093,22 +1093,8 @@ MergeMemNode* merge_mem = NULL; if (ac->is_clonebasic()) { - assert (src_offset == NULL && dest_offset == NULL, "for clone offsets should be null"); - Node* mem = ac->in(TypeFunc::Memory); - const char* copyfunc_name = "arraycopy"; - address copyfunc_addr = - basictype2arraycopy(T_LONG, NULL, NULL, - true, copyfunc_name, true); - - const TypePtr* raw_adr_type = TypeRawPtr::BOTTOM; - const TypeFunc* call_type = OptoRuntime::fast_arraycopy_Type(); - - Node* call = make_leaf_call(ctrl, mem, call_type, copyfunc_addr, copyfunc_name, raw_adr_type, src, dest, length XTOP); - transform_later(call); - BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); - bs->clone_barrier_at_expansion(ac, call, _igvn); - + bs->clone_at_expansion(this, ac); return; } else if (ac->is_copyof() || ac->is_copyofrange() || ac->is_cloneoop()) { Node* mem = ac->in(TypeFunc::Memory);