< prev index next >

src/share/vm/opto/replacednodes.cpp

Print this page
rev 8216 : maybe fix + debug
rev 8221 : 8174164: SafePointNode::_replaced_nodes breaks with irreducible loops
Reviewed-by: kvn

@@ -89,18 +89,22 @@
     _replaced_nodes->clear();
   }
 }
 
 // Perfom node replacement (used when returning to caller)
-void ReplacedNodes::apply(Node* n) {
+void ReplacedNodes::apply(Node* n, uint idx) {
   if (is_empty()) {
     return;
   }
   for (int i = 0; i < _replaced_nodes->length(); i++) {
     ReplacedNode replaced = _replaced_nodes->at(i);
+    // Only apply if improved node was created in a callee to avoid
+    // issues with irreducible loops in the caller
+    if (replaced.improved()->_idx >= idx) {
     n->replace_edge(replaced.initial(), replaced.improved());
   }
+  }
 }
 
 static void enqueue_use(Node* n, Node* use, Unique_Node_List& work) {
   if (use->is_Phi()) {
     Node* r = use->in(0);
< prev index next >