1.1 --- a/src/share/vm/opto/replacednodes.cpp Mon May 01 10:54:10 2017 -0700 1.2 +++ b/src/share/vm/opto/replacednodes.cpp Wed Feb 15 17:26:37 2017 -0800 1.3 @@ -91,13 +91,17 @@ 1.4 } 1.5 1.6 // Perfom node replacement (used when returning to caller) 1.7 -void ReplacedNodes::apply(Node* n) { 1.8 +void ReplacedNodes::apply(Node* n, uint idx) { 1.9 if (is_empty()) { 1.10 return; 1.11 } 1.12 for (int i = 0; i < _replaced_nodes->length(); i++) { 1.13 ReplacedNode replaced = _replaced_nodes->at(i); 1.14 - n->replace_edge(replaced.initial(), replaced.improved()); 1.15 + // Only apply if improved node was created in a callee to avoid 1.16 + // issues with irreducible loops in the caller 1.17 + if (replaced.improved()->_idx >= idx) { 1.18 + n->replace_edge(replaced.initial(), replaced.improved()); 1.19 + } 1.20 } 1.21 } 1.22