hotspot/src/share/vm/opto/escape.cpp
changeset 371 1aacedc9db7c
parent 360 21d113ecbf6a
child 589 a44a1e70a3e4
--- a/hotspot/src/share/vm/opto/escape.cpp	Thu Apr 17 07:16:03 2008 -0700
+++ b/hotspot/src/share/vm/opto/escape.cpp	Wed Apr 23 11:20:36 2008 -0700
@@ -215,6 +215,10 @@
   VectorSet visited(Thread::current()->resource_area());
   GrowableArray<uint>  worklist;
 
+#ifdef ASSERT
+  Node *orig_n = n;
+#endif
+
   n = n->uncast();
   PointsToNode  npt = _nodes->at_grow(n->_idx);
 
@@ -223,8 +227,14 @@
     ptset.set(n->_idx);
     return;
   }
-  assert(npt._node != NULL, "unregistered node");
-
+#ifdef ASSERT
+  if (npt._node == NULL) {
+    if (orig_n != n)
+      orig_n->dump();
+    n->dump();
+    assert(npt._node != NULL, "unregistered node");
+  }
+#endif
   worklist.push(n->_idx);
   while(worklist.length() > 0) {
     int ni = worklist.pop();
@@ -266,7 +276,7 @@
   PointsToNode *ptn = ptnode_adr(ni);
 
   // Mark current edges as visited and move deferred edges to separate array.
-  for (; i < ptn->edge_count(); i++) {
+  while (i < ptn->edge_count()) {
     uint t = ptn->edge_target(i);
 #ifdef ASSERT
     assert(!visited->test_set(t), "expecting no duplications");
@@ -276,6 +286,8 @@
     if (ptn->edge_type(i) == PointsToNode::DeferredEdge) {
       ptn->remove_edge(t, PointsToNode::DeferredEdge);
       deferred_edges->append(t);
+    } else {
+      i++;
     }
   }
   for (int next = 0; next < deferred_edges->length(); ++next) {
@@ -1716,6 +1728,8 @@
     }
     case Op_CastPP:
     case Op_CheckCastPP:
+    case Op_EncodeP:
+    case Op_DecodeN:
     {
       add_node(n, PointsToNode::LocalVar, PointsToNode::UnknownEscape, false);
       int ti = n->in(1)->_idx;
@@ -1743,12 +1757,6 @@
       add_node(n, PointsToNode::JavaObject, es, true);
       break;
     }
-    case Op_CreateEx:
-    {
-      // assume that all exception objects globally escape
-      add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
-      break;
-    }
     case Op_ConN:
     {
       // assume all narrow oop constants globally escape except for null
@@ -1761,6 +1769,12 @@
       add_node(n, PointsToNode::JavaObject, es, true);
       break;
     }
+    case Op_CreateEx:
+    {
+      // assume that all exception objects globally escape
+      add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
+      break;
+    }
     case Op_LoadKlass:
     {
       add_node(n, PointsToNode::JavaObject, PointsToNode::GlobalEscape, true);
@@ -1976,10 +1990,11 @@
       break;
     }
     case Op_LoadP:
+    case Op_LoadN:
     {
       const Type *t = phase->type(n);
 #ifdef ASSERT
-      if (t->isa_ptr() == NULL)
+      if (!t->isa_narrowoop() && t->isa_ptr() == NULL)
         assert(false, "Op_LoadP");
 #endif
 
@@ -2060,11 +2075,16 @@
       break;
     }
     case Op_StoreP:
+    case Op_StoreN:
     case Op_StorePConditional:
     case Op_CompareAndSwapP:
+    case Op_CompareAndSwapN:
     {
       Node *adr = n->in(MemNode::Address);
       const Type *adr_type = phase->type(adr);
+      if (adr_type->isa_narrowoop()) {
+        adr_type = adr_type->is_narrowoop()->make_oopptr();
+      }
 #ifdef ASSERT
       if (!adr_type->isa_oopptr())
         assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP");