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 (array_klass->storage_properties().is_null_free()) { 1290 src_elem = T_OBJECT; 1291 } else { 1292 src_elem = T_CONFLICT; // either flattened or not 1293 } 1294 } 1295 if (dest_elem == T_ARRAY) { 1296 dest_elem = T_OBJECT; 1297 } else if (dest_elem == T_VALUETYPE && top_dest->klass()->is_obj_array_klass()) { 1298 ciObjArrayKlass* array_klass = top_dest->klass()->as_obj_array_klass(); 1299 if (array_klass->storage_properties().is_null_free()) { 1300 dest_elem = T_OBJECT; 1301 } else { 1302 dest_elem = T_CONFLICT; // either flattened or not 1303 } 1304 } 1305 1306 if (ac->is_arraycopy_validated() && 1307 dest_elem != T_CONFLICT && 1308 src_elem == T_CONFLICT) { 1309 src_elem = dest_elem; 1310 } 1311 1312 if (src_elem == T_CONFLICT || dest_elem == T_CONFLICT) { 1313 // Conservatively insert a memory barrier on all memory slices. 1314 // Do not let writes into the source float below the arraycopy. 1315 { 1316 Node* mem = ac->in(TypeFunc::Memory); 1317 insert_mem_bar(&ctrl, &mem, Op_MemBarCPUOrder); 1318 1319 merge_mem = MergeMemNode::make(mem); 1320 transform_later(merge_mem); 1321 } 1322 1323 RegionNode* slow_region = new RegionNode(1); |