--- a/hotspot/src/share/vm/opto/memnode.cpp Thu Jun 01 18:48:34 2017 +0000
+++ b/hotspot/src/share/vm/opto/memnode.cpp Fri Jun 02 09:08:34 2017 +0200
@@ -908,10 +908,11 @@
ld->set_req(0, ld_alloc->in(0));
}
} else {
+ Node* src = ac->in(ArrayCopyNode::Src);
Node* addp = in(MemNode::Address)->clone();
assert(addp->in(AddPNode::Base) == addp->in(AddPNode::Address), "should be");
- addp->set_req(AddPNode::Base, ac->in(ArrayCopyNode::Src));
- addp->set_req(AddPNode::Address, ac->in(ArrayCopyNode::Src));
+ addp->set_req(AddPNode::Base, src);
+ addp->set_req(AddPNode::Address, src);
const TypeAryPtr* ary_t = phase->type(in(MemNode::Address))->isa_aryptr();
BasicType ary_elem = ary_t->klass()->as_array_klass()->element_type()->basic_type();
@@ -928,6 +929,12 @@
addp->set_req(AddPNode::Offset, offset);
ld->set_req(MemNode::Address, phase->transform(addp));
+ const TypeX *ld_offs_t = phase->type(offset)->isa_intptr_t();
+
+ if (!ac->as_ArrayCopy()->can_replace_dest_load_with_src_load(ld_offs_t->_lo, ld_offs_t->_hi, phase)) {
+ return NULL;
+ }
+
if (in(0) != NULL) {
assert(ac->in(0) != NULL, "alloc must have control");
ld->set_req(0, ac->in(0));