< prev index next >

src/hotspot/share/opto/macroArrayCopy.cpp

Print this page

        

*** 1280,1294 **** dest_elem = top_dest->klass()->as_array_klass()->element_type()->basic_type(); } if (top_src != NULL && top_src->klass() != NULL) { src_elem = top_src->klass()->as_array_klass()->element_type()->basic_type(); } ! if (src_elem == T_ARRAY || (src_elem == T_VALUETYPE && top_src->klass()->is_obj_array_klass())) { src_elem = T_OBJECT; } ! if (dest_elem == T_ARRAY || (dest_elem == T_VALUETYPE && top_dest->klass()->is_obj_array_klass())) { dest_elem = T_OBJECT; } if (ac->is_arraycopy_validated() && dest_elem != T_CONFLICT && src_elem == T_CONFLICT) { --- 1280,1308 ---- dest_elem = top_dest->klass()->as_array_klass()->element_type()->basic_type(); } if (top_src != NULL && top_src->klass() != NULL) { src_elem = top_src->klass()->as_array_klass()->element_type()->basic_type(); } ! if (src_elem == T_ARRAY) { src_elem = T_OBJECT; + } else if (src_elem == T_VALUETYPE && top_src->klass()->is_obj_array_klass()) { + ciObjArrayKlass* array_klass = top_src->klass()->as_obj_array_klass(); + if (array_klass->storage_properties().is_null_free()) { + src_elem = T_OBJECT; + } else { + src_elem = T_CONFLICT; // either flattened or not + } } ! if (dest_elem == T_ARRAY) { dest_elem = T_OBJECT; + } else if (dest_elem == T_VALUETYPE && top_dest->klass()->is_obj_array_klass()) { + ciObjArrayKlass* array_klass = top_dest->klass()->as_obj_array_klass(); + if (array_klass->storage_properties().is_null_free()) { + dest_elem = T_OBJECT; + } else { + dest_elem = T_CONFLICT; // either flattened or not + } } if (ac->is_arraycopy_validated() && dest_elem != T_CONFLICT && src_elem == T_CONFLICT) {
< prev index next >