< prev index next >
src/hotspot/share/opto/loopnode.cpp
Print this page
@@ -1591,16 +1591,22 @@
if (stride > 0) {
new_limit = igvn->transform(new AddINode(min, iv_phi));
} else {
new_limit = igvn->transform(new SubINode(iv_phi, min));
}
- Node* cmp = inner_cle->cmp_node()->clone();
- igvn->replace_input_of(cmp, 2, new_limit);
- Node* bol = inner_cle->in(CountedLoopEndNode::TestValue)->clone();
- cmp->set_req(2, limit);
- bol->set_req(1, igvn->transform(cmp));
- igvn->replace_input_of(outer_loop_end(), 1, igvn->transform(bol));
+ Node* inner_cmp = inner_cle->cmp_node();
+ Node* outer_cmp = inner_cmp;
+ Node* inner_bol = inner_cle->in(CountedLoopEndNode::TestValue);
+ Node* outer_bol = inner_bol;
+ // cmp node for inner loop may be shared
+ inner_cmp = inner_cmp->clone();
+ inner_cmp->set_req(2, new_limit);
+ inner_bol = inner_bol->clone();
+ inner_bol->set_req(1, igvn->transform(inner_cmp));
+ igvn->replace_input_of(inner_cle, CountedLoopEndNode::TestValue, igvn->transform(inner_bol));
+ // Set the outer loop's exit condition too
+ igvn->replace_input_of(outer_loop_end(), 1, outer_bol);
} else {
assert(false, "should be able to adjust outer loop");
IfNode* outer_le = outer_loop_end();
Node* iff = igvn->transform(new IfNode(outer_le->in(0), outer_le->in(1), outer_le->_prob, outer_le->_fcnt));
igvn->replace_node(outer_le, iff);
< prev index next >