src/share/vm/opto/chaitin.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/chaitin.cpp	Wed Apr 22 15:01:16 2009
--- new/src/share/vm/opto/chaitin.cpp	Wed Apr 22 15:01:16 2009

*** 1421,1441 **** --- 1421,1457 ---- // See if this happens to be a base. // NOTE: we use TypePtr instead of TypeOopPtr because we can have // pointers derived from NULL! These are always along paths that // can't happen at run-time but the optimizer cannot deduce it so // we have to handle it gracefully. + assert(!derived->bottom_type()->isa_narrowoop() || + derived->bottom_type()->make_ptr()->is_ptr()->_offset == 0, "sanity"); const TypePtr *tj = derived->bottom_type()->isa_ptr(); // If its an OOP with a non-zero offset, then it is derived. ! if( tj == NULL || tj->_offset == 0 ) { derived_base_map[derived->_idx] = derived; return derived; } // Derived is NULL+offset? Base is NULL! if( derived->is_Con() ) { ! Node *base = new (C, 1) ConPNode( TypePtr::NULL_PTR ); uint no_lidx = 0; // an unmatched constant in debug info has no LRG _names.extend(base->_idx, no_lidx); ! Node *base = _matcher.mach_null(); + assert(base != NULL, "sanity"); + if (base->in(0) == NULL) { + // Initialize it once and make it shared: + // set control to _root and place it into Start block + // (where top() node is placed). + base->init_req(0, _cfg._root); + Block *startb = _cfg._bbs[C->top()->_idx]; + startb->_nodes.insert(startb->find_node(C->top()), base ); + _cfg._bbs.map( base->_idx, startb ); + assert (n2lidx(base) == 0, "should not have LRG yet"); + } + if (n2lidx(base) == 0) { + new_lrg(base, maxlrg++); + } + assert(base->in(0) == _cfg._root && + _cfg._bbs[base->_idx] == _cfg._bbs[C->top()->_idx], "base NULL should be shared"); derived_base_map[derived->_idx] = base; return base; } // Check for AddP-related opcodes
*** 1458,1470 **** --- 1474,1490 ---- derived_base_map[derived->_idx] = base; return base; } // Now we see we need a base-Phi here to merge the bases ! base = new (C, derived->req()) PhiNode( derived->in(0), base->bottom_type() ); for( i = 1; i < derived->req(); i++ ) ! const Type *t = base->bottom_type(); + base = new (C, derived->req()) PhiNode( derived->in(0), t ); + for( i = 1; i < derived->req(); i++ ) { base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg)); + t = t->meet(base->in(i)->bottom_type()); + } + base->as_Phi()->set_type(t); // Search the current block for an existing base-Phi Block *b = _cfg._bbs[derived->_idx]; for( i = 1; i <= b->end_idx(); i++ ) {// Search for matching Phi Node *phi = b->_nodes[i];
*** 1558,1567 **** --- 1578,1589 ---- while ((neighbor = elements.next()) != 0) { // Find reaching DEF for base and derived values // This works because we are still in SSA during this call. Node *derived = lrgs(neighbor)._def; const TypePtr *tj = derived->bottom_type()->isa_ptr(); + assert(!derived->bottom_type()->isa_narrowoop() || + derived->bottom_type()->make_ptr()->is_ptr()->_offset == 0, "sanity"); // If its an OOP with a non-zero offset, then it is derived. if( tj && tj->_offset != 0 && tj->isa_oop_ptr() ) { Node *base = find_base_for_derived( derived_base_map, derived, maxlrg ); assert( base->_idx < _names.Size(), "" ); // Add reaching DEFs of derived pointer and base pointer as a

src/share/vm/opto/chaitin.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File