diff -r a49a647afe9a -r ba764ed4b6f2 src/share/vm/opto/escape.cpp --- a/src/share/vm/opto/escape.cpp Fri Apr 11 09:56:35 2008 -0400 +++ b/src/share/vm/opto/escape.cpp Sun Apr 13 17:43:42 2008 -0400 @@ -1749,15 +1749,28 @@ add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); break; } + case Op_ConN: + { + // assume all narrow oop constants globally escape except for null + PointsToNode::EscapeState es; + if (phase->type(n) == TypeNarrowOop::NULL_PTR) + es = PointsToNode::NoEscape; + else + es = PointsToNode::GlobalEscape; + + add_node(n, PointsToNode::JavaObject, es, true); + break; + } case Op_LoadKlass: { add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true); break; } case Op_LoadP: + case Op_LoadN: { const Type *t = phase->type(n); - if (t->isa_ptr() == NULL) { + if (!t->isa_narrowoop() && t->isa_ptr() == NULL) { _processed.set(n->_idx); return; } @@ -1847,8 +1860,12 @@ break; } case Op_StoreP: + case Op_StoreN: { const Type *adr_type = phase->type(n->in(MemNode::Address)); + if (adr_type->isa_narrowoop()) { + adr_type = adr_type->is_narrowoop()->make_oopptr(); + } if (adr_type->isa_oopptr()) { add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false); } else { @@ -1870,8 +1887,12 @@ } case Op_StorePConditional: case Op_CompareAndSwapP: + case Op_CompareAndSwapN: { const Type *adr_type = phase->type(n->in(MemNode::Address)); + if (adr_type->isa_narrowoop()) { + adr_type = adr_type->is_narrowoop()->make_oopptr(); + } if (adr_type->isa_oopptr()) { add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false); } else { @@ -1927,6 +1948,8 @@ } case Op_CastPP: case Op_CheckCastPP: + case Op_EncodeP: + case Op_DecodeN: { int ti = n->in(1)->_idx; if (_nodes->adr_at(ti)->node_type() == PointsToNode::JavaObject) {