src/share/vm/ci/bcEscapeAnalyzer.cpp

changeset 9736
940791dabea2
parent 7626
364f6c28effb
child 9756
2be326848943
equal deleted inserted replaced
9735:bd6ec847115e 9736:940791dabea2
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 //

mercurial