--- 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() ||