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 // |