< prev index next >

src/hotspot/share/opto/loopnode.hpp

Print this page
rev 49816 : 8201532: Update idom to get correct dom depth calculation
Summary: Assert due to dom depth calculation on old idom
Reviewed-by:

@@ -855,26 +855,34 @@
   Node **_idom;                 // Array of immediate dominators
   uint *_dom_depth;           // Used for fast LCA test
   GrowableArray<uint>* _dom_stk; // For recomputation of dom depth
 
   Node* idom_no_update(Node* d) const {
-    assert(d->_idx < _idom_size, "oob");
-    Node* n = _idom[d->_idx];
+    return idom_no_update(d->_idx);
+  }
+
+  Node* idom_no_update(uint didx) const {
+    assert(didx < _idom_size, "oob");
+    Node* n = _idom[didx];
     assert(n != NULL,"Bad immediate dominator info.");
     while (n->in(0) == NULL) {  // Skip dead CFG nodes
-      //n = n->in(1);
       n = (Node*)(((intptr_t)_nodes[n->_idx]) & ~1);
       assert(n != NULL,"Bad immediate dominator info.");
     }
     return n;
   }
+
   Node *idom(Node* d) const {
-    uint didx = d->_idx;
-    Node *n = idom_no_update(d);
+    return idom(d->_idx);
+  }
+
+  Node *idom(uint didx) const {
+    Node *n = idom_no_update(didx);
     _idom[didx] = n;            // Lazily remove dead CFG nodes from table.
     return n;
   }
+
   uint dom_depth(Node* d) const {
     guarantee(d != NULL, "Null dominator info.");
     guarantee(d->_idx < _idom_size, "");
     return _dom_depth[d->_idx];
   }
< prev index next >