< prev index next >
src/share/vm/ci/bcEscapeAnalyzer.cpp
Print this page
rev 9028 : 8218201: Failures when vmIntrinsics::_getClass is not inlined
Summary: Fix BCEscapeAnalyzer to correctly handle _getClass intrinsic.
Reviewed-by: kvn, dlong, redestad, neliasso
*** 1168,1204 ****
worklist.push(succ);
}
}
}
! bool BCEscapeAnalyzer::do_analysis() {
Arena* arena = CURRENT_ENV->arena();
// identify basic blocks
_methodBlocks = _method->get_method_blocks();
iterate_blocks(arena);
- // TEMPORARY
- return true;
}
vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
vmIntrinsics::ID iid = method()->intrinsic_id();
-
if (iid == vmIntrinsics::_getClass ||
iid == vmIntrinsics::_fillInStackTrace ||
! iid == vmIntrinsics::_hashCode)
return iid;
! else
return vmIntrinsics::_none;
}
! bool BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
ArgumentMap arg;
arg.clear();
switch (iid) {
case vmIntrinsics::_getClass:
_return_local = false;
break;
case vmIntrinsics::_fillInStackTrace:
arg.set(0); // 'this'
set_returned(arg);
break;
--- 1168,1203 ----
worklist.push(succ);
}
}
}
! void BCEscapeAnalyzer::do_analysis() {
Arena* arena = CURRENT_ENV->arena();
// identify basic blocks
_methodBlocks = _method->get_method_blocks();
iterate_blocks(arena);
}
vmIntrinsics::ID BCEscapeAnalyzer::known_intrinsic() {
vmIntrinsics::ID iid = method()->intrinsic_id();
if (iid == vmIntrinsics::_getClass ||
iid == vmIntrinsics::_fillInStackTrace ||
! iid == vmIntrinsics::_hashCode) {
return iid;
! } else {
return vmIntrinsics::_none;
+ }
}
! void BCEscapeAnalyzer::compute_escape_for_intrinsic(vmIntrinsics::ID iid) {
ArgumentMap arg;
arg.clear();
switch (iid) {
case vmIntrinsics::_getClass:
_return_local = false;
+ _return_allocated = false;
break;
case vmIntrinsics::_fillInStackTrace:
arg.set(0); // 'this'
set_returned(arg);
break;
*** 1206,1216 ****
// initialized state is correct
break;
default:
assert(false, "unexpected intrinsic");
}
- return true;
}
void BCEscapeAnalyzer::initialize() {
int i;
--- 1205,1214 ----
*** 1310,1321 ****
tty->print(" intrinsic");
method()->print_short_name();
tty->print_cr(" (%d bytes)", method()->code_size());
}
- bool success;
-
initialize();
// Do not scan method if it has no object parameters and
// does not returns an object (_return_allocated is set in initialize()).
if (_arg_local.Size() == 0 && !_return_allocated) {
--- 1308,1317 ----
*** 1327,1339 ****
methodData()->set_eflag(MethodData::estimated);
return;
}
if (iid != vmIntrinsics::_none)
! success = compute_escape_for_intrinsic(iid);
else {
! success = do_analysis();
}
// don't store interprocedural escape information if it introduces
// dependencies or if method data is empty
//
--- 1323,1335 ----
methodData()->set_eflag(MethodData::estimated);
return;
}
if (iid != vmIntrinsics::_none)
! compute_escape_for_intrinsic(iid);
else {
! do_analysis();
}
// don't store interprocedural escape information if it introduces
// dependencies or if method data is empty
//
< prev index next >