--- old/src/share/vm/opto/library_call.cpp 2014-09-01 11:49:30.305532299 +0200 +++ new/src/share/vm/opto/library_call.cpp 2014-09-01 11:49:30.089681756 +0200 @@ -3859,7 +3859,7 @@ Node* orig_tail = _gvn.transform(new SubINode(orig_length, start)); Node* moved = generate_min_max(vmIntrinsics::_min, orig_tail, length); - newcopy = new_array(klass_node, length, 0); // no argments to push + newcopy = new_array(klass_node, length, 0); // no arguments to push // Generate a direct call to the right arraycopy function(s). // We know the copy is disjoint but we might not know if the @@ -3869,7 +3869,8 @@ Node* alloc = tightly_coupled_allocation(newcopy, NULL); - ArrayCopyNode* ac = ArrayCopyNode::make(this, true, original, start, newcopy, intcon(0), moved, alloc != NULL); + ArrayCopyNode* ac = ArrayCopyNode::make(this, true, original, start, newcopy, intcon(0), moved, alloc != NULL, + load_object_klass(original), klass_node); if (!is_copyOfRange) { ac->set_copyof(); } else { @@ -4792,8 +4793,8 @@ // Create LoadRange and LoadKlass nodes for use during macro expansion here // so the compiler has a chance to eliminate them: during macro expansion, // we have to set their control (CastPP nodes are eliminated). - load_array_length(src), load_array_length(dest), - load_object_klass(src), load_object_klass(dest)); + load_object_klass(src), load_object_klass(dest), + load_array_length(src), load_array_length(dest)); if (notest) { ac->set_arraycopy_notest();