src/hotspot/share/ci/bcEscapeAnalyzer.cpp
changeset 54052 a2d3ca8062b9
parent 53199 11464bf82dce
child 58273 08a5148e7c4e
equal deleted inserted replaced
54051:9a1dd1203a4f 54052:a2d3ca8062b9
  1195         worklist.push(succ);
  1195         worklist.push(succ);
  1196     }
  1196     }
  1197   }
  1197   }
  1198 }
  1198 }
  1199 
  1199 
  1200 bool BCEscapeAnalyzer::do_analysis() {
  1200 void BCEscapeAnalyzer::do_analysis() {
  1201   Arena* arena = CURRENT_ENV->arena();
  1201   Arena* arena = CURRENT_ENV->arena();
  1202   // identify basic blocks
  1202   // identify basic blocks
  1203   _methodBlocks = _method->get_method_blocks();
  1203   _methodBlocks = _method->get_method_blocks();
  1204 
  1204 
  1205   iterate_blocks(arena);
  1205   iterate_blocks(arena);
  1206   // TEMPORARY
       
  1207   return true;
       
  1208 }
  1206 }
  1209 
  1207 
  1210 vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
  1208 vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
  1211   vmIntrinsics::ID iid = method()->intrinsic_id();
  1209   vmIntrinsics::ID iid = method()->intrinsic_id();
  1212 
       
  1213   if (iid == vmIntrinsics::_getClass ||
  1210   if (iid == vmIntrinsics::_getClass ||
  1214       iid == vmIntrinsics::_hashCode)
  1211       iid == vmIntrinsics::_hashCode) {
  1215     return iid;
  1212     return iid;
  1216   else
  1213   } else {
  1217     return vmIntrinsics::_none;
  1214     return vmIntrinsics::_none;
  1218 }
  1215   }
  1219 
  1216 }
  1220 bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
  1217 
       
  1218 void BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
  1221   switch (iid) {
  1219   switch (iid) {
  1222   case vmIntrinsics::_getClass:
  1220     case vmIntrinsics::_getClass:
  1223     _return_local = false;
  1221       _return_local = false;
  1224     break;
  1222       _return_allocated = false;
  1225   case vmIntrinsics::_hashCode:
  1223       break;
  1226     // initialized state is correct
  1224     case vmIntrinsics::_hashCode:
  1227     break;
  1225       // initialized state is correct
       
  1226       break;
  1228   default:
  1227   default:
  1229     assert(false, "unexpected intrinsic");
  1228     assert(false, "unexpected intrinsic");
  1230   }
  1229   }
  1231   return true;
       
  1232 }
  1230 }
  1233 
  1231 
  1234 void BCEscapeAnalyzer::initialize() {
  1232 void BCEscapeAnalyzer::initialize() {
  1235   int i;
  1233   int i;
  1236 
  1234 
  1297   assert(!methodData()->has_escape_info(), "do not overwrite escape info");
  1295   assert(!methodData()->has_escape_info(), "do not overwrite escape info");
  1298 
  1296 
  1299   vmIntrinsics::ID iid = known_intrinsic();
  1297   vmIntrinsics::ID iid = known_intrinsic();
  1300 
  1298 
  1301   // check if method can be analyzed
  1299   // check if method can be analyzed
  1302   if (iid ==  vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized()
  1300   if (iid == vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized()
  1303       || _level > MaxBCEAEstimateLevel
  1301       || _level > MaxBCEAEstimateLevel
  1304       || method()->code_size() > MaxBCEAEstimateSize)) {
  1302       || method()->code_size() > MaxBCEAEstimateSize)) {
  1305     if (BCEATraceLevel >= 1) {
  1303     if (BCEATraceLevel >= 1) {
  1306       tty->print("Skipping method because: ");
  1304       tty->print("Skipping method because: ");
  1307       if (method()->is_abstract())
  1305       if (method()->is_abstract())
  1330       tty->print(" intrinsic");
  1328       tty->print(" intrinsic");
  1331     method()->print_short_name();
  1329     method()->print_short_name();
  1332     tty->print_cr(" (%d bytes)", method()->code_size());
  1330     tty->print_cr(" (%d bytes)", method()->code_size());
  1333   }
  1331   }
  1334 
  1332 
  1335   bool success;
       
  1336 
       
  1337   initialize();
  1333   initialize();
  1338 
  1334 
  1339   // Do not scan method if it has no object parameters and
  1335   // Do not scan method if it has no object parameters and
  1340   // does not returns an object (_return_allocated is set in initialize()).
  1336   // does not returns an object (_return_allocated is set in initialize()).
  1341   if (_arg_local.Size() == 0 && !_return_allocated) {
  1337   if (_arg_local.Size() == 0 && !_return_allocated) {
  1347     methodData()->set_eflag(MethodData::estimated);
  1343     methodData()->set_eflag(MethodData::estimated);
  1348     return;
  1344     return;
  1349   }
  1345   }
  1350 
  1346 
  1351   if (iid != vmIntrinsics::_none)
  1347   if (iid != vmIntrinsics::_none)
  1352     success = compute_escape_for_intrinsic(iid);
  1348     compute_escape_for_intrinsic(iid);
  1353   else {
  1349   else {
  1354     success = do_analysis();
  1350     do_analysis();
  1355   }
  1351   }
  1356 
  1352 
  1357   // don't store interprocedural escape information if it introduces
  1353   // don't store interprocedural escape information if it introduces
  1358   // dependencies or if method data is empty
  1354   // dependencies or if method data is empty
  1359   //
  1355   //