1265 1266 // Compile time checks. If any of these checks cannot be verified at compile time, 1267 // we do not make a fast path for this call. Instead, we let the call remain as it 1268 // is. The checks we choose to mandate at compile time are: 1269 // 1270 // (1) src and dest are arrays. 1271 const Type* src_type = src->Value(&_igvn); 1272 const Type* dest_type = dest->Value(&_igvn); 1273 const TypeAryPtr* top_src = src_type->isa_aryptr(); 1274 const TypeAryPtr* top_dest = dest_type->isa_aryptr(); 1275 1276 BasicType src_elem = T_CONFLICT; 1277 BasicType dest_elem = T_CONFLICT; 1278 1279 if (top_dest != NULL && top_dest->klass() != NULL) { 1280 dest_elem = top_dest->klass()->as_array_klass()->element_type()->basic_type(); 1281 } 1282 if (top_src != NULL && top_src->klass() != NULL) { 1283 src_elem = top_src->klass()->as_array_klass()->element_type()->basic_type(); 1284 } 1285 if (src_elem == T_ARRAY || (src_elem == T_VALUETYPE && top_src->klass()->is_obj_array_klass())) { 1286 src_elem = T_OBJECT; 1287 } 1288 if (dest_elem == T_ARRAY || (dest_elem == T_VALUETYPE && top_dest->klass()->is_obj_array_klass())) { 1289 dest_elem = T_OBJECT; 1290 } 1291 1292 if (ac->is_arraycopy_validated() && 1293 dest_elem != T_CONFLICT && 1294 src_elem == T_CONFLICT) { 1295 src_elem = dest_elem; 1296 } 1297 1298 if (src_elem == T_CONFLICT || dest_elem == T_CONFLICT) { 1299 // Conservatively insert a memory barrier on all memory slices. 1300 // Do not let writes into the source float below the arraycopy. 1301 { 1302 Node* mem = ac->in(TypeFunc::Memory); 1303 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder); 1304 1305 merge_mem = MergeMemNode::make(mem); 1306 transform_later(merge_mem); 1307 } 1308 1309 RegionNode* slow_region = new RegionNode(1); | 1265 1266 // Compile time checks. If any of these checks cannot be verified at compile time, 1267 // we do not make a fast path for this call. Instead, we let the call remain as it 1268 // is. The checks we choose to mandate at compile time are: 1269 // 1270 // (1) src and dest are arrays. 1271 const Type* src_type = src->Value(&_igvn); 1272 const Type* dest_type = dest->Value(&_igvn); 1273 const TypeAryPtr* top_src = src_type->isa_aryptr(); 1274 const TypeAryPtr* top_dest = dest_type->isa_aryptr(); 1275 1276 BasicType src_elem = T_CONFLICT; 1277 BasicType dest_elem = T_CONFLICT; 1278 1279 if (top_dest != NULL && top_dest->klass() != NULL) { 1280 dest_elem = top_dest->klass()->as_array_klass()->element_type()->basic_type(); 1281 } 1282 if (top_src != NULL && top_src->klass() != NULL) { 1283 src_elem = top_src->klass()->as_array_klass()->element_type()->basic_type(); 1284 } 1285 if (src_elem == T_ARRAY) { 1286 src_elem = T_OBJECT; 1287 } else if (src_elem == T_VALUETYPE && top_src->klass()->is_obj_array_klass()) { 1288 ciObjArrayKlass* array_klass = top_src->klass()->as_obj_array_klass(); 1289 if (top_src->klass_is_exact()) { 1290 src_elem = T_OBJECT; 1291 } else { 1292 assert(!array_klass->storage_properties().is_null_free(), "klass should be exact"); 1293 src_elem = T_CONFLICT; // either flattened or not 1294 } 1295 } 1296 if (dest_elem == T_ARRAY) { 1297 dest_elem = T_OBJECT; 1298 } else if (dest_elem == T_VALUETYPE && top_dest->klass()->is_obj_array_klass()) { 1299 ciObjArrayKlass* array_klass = top_dest->klass()->as_obj_array_klass(); 1300 if (top_dest->klass_is_exact()) { 1301 dest_elem = T_OBJECT; 1302 } else { 1303 assert(!array_klass->storage_properties().is_null_free(), "klass should be exact"); 1304 dest_elem = T_CONFLICT; // either flattened or not 1305 } 1306 } 1307 1308 if (ac->is_arraycopy_validated() && 1309 dest_elem != T_CONFLICT && 1310 src_elem == T_CONFLICT) { 1311 src_elem = dest_elem; 1312 } 1313 1314 if (src_elem == T_CONFLICT || dest_elem == T_CONFLICT) { 1315 // Conservatively insert a memory barrier on all memory slices. 1316 // Do not let writes into the source float below the arraycopy. 1317 { 1318 Node* mem = ac->in(TypeFunc::Memory); 1319 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder); 1320 1321 merge_mem = MergeMemNode::make(mem); 1322 transform_later(merge_mem); 1323 } 1324 1325 RegionNode* slow_region = new RegionNode(1); |