--- a/hotspot/src/share/vm/opto/escape.cpp Fri Apr 11 09:56:35 2008 -0400
+++ b/hotspot/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) {