< 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,106 **** _replaced_nodes->clear(); } } // Perfom node replacement (used when returning to caller) ! void ReplacedNodes::apply(Node* n) { if (is_empty()) { return; } for (int i = 0; i < _replaced_nodes->length(); i++) { ReplacedNode replaced = _replaced_nodes->at(i); 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); --- 89,110 ---- _replaced_nodes->clear(); } } // Perfom node replacement (used when returning to caller) ! 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 >