< 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 >