8231085: C2/GC: Better GC-interface for expanding clone
Reviewed-by: eosterlund
This commit is contained in:
parent
b9cd2cecaa
commit
5eb643144b
src/hotspot/share
@ -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 @@ Node* BarrierSetC2::obj_allocate(PhaseMacroExpand* macro, Node* ctrl, Node* mem,
|
||||
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);
|
||||
}
|
||||
|
@ -261,7 +261,7 @@ public:
|
||||
};
|
||||
|
||||
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; }
|
||||
|
@ -63,6 +63,22 @@ public:
|
||||
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 @@ private:
|
||||
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 @@ private:
|
||||
// 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,
|
||||
|
@ -1093,22 +1093,8 @@ void PhaseMacroExpand::expand_arraycopy_node(ArrayCopyNode *ac) {
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user