< prev index next >

src/hotspot/share/opto/macroArrayCopy.cpp

Print this page




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


< prev index next >