--- old/src/hotspot/share/c1/c1_Runtime1.cpp 2018-03-08 13:22:56.946563378 +0100 +++ new/src/hotspot/share/c1/c1_Runtime1.cpp 2018-03-08 13:22:56.762565691 +0100 @@ -1402,13 +1402,8 @@ Klass* klass_oop = src->klass(); if (klass_oop != dst->klass()) return ac_failed; TypeArrayKlass* klass = TypeArrayKlass::cast(klass_oop); - const int l2es = klass->log2_element_size(); - const int ihs = klass->array_header_in_bytes() / wordSize; - char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es); - char* dst_addr = (char*) ((oopDesc**)dst + ihs) + (dst_pos << l2es); - // Potential problem: memmove is not guaranteed to be word atomic - // Revisit in Merlin - return HeapAccess<>::arraycopy(arrayOop(src), arrayOop(dst), src_addr, dst_addr, length << l2es) ? ac_ok : ac_failed; + klass->copy_array(arrayOop(src), src_pos, arrayOop(dst), dst_pos, length, Thread::current()); + return ac_ok; } else if (src->is_objArray() && dst->is_objArray()) { if (UseCompressedOops) { narrowOop *src_addr = objArrayOop(src)->obj_at_addr(src_pos);