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