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