--- a/hotspot/src/share/vm/opto/compile.cpp Fri Apr 17 17:39:19 2015 -0700
+++ b/hotspot/src/share/vm/opto/compile.cpp Tue Mar 24 10:25:09 2015 +0100
@@ -2811,9 +2811,38 @@
break;
}
-#ifdef _LP64
- case Op_CastPP:
- if (n->in(1)->is_DecodeN() && Matcher::gen_narrow_oop_implicit_null_checks()) {
+ case Op_CastPP: {
+ // Remove CastPP nodes to gain more freedom during scheduling but
+ // keep the dependency they encode as control or precedence edges
+ // (if control is set already) on memory operations. Some CastPP
+ // nodes don't have a control (don't carry a dependency): skip
+ // those.
+ if (n->in(0) != NULL) {
+ ResourceMark rm;
+ Unique_Node_List wq;
+ wq.push(n);
+ for (uint next = 0; next < wq.size(); ++next) {
+ Node *m = wq.at(next);
+ for (DUIterator_Fast imax, i = m->fast_outs(imax); i < imax; i++) {
+ Node* use = m->fast_out(i);
+ if (use->is_Mem() || use->is_EncodeNarrowPtr()) {
+ use->ensure_control_or_add_prec(n->in(0));
+ } else if (use->in(0) == NULL) {
+ switch(use->Opcode()) {
+ case Op_AddP:
+ case Op_DecodeN:
+ case Op_DecodeNKlass:
+ case Op_CheckCastPP:
+ case Op_CastPP:
+ wq.push(use);
+ break;
+ }
+ }
+ }
+ }
+ }
+ const bool is_LP64 = LP64_ONLY(true) NOT_LP64(false);
+ if (is_LP64 && n->in(1)->is_DecodeN() && Matcher::gen_narrow_oop_implicit_null_checks()) {
Node* in1 = n->in(1);
const Type* t = n->bottom_type();
Node* new_in1 = in1->clone();
@@ -2846,9 +2875,15 @@
if (in1->outcnt() == 0) {
in1->disconnect_inputs(NULL, this);
}
+ } else {
+ n->subsume_by(n->in(1), this);
+ if (n->outcnt() == 0) {
+ n->disconnect_inputs(NULL, this);
+ }
}
break;
-
+ }
+#ifdef _LP64
case Op_CmpP:
// Do this transformation here to preserve CmpPNode::sub() and
// other TypePtr related Ideal optimizations (for example, ptr nullness).