src/hotspot/share/opto/loopTransform.cpp
changeset 58589 45a085445a8c
parent 58354 e6b5ec45ab9e
child 58679 9c3209ff7550
child 59022 ff1887930406
--- a/src/hotspot/share/opto/loopTransform.cpp	Mon Oct 14 14:40:02 2019 -0700
+++ b/src/hotspot/share/opto/loopTransform.cpp	Fri Oct 11 16:52:18 2019 +0800
@@ -3129,6 +3129,13 @@
     // We also need to replace the original limit to collapse loop exit.
     Node* cmp = cl->loopexit()->cmp_node();
     assert(cl->limit() == cmp->in(2), "sanity");
+    // Duplicate cmp node if it has other users
+    if (cmp->outcnt() > 1) {
+      cmp = cmp->clone();
+      cmp = phase->_igvn.register_new_node_with_optimizer(cmp);
+      BoolNode *bol = cl->loopexit()->in(CountedLoopEndNode::TestValue)->as_Bool();
+      phase->_igvn.replace_input_of(bol, 1, cmp); // put bol on worklist
+    }
     phase->_igvn._worklist.push(cmp->in(2)); // put limit on worklist
     phase->_igvn.replace_input_of(cmp, 2, exact_limit); // put cmp on worklist
   }