< prev index next > src/hotspot/share/opto/escape.cpp
Print this page
PointsToNode* n_ptn = ptnode_adr(n_idx);
if (n_ptn != nullptr) {
return; // No need to redefine PointsTo node during first iteration.
}
int opcode = n->Opcode();
- bool gc_handled = BarrierSet::barrier_set()->barrier_set_c2()->escape_add_to_con_graph(this, igvn, delayed_worklist, n, opcode);
- if (gc_handled) {
- return; // Ignore node if already handled by GC.
- }
-
if (n->is_Call()) {
// Arguments to allocation and locking don't escape.
if (n->is_AbstractLock()) {
// Put Lock and Unlock nodes on IGVN worklist to process them during
// first IGVN optimization when escape information is still available.
}
assert(n->is_Store() || n->is_LoadStore() ||
((n_ptn != nullptr) && (n_ptn->ideal_node() != nullptr)),
"node should be registered already");
int opcode = n->Opcode();
- bool gc_handled = BarrierSet::barrier_set()->barrier_set_c2()->escape_add_final_edges(this, _igvn, n, opcode);
- if (gc_handled) {
- return; // Ignore node if already handled by GC.
- }
switch (opcode) {
case Op_AddP: {
Node* base = get_addp_base(n);
PointsToNode* ptn_base = ptnode_adr(base->_idx);
assert(ptn_base != nullptr, "field's base should be registered");
//
bool arg_is_arraycopy_dest = src_has_oops && is_arraycopy &&
arg_has_oops && (i > TypeFunc::Parms);
#ifdef ASSERT
if (!(is_arraycopy ||
- BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(call) ||
(call->as_CallLeaf()->_name != nullptr &&
(strcmp(call->as_CallLeaf()->_name, "updateBytesCRC32") == 0 ||
strcmp(call->as_CallLeaf()->_name, "updateBytesCRC32C") == 0 ||
strcmp(call->as_CallLeaf()->_name, "updateBytesAdler32") == 0 ||
strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 ||
}
bool ConnectionGraph::has_oop_node_outs(Node* n) {
return n->has_out_with(Op_StoreP, Op_LoadP, Op_StoreN, Op_LoadN) ||
n->has_out_with(Op_GetAndSetP, Op_GetAndSetN, Op_CompareAndExchangeP, Op_CompareAndExchangeN) ||
! n->has_out_with(Op_CompareAndSwapP, Op_CompareAndSwapN, Op_WeakCompareAndSwapP, Op_WeakCompareAndSwapN) ||
- BarrierSet::barrier_set()->barrier_set_c2()->escape_has_out_with_unsafe_object(n);
}
// Returns unique pointed java object or null.
JavaObjectNode* ConnectionGraph::unique_java_object(Node *n) const {
// If the node was created after the escape computation we can't answer.
}
bool ConnectionGraph::has_oop_node_outs(Node* n) {
return n->has_out_with(Op_StoreP, Op_LoadP, Op_StoreN, Op_LoadN) ||
n->has_out_with(Op_GetAndSetP, Op_GetAndSetN, Op_CompareAndExchangeP, Op_CompareAndExchangeN) ||
! n->has_out_with(Op_CompareAndSwapP, Op_CompareAndSwapN, Op_WeakCompareAndSwapP, Op_WeakCompareAndSwapN);
}
// Returns unique pointed java object or null.
JavaObjectNode* ConnectionGraph::unique_java_object(Node *n) const {
// If the node was created after the escape computation we can't answer.
assert(result != nullptr, "new projection should have been allocated");
break;
}
} else if (proj_in->is_MemBar()) {
// Check if there is an array copy for a clone
! // Step over GC barrier when ReduceInitialCardMarks is disabled
- BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
- Node* control_proj_ac = bs->step_over_gc_barrier(proj_in->in(0));
if (control_proj_ac->is_Proj() && control_proj_ac->in(0)->is_ArrayCopy()) {
// Stop if it is a clone
ArrayCopyNode* ac = control_proj_ac->in(0)->as_ArrayCopy();
if (ac->may_modify(toop, igvn)) {
assert(result != nullptr, "new projection should have been allocated");
break;
}
} else if (proj_in->is_MemBar()) {
// Check if there is an array copy for a clone
! Node* control_proj_ac = proj_in->in(0);
if (control_proj_ac->is_Proj() && control_proj_ac->in(0)->is_ArrayCopy()) {
// Stop if it is a clone
ArrayCopyNode* ac = control_proj_ac->in(0)->as_ArrayCopy();
if (ac->may_modify(toop, igvn)) {
op == Op_StrComp || op == Op_CountPositives ||
op == Op_StrCompressedCopy || op == Op_StrInflatedCopy ||
op == Op_StrEquals || op == Op_VectorizedHashCode ||
op == Op_StrIndexOf || op == Op_StrIndexOfChar ||
op == Op_SubTypeCheck ||
! op == Op_ReinterpretS2HF ||
- BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(use))) {
n->dump();
use->dump();
assert(false, "EA: missing allocation reference path");
}
#endif
op == Op_StrComp || op == Op_CountPositives ||
op == Op_StrCompressedCopy || op == Op_StrInflatedCopy ||
op == Op_StrEquals || op == Op_VectorizedHashCode ||
op == Op_StrIndexOf || op == Op_StrIndexOfChar ||
op == Op_SubTypeCheck ||
! op == Op_ReinterpretS2HF)) {
n->dump();
use->dump();
assert(false, "EA: missing allocation reference path");
}
#endif
uint op = use->Opcode();
if ((use->in(MemNode::Memory) == n) &&
(op == Op_StrCompressedCopy || op == Op_StrInflatedCopy)) {
// They overwrite memory edge corresponding to destination array,
memnode_worklist.append_if_missing(use);
! } else if (!(BarrierSet::barrier_set()->barrier_set_c2()->is_gc_barrier_node(use) ||
- op == Op_AryEq || op == Op_StrComp || op == Op_CountPositives ||
op == Op_StrCompressedCopy || op == Op_StrInflatedCopy || op == Op_VectorizedHashCode ||
op == Op_StrEquals || op == Op_StrIndexOf || op == Op_StrIndexOfChar)) {
n->dump();
use->dump();
assert(false, "EA: missing memory path");
uint op = use->Opcode();
if ((use->in(MemNode::Memory) == n) &&
(op == Op_StrCompressedCopy || op == Op_StrInflatedCopy)) {
// They overwrite memory edge corresponding to destination array,
memnode_worklist.append_if_missing(use);
! } else if (!(op == Op_AryEq || op == Op_StrComp || op == Op_CountPositives ||
op == Op_StrCompressedCopy || op == Op_StrInflatedCopy || op == Op_VectorizedHashCode ||
op == Op_StrEquals || op == Op_StrIndexOf || op == Op_StrIndexOfChar)) {
n->dump();
use->dump();
assert(false, "EA: missing memory path");
< prev index next >