diff -r 3c15b4a3bf4d -r b6e5ad2f18d5 hotspot/src/share/vm/opto/ifnode.cpp --- a/hotspot/src/share/vm/opto/ifnode.cpp Mon May 11 09:44:07 2015 +0200 +++ b/hotspot/src/share/vm/opto/ifnode.cpp Tue May 12 10:27:50 2015 +0200 @@ -973,21 +973,25 @@ assert(init_n->Opcode() == Op_ConvI2L, "unexpected first node"); Node* new_n = igvn->C->conv_I2X_index(igvn, l, array_size); - for (uint j = 2; j < stack.size(); j++) { - Node* n = stack.node_at(j); - Node* clone = n->clone(); - int rep = clone->replace_edge(init_n, new_n); + // The type of the ConvI2L may be widen and so the new + // ConvI2L may not be better than an existing ConvI2L + if (new_n != init_n) { + for (uint j = 2; j < stack.size(); j++) { + Node* n = stack.node_at(j); + Node* clone = n->clone(); + int rep = clone->replace_edge(init_n, new_n); + assert(rep > 0, "can't find expected node?"); + clone = igvn->transform(clone); + init_n = n; + new_n = clone; + } + igvn->hash_delete(use); + int rep = use->replace_edge(init_n, new_n); assert(rep > 0, "can't find expected node?"); - clone = igvn->transform(clone); - init_n = n; - new_n = clone; - } - igvn->hash_delete(use); - int rep = use->replace_edge(init_n, new_n); - assert(rep > 0, "can't find expected node?"); - igvn->transform(use); - if (init_n->outcnt() == 0) { - igvn->_worklist.push(init_n); + igvn->transform(use); + if (init_n->outcnt() == 0) { + igvn->_worklist.push(init_n); + } } } } else if (use->in(0) == NULL && (igvn->type(use)->isa_long() ||