< prev index next >
src/share/vm/opto/bytecodeInfo.cpp
Print this page
rev 11591 : 8161379: @CallerSensitive methods should be forcefully inlined to get Reflection.getCallerClass optimization
Reviewed-by: TBD
Contributed-by: aleksey.shipilev@oracle.com, claes.redestad@oracle.com
@@ -123,10 +123,16 @@
set_msg("force inline by annotation");
_forced_inline = true;
return true;
}
+ if (callee_method->caller_sensitive()) {
+ set_msg("force inline @CallerSensitive");
+ _forced_inline = true;
+ return true;
+ }
+
#ifndef PRODUCT
int inline_depth = inline_level()+1;
if (ciReplay::should_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) {
set_msg("force inline by ciReplay");
_forced_inline = true;
@@ -254,10 +260,15 @@
if (callee_method->force_inline()) {
set_msg("force inline by annotation");
return false;
}
+ if (callee_method->caller_sensitive()) {
+ set_msg("force inline @CallerSensitive");
+ return false;
+ }
+
// Now perform checks which are heuristic
if (is_unboxing_method(callee_method, C)) {
// Inline unboxing methods.
return false;
@@ -324,11 +335,11 @@
bool InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_method,
int caller_bci, JVMState* jvms, ciCallProfile& profile,
WarmCallInfo* wci_result, bool& should_delay) {
if (ClipInlining && (int)count_inline_bcs() >= DesiredMethodLimit) {
- if (!callee_method->force_inline() || !IncrementalInline) {
+ if ((!callee_method->force_inline() && !callee_method->caller_sensitive()) || !IncrementalInline) {
set_msg("size > DesiredMethodLimit");
return false;
} else if (!C->inlining_incrementally()) {
should_delay = true;
}
@@ -352,11 +363,11 @@
// suppress a few checks for accessors and trivial methods
if (callee_method->code_size() > MaxTrivialSize) {
// don't inline into giant methods
if (C->over_inlining_cutoff()) {
- if ((!callee_method->force_inline() && !caller_method->is_compiled_lambda_form())
+ if ((!callee_method->force_inline() && !caller_method->caller_sensitive() && !caller_method->is_compiled_lambda_form())
|| !IncrementalInline) {
set_msg("NodeCountInliningCutoff");
return false;
} else {
should_delay = true;
@@ -386,11 +397,11 @@
if (inline_level() > MaxForceInlineLevel) {
set_msg("MaxForceInlineLevel");
return false;
}
if (inline_level() > _max_inline_level) {
- if (!callee_method->force_inline() || !IncrementalInline) {
+ if ((!callee_method->force_inline() && !callee_method->caller_sensitive()) || !IncrementalInline) {
set_msg("inlining too deep");
return false;
} else if (!C->inlining_incrementally()) {
should_delay = true;
}
@@ -430,11 +441,11 @@
}
int size = callee_method->code_size_for_inlining();
if (ClipInlining && (int)count_inline_bcs() + size >= DesiredMethodLimit) {
- if (!callee_method->force_inline() || !IncrementalInline) {
+ if ((!callee_method->force_inline() && !callee_method->caller_sensitive()) || !IncrementalInline) {
set_msg("size > DesiredMethodLimit");
return false;
} else if (!C->inlining_incrementally()) {
should_delay = true;
}
< prev index next >