237 // We don't know if arguments are arrays 238 return false; 239 } 240 241 BasicType src_elem = ary_src->klass()->as_array_klass()->element_type()->basic_type(); 242 BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type(); 243 if (src_elem == T_ARRAY) src_elem = T_OBJECT; 244 if (dest_elem == T_ARRAY) dest_elem = T_OBJECT; 245 246 if (src_elem != dest_elem || dest_elem == T_VOID) { 247 // We don't know if arguments are arrays of the same type 248 return false; 249 } 250 251 if (dest_elem == T_OBJECT && (!is_alloc_tightly_coupled() || !GraphKit::use_ReduceInitialCardMarks())) { 252 // It's an object array copy but we can't emit the card marking 253 // that is needed 254 return false; 255 } 256 257 value_type = ary_src->elem(); 258 259 base_src = src; 260 base_dest = dest; 261 262 uint shift = exact_log2(type2aelembytes(dest_elem)); 263 uint header = arrayOopDesc::base_offset_in_bytes(dest_elem); 264 265 adr_src = src; 266 adr_dest = dest; 267 268 src_offset = Compile::conv_I2X_index(phase, src_offset, ary_src->size()); 269 dest_offset = Compile::conv_I2X_index(phase, dest_offset, ary_dest->size()); 270 271 Node* src_scale = phase->transform(new LShiftXNode(src_offset, phase->intcon(shift))); 272 Node* dest_scale = phase->transform(new LShiftXNode(dest_offset, phase->intcon(shift))); 273 274 adr_src = phase->transform(new AddPNode(base_src, adr_src, src_scale)); 275 adr_dest = phase->transform(new AddPNode(base_dest, adr_dest, dest_scale)); 276 | 237 // We don't know if arguments are arrays 238 return false; 239 } 240 241 BasicType src_elem = ary_src->klass()->as_array_klass()->element_type()->basic_type(); 242 BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type(); 243 if (src_elem == T_ARRAY) src_elem = T_OBJECT; 244 if (dest_elem == T_ARRAY) dest_elem = T_OBJECT; 245 246 if (src_elem != dest_elem || dest_elem == T_VOID) { 247 // We don't know if arguments are arrays of the same type 248 return false; 249 } 250 251 if (dest_elem == T_OBJECT && (!is_alloc_tightly_coupled() || !GraphKit::use_ReduceInitialCardMarks())) { 252 // It's an object array copy but we can't emit the card marking 253 // that is needed 254 return false; 255 } 256 257 if (UseShenandoahGC && dest_elem == T_OBJECT) { 258 // TODO: Disabled. We need to resolve the loaded values before storing them into 259 // the copy object. Or call out to the clone barrier that takes care of it. 260 return false; 261 } 262 263 value_type = ary_src->elem(); 264 265 base_src = src; 266 base_dest = dest; 267 268 uint shift = exact_log2(type2aelembytes(dest_elem)); 269 uint header = arrayOopDesc::base_offset_in_bytes(dest_elem); 270 271 adr_src = src; 272 adr_dest = dest; 273 274 src_offset = Compile::conv_I2X_index(phase, src_offset, ary_src->size()); 275 dest_offset = Compile::conv_I2X_index(phase, dest_offset, ary_dest->size()); 276 277 Node* src_scale = phase->transform(new LShiftXNode(src_offset, phase->intcon(shift))); 278 Node* dest_scale = phase->transform(new LShiftXNode(dest_offset, phase->intcon(shift))); 279 280 adr_src = phase->transform(new AddPNode(base_src, adr_src, src_scale)); 281 adr_dest = phase->transform(new AddPNode(base_dest, adr_dest, dest_scale)); 282 |