src/share/vm/opto/escape.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
7146442 Cdiff src/share/vm/opto/escape.cpp
src/share/vm/opto/escape.cpp
Print this page
*** 2033,2078 ****
if (ini != NULL) {
BasicType ft = UseCompressedOops ? T_NARROWOOP : T_OBJECT;
Node* store = ini->find_captured_store(offset, type2aelembytes(ft), phase);
if (store != NULL && store->is_Store()) {
value = store->in(MemNode::ValueIn);
! } else if (ptn->edge_count() > 0) { // Are there oop stores?
! // Check for a store which follows allocation without branches.
// For example, a volatile field store is not collected
! // by Initialize node. TODO: it would be nice to use idom() here.
//
! // Search all references to the same field which use different
! // AddP nodes, for example, in the next case:
! //
! // Point p[] = new Point[1];
! // if ( x ) { p[0] = new Point(); p[0].x = x; }
! // if ( p[0] != null ) { y = p[0].x; } // has CastPP
! //
! for (uint next = ei; (next < ae_cnt) && (value == NULL); next++) {
! uint fpi = pta->edge_target(next); // Field (AddP)
! PointsToNode *ptf = ptnode_adr(fpi);
! if (ptf->offset() == offset) {
! Node* nf = ptf->_node;
! for (DUIterator_Fast imax, i = nf->fast_outs(imax); i < imax; i++) {
! store = nf->fast_out(i);
! if (store->is_Store() && store->in(0) != NULL) {
! Node* ctrl = store->in(0);
! while(!(ctrl == ini || ctrl == alloc || ctrl == NULL ||
! ctrl == C->root() || ctrl == C->top() || ctrl->is_Region() ||
! ctrl->is_IfTrue() || ctrl->is_IfFalse())) {
! ctrl = ctrl->in(0);
}
- if (ctrl == ini || ctrl == alloc) {
- value = store->in(MemNode::ValueIn);
- break;
}
- }
- }
- }
- }
- }
- }
if (value == NULL || value != ptnode_adr(value->_idx)->_node) {
// A field's initializing value was not recorded. Add NULL.
add_edge_from_fields(alloc->_idx, null_idx, offset);
}
}
--- 2033,2052 ----
if (ini != NULL) {
BasicType ft = UseCompressedOops ? T_NARROWOOP : T_OBJECT;
Node* store = ini->find_captured_store(offset, type2aelembytes(ft), phase);
if (store != NULL && store->is_Store()) {
value = store->in(MemNode::ValueIn);
! } else {
! // There could be initializing stores which follow allocation.
// For example, a volatile field store is not collected
! // by Initialize node.
//
! // Need to check for dependent loads to separate such stores from
! // stores which follow loads. For now, add initial value NULL so
! // that compare pointers optimization works correctly.
}
}
if (value == NULL || value != ptnode_adr(value->_idx)->_node) {
// A field's initializing value was not recorded. Add NULL.
add_edge_from_fields(alloc->_idx, null_idx, offset);
}
}
src/share/vm/opto/escape.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File