1168 worklist.push(succ); |
1168 worklist.push(succ); |
1169 } |
1169 } |
1170 } |
1170 } |
1171 } |
1171 } |
1172 |
1172 |
1173 bool BCEscapeAnalyzer::do_analysis() { |
1173 void BCEscapeAnalyzer::do_analysis() { |
1174 Arena* arena = CURRENT_ENV->arena(); |
1174 Arena* arena = CURRENT_ENV->arena(); |
1175 // identify basic blocks |
1175 // identify basic blocks |
1176 _methodBlocks = _method->get_method_blocks(); |
1176 _methodBlocks = _method->get_method_blocks(); |
1177 |
1177 |
1178 iterate_blocks(arena); |
1178 iterate_blocks(arena); |
1179 // TEMPORARY |
|
1180 return true; |
|
1181 } |
1179 } |
1182 |
1180 |
1183 vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() { |
1181 vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() { |
1184 vmIntrinsics::ID iid = method()->intrinsic_id(); |
1182 vmIntrinsics::ID iid = method()->intrinsic_id(); |
1185 |
|
1186 if (iid == vmIntrinsics::_getClass || |
1183 if (iid == vmIntrinsics::_getClass || |
1187 iid == vmIntrinsics::_fillInStackTrace || |
1184 iid == vmIntrinsics::_fillInStackTrace || |
1188 iid == vmIntrinsics::_hashCode) |
1185 iid == vmIntrinsics::_hashCode) { |
1189 return iid; |
1186 return iid; |
1190 else |
1187 } else { |
1191 return vmIntrinsics::_none; |
1188 return vmIntrinsics::_none; |
1192 } |
1189 } |
1193 |
1190 } |
1194 bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) { |
1191 |
|
1192 void BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) { |
1195 ArgumentMap arg; |
1193 ArgumentMap arg; |
1196 arg.clear(); |
1194 arg.clear(); |
1197 switch (iid) { |
1195 switch (iid) { |
1198 case vmIntrinsics::_getClass: |
1196 case vmIntrinsics::_getClass: |
1199 _return_local = false; |
1197 _return_local = false; |
1200 break; |
1198 _return_allocated = false; |
1201 case vmIntrinsics::_fillInStackTrace: |
1199 break; |
1202 arg.set(0); // 'this' |
1200 case vmIntrinsics::_fillInStackTrace: |
1203 set_returned(arg); |
1201 arg.set(0); // 'this' |
1204 break; |
1202 set_returned(arg); |
1205 case vmIntrinsics::_hashCode: |
1203 break; |
1206 // initialized state is correct |
1204 case vmIntrinsics::_hashCode: |
1207 break; |
1205 // initialized state is correct |
|
1206 break; |
1208 default: |
1207 default: |
1209 assert(false, "unexpected intrinsic"); |
1208 assert(false, "unexpected intrinsic"); |
1210 } |
1209 } |
1211 return true; |
|
1212 } |
1210 } |
1213 |
1211 |
1214 void BCEscapeAnalyzer::initialize() { |
1212 void BCEscapeAnalyzer::initialize() { |
1215 int i; |
1213 int i; |
1216 |
1214 |
1277 assert(!methodData()->has_escape_info(), "do not overwrite escape info"); |
1275 assert(!methodData()->has_escape_info(), "do not overwrite escape info"); |
1278 |
1276 |
1279 vmIntrinsics::ID iid = known_intrinsic(); |
1277 vmIntrinsics::ID iid = known_intrinsic(); |
1280 |
1278 |
1281 // check if method can be analyzed |
1279 // check if method can be analyzed |
1282 if (iid == vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized() |
1280 if (iid == vmIntrinsics::_none && (method()->is_abstract() || method()->is_native() || !method()->holder()->is_initialized() |
1283 || _level > MaxBCEAEstimateLevel |
1281 || _level > MaxBCEAEstimateLevel |
1284 || method()->code_size() > MaxBCEAEstimateSize)) { |
1282 || method()->code_size() > MaxBCEAEstimateSize)) { |
1285 if (BCEATraceLevel >= 1) { |
1283 if (BCEATraceLevel >= 1) { |
1286 tty->print("Skipping method because: "); |
1284 tty->print("Skipping method because: "); |
1287 if (method()->is_abstract()) |
1285 if (method()->is_abstract()) |
1310 tty->print(" intrinsic"); |
1308 tty->print(" intrinsic"); |
1311 method()->print_short_name(); |
1309 method()->print_short_name(); |
1312 tty->print_cr(" (%d bytes)", method()->code_size()); |
1310 tty->print_cr(" (%d bytes)", method()->code_size()); |
1313 } |
1311 } |
1314 |
1312 |
1315 bool success; |
|
1316 |
|
1317 initialize(); |
1313 initialize(); |
1318 |
1314 |
1319 // Do not scan method if it has no object parameters and |
1315 // Do not scan method if it has no object parameters and |
1320 // does not returns an object (_return_allocated is set in initialize()). |
1316 // does not returns an object (_return_allocated is set in initialize()). |
1321 if (_arg_local.Size() == 0 && !_return_allocated) { |
1317 if (_arg_local.Size() == 0 && !_return_allocated) { |
1327 methodData()->set_eflag(MethodData::estimated); |
1323 methodData()->set_eflag(MethodData::estimated); |
1328 return; |
1324 return; |
1329 } |
1325 } |
1330 |
1326 |
1331 if (iid != vmIntrinsics::_none) |
1327 if (iid != vmIntrinsics::_none) |
1332 success = compute_escape_for_intrinsic(iid); |
1328 compute_escape_for_intrinsic(iid); |
1333 else { |
1329 else { |
1334 success = do_analysis(); |
1330 do_analysis(); |
1335 } |
1331 } |
1336 |
1332 |
1337 // don't store interprocedural escape information if it introduces |
1333 // don't store interprocedural escape information if it introduces |
1338 // dependencies or if method data is empty |
1334 // dependencies or if method data is empty |
1339 // |
1335 // |