--- old/src/share/vm/opto/memnode.cpp 2017-05-16 14:12:40.203373892 +0200 +++ new/src/share/vm/opto/memnode.cpp 2017-05-16 14:12:36.135355512 +0200 @@ -891,10 +891,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(); @@ -911,6 +912,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));