src/share/vm/opto/bytecodeInfo.cpp

Mon, 12 Nov 2012 14:03:53 -0800

author
minqi
date
Mon, 12 Nov 2012 14:03:53 -0800
changeset 4267
bd7a7ce2e264
parent 4164
d804e148cff8
child 4357
ad5dd04754ee
permissions
-rw-r--r--

6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com

duke@435 1 /*
mikael@4153 2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
minqi@4267 26 #include "ci/ciReplay.hpp"
stefank@2314 27 #include "classfile/systemDictionary.hpp"
stefank@2314 28 #include "classfile/vmSymbols.hpp"
twisti@2687 29 #include "compiler/compileBroker.hpp"
stefank@2314 30 #include "compiler/compileLog.hpp"
stefank@2314 31 #include "interpreter/linkResolver.hpp"
stefank@2314 32 #include "oops/objArrayKlass.hpp"
stefank@2314 33 #include "opto/callGenerator.hpp"
stefank@2314 34 #include "opto/parse.hpp"
stefank@2314 35 #include "runtime/handles.inline.hpp"
duke@435 36
duke@435 37 //=============================================================================
duke@435 38 //------------------------------InlineTree-------------------------------------
never@2981 39 InlineTree::InlineTree(Compile* c,
never@2981 40 const InlineTree *caller_tree, ciMethod* callee,
never@2981 41 JVMState* caller_jvms, int caller_bci,
never@2981 42 float site_invoke_ratio, int max_inline_level) :
never@2981 43 C(c),
never@2981 44 _caller_jvms(caller_jvms),
never@2981 45 _caller_tree((InlineTree*) caller_tree),
never@2981 46 _method(callee),
never@2981 47 _site_invoke_ratio(site_invoke_ratio),
never@2981 48 _max_inline_level(max_inline_level),
twisti@3097 49 _count_inline_bcs(method()->code_size_for_inlining())
jrose@1592 50 {
duke@435 51 NOT_PRODUCT(_count_inlines = 0;)
duke@435 52 if (_caller_jvms != NULL) {
duke@435 53 // Keep a private copy of the caller_jvms:
duke@435 54 _caller_jvms = new (C) JVMState(caller_jvms->method(), caller_tree->caller_jvms());
duke@435 55 _caller_jvms->set_bci(caller_jvms->bci());
cfang@1335 56 assert(!caller_jvms->should_reexecute(), "there should be no reexecute bytecode with inlining");
duke@435 57 }
duke@435 58 assert(_caller_jvms->same_calls_as(caller_jvms), "consistent JVMS");
jrose@1592 59 assert((caller_tree == NULL ? 0 : caller_tree->stack_depth() + 1) == stack_depth(), "correct (redundant) depth parameter");
duke@435 60 assert(caller_bci == this->caller_bci(), "correct (redundant) bci parameter");
duke@435 61 if (UseOldInlining) {
duke@435 62 // Update hierarchical counts, count_inline_bcs() and count_inlines()
duke@435 63 InlineTree *caller = (InlineTree *)caller_tree;
duke@435 64 for( ; caller != NULL; caller = ((InlineTree *)(caller->caller_tree())) ) {
duke@435 65 caller->_count_inline_bcs += count_inline_bcs();
duke@435 66 NOT_PRODUCT(caller->_count_inlines++;)
duke@435 67 }
duke@435 68 }
duke@435 69 }
duke@435 70
jrose@1592 71 InlineTree::InlineTree(Compile* c, ciMethod* callee_method, JVMState* caller_jvms,
never@2981 72 float site_invoke_ratio, int max_inline_level) :
never@2981 73 C(c),
never@2981 74 _caller_jvms(caller_jvms),
never@2981 75 _caller_tree(NULL),
never@2981 76 _method(callee_method),
never@2981 77 _site_invoke_ratio(site_invoke_ratio),
never@2981 78 _max_inline_level(max_inline_level),
jrose@1592 79 _count_inline_bcs(method()->code_size())
jrose@1592 80 {
duke@435 81 NOT_PRODUCT(_count_inlines = 0;)
duke@435 82 assert(!UseOldInlining, "do not use for old stuff");
duke@435 83 }
duke@435 84
kvn@476 85 static bool is_init_with_ea(ciMethod* callee_method,
kvn@476 86 ciMethod* caller_method, Compile* C) {
kvn@476 87 // True when EA is ON and a java constructor is called or
kvn@476 88 // a super constructor is called from an inlined java constructor.
kvn@679 89 return C->do_escape_analysis() && EliminateAllocations &&
kvn@476 90 ( callee_method->is_initializer() ||
kvn@476 91 (caller_method->is_initializer() &&
kvn@476 92 caller_method != C->method() &&
kvn@476 93 caller_method->holder()->is_subclass_of(callee_method->holder()))
kvn@476 94 );
kvn@476 95 }
kvn@476 96
twisti@3969 97 // positive filter: should callee be inlined? returns NULL, if yes, or rejection msg
twisti@2898 98 const char* InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const {
duke@435 99 // Allows targeted inlining
duke@435 100 if(callee_method->should_inline()) {
duke@435 101 *wci_result = *(WarmCallInfo::always_hot());
duke@435 102 if (PrintInlining && Verbose) {
never@2981 103 CompileTask::print_inline_indent(inline_level());
duke@435 104 tty->print_cr("Inlined method is hot: ");
duke@435 105 }
duke@435 106 return NULL;
duke@435 107 }
duke@435 108
duke@435 109 // positive filter: should send be inlined? returns NULL (--> yes)
duke@435 110 // or rejection msg
twisti@3097 111 int size = callee_method->code_size_for_inlining();
duke@435 112
duke@435 113 // Check for too many throws (and not too huge)
kvn@476 114 if(callee_method->interpreter_throwout_count() > InlineThrowCount &&
kvn@476 115 size < InlineThrowMaxSize ) {
duke@435 116 wci_result->set_profit(wci_result->profit() * 100);
duke@435 117 if (PrintInlining && Verbose) {
never@2981 118 CompileTask::print_inline_indent(inline_level());
duke@435 119 tty->print_cr("Inlined method with many throws (throws=%d):", callee_method->interpreter_throwout_count());
duke@435 120 }
duke@435 121 return NULL;
duke@435 122 }
duke@435 123
duke@435 124 if (!UseOldInlining) {
duke@435 125 return NULL; // size and frequency are represented in a new way
duke@435 126 }
duke@435 127
twisti@2898 128 int default_max_inline_size = C->max_inline_size();
twisti@2898 129 int inline_small_code_size = InlineSmallCode / 4;
twisti@2898 130 int max_inline_size = default_max_inline_size;
twisti@2898 131
duke@435 132 int call_site_count = method()->scale_count(profile.count());
duke@435 133 int invoke_count = method()->interpreter_invocation_count();
twisti@2898 134
twisti@2898 135 assert(invoke_count != 0, "require invocation count greater than zero");
twisti@2898 136 int freq = call_site_count / invoke_count;
kvn@476 137
duke@435 138 // bump the max size if the call is frequent
kvn@476 139 if ((freq >= InlineFrequencyRatio) ||
kvn@476 140 (call_site_count >= InlineFrequencyCount) ||
kvn@476 141 is_init_with_ea(callee_method, caller_method, C)) {
kvn@476 142
twisti@2898 143 max_inline_size = C->freq_inline_size();
twisti@2898 144 if (size <= max_inline_size && TraceFrequencyInlining) {
never@2981 145 CompileTask::print_inline_indent(inline_level());
duke@435 146 tty->print_cr("Inlined frequent method (freq=%d count=%d):", freq, call_site_count);
never@2981 147 CompileTask::print_inline_indent(inline_level());
duke@435 148 callee_method->print();
duke@435 149 tty->cr();
duke@435 150 }
duke@435 151 } else {
duke@435 152 // Not hot. Check for medium-sized pre-existing nmethod at cold sites.
kvn@476 153 if (callee_method->has_compiled_code() &&
minqi@4267 154 callee_method->instructions_size() > inline_small_code_size)
duke@435 155 return "already compiled into a medium method";
duke@435 156 }
twisti@2898 157 if (size > max_inline_size) {
twisti@2898 158 if (max_inline_size > default_max_inline_size)
duke@435 159 return "hot method too big";
duke@435 160 return "too big";
duke@435 161 }
duke@435 162 return NULL;
duke@435 163 }
duke@435 164
duke@435 165
twisti@3969 166 // negative filter: should callee NOT be inlined? returns NULL, ok to inline, or rejection msg
twisti@2898 167 const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* caller_method, WarmCallInfo* wci_result) const {
duke@435 168 // negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg
duke@435 169 if (!UseOldInlining) {
duke@435 170 const char* fail = NULL;
twisti@3969 171 if ( callee_method->is_abstract()) fail = "abstract method";
duke@435 172 // note: we allow ik->is_abstract()
twisti@3969 173 if (!callee_method->holder()->is_initialized()) fail = "method holder not initialized";
twisti@3969 174 if ( callee_method->is_native()) fail = "native method";
twisti@3969 175 if ( callee_method->dont_inline()) fail = "don't inline by annotation";
duke@435 176
duke@435 177 if (fail) {
duke@435 178 *wci_result = *(WarmCallInfo::always_cold());
duke@435 179 return fail;
duke@435 180 }
duke@435 181
duke@435 182 if (callee_method->has_unloaded_classes_in_signature()) {
duke@435 183 wci_result->set_profit(wci_result->profit() * 0.1);
duke@435 184 }
duke@435 185
duke@435 186 // don't inline exception code unless the top method belongs to an
duke@435 187 // exception class
duke@435 188 if (callee_method->holder()->is_subclass_of(C->env()->Throwable_klass())) {
duke@435 189 ciMethod* top_method = caller_jvms() ? caller_jvms()->of_depth(1)->method() : method();
duke@435 190 if (!top_method->holder()->is_subclass_of(C->env()->Throwable_klass())) {
duke@435 191 wci_result->set_profit(wci_result->profit() * 0.1);
duke@435 192 }
duke@435 193 }
duke@435 194
twisti@3969 195 if (callee_method->has_compiled_code() &&
minqi@4267 196 callee_method->instructions_size() > InlineSmallCode) {
duke@435 197 wci_result->set_profit(wci_result->profit() * 0.1);
duke@435 198 // %%% adjust wci_result->size()?
duke@435 199 }
duke@435 200
duke@435 201 return NULL;
duke@435 202 }
duke@435 203
twisti@3969 204 // First check all inlining restrictions which are required for correctness
twisti@3969 205 if ( callee_method->is_abstract()) return "abstract method";
twisti@3969 206 // note: we allow ik->is_abstract()
twisti@3969 207 if (!callee_method->holder()->is_initialized()) return "method holder not initialized";
twisti@3969 208 if ( callee_method->is_native()) return "native method";
twisti@3969 209 if ( callee_method->dont_inline()) return "don't inline by annotation";
twisti@3969 210 if ( callee_method->has_unloaded_classes_in_signature()) return "unloaded signature classes";
twisti@1573 211
twisti@3969 212 if (callee_method->force_inline() || callee_method->should_inline()) {
duke@435 213 // ignore heuristic controls on inlining
duke@435 214 return NULL;
duke@435 215 }
duke@435 216
duke@435 217 // Now perform checks which are heuristic
duke@435 218
twisti@3969 219 if (callee_method->has_compiled_code() &&
minqi@4267 220 callee_method->instructions_size() > InlineSmallCode) {
duke@435 221 return "already compiled into a big method";
twisti@3969 222 }
duke@435 223
duke@435 224 // don't inline exception code unless the top method belongs to an
duke@435 225 // exception class
duke@435 226 if (caller_tree() != NULL &&
duke@435 227 callee_method->holder()->is_subclass_of(C->env()->Throwable_klass())) {
duke@435 228 const InlineTree *top = this;
duke@435 229 while (top->caller_tree() != NULL) top = top->caller_tree();
duke@435 230 ciInstanceKlass* k = top->method()->holder();
duke@435 231 if (!k->is_subclass_of(C->env()->Throwable_klass()))
duke@435 232 return "exception method";
duke@435 233 }
duke@435 234
never@3653 235 if (callee_method->should_not_inline()) {
never@3653 236 return "disallowed by CompilerOracle";
never@3653 237 }
never@3653 238
minqi@4267 239 #ifndef PRODUCT
minqi@4267 240 if (ciReplay::should_not_inline(callee_method)) {
minqi@4267 241 return "disallowed by ciReplay";
minqi@4267 242 }
minqi@4267 243 #endif
minqi@4267 244
never@3653 245 if (UseStringCache) {
never@3653 246 // Do not inline StringCache::profile() method used only at the beginning.
never@3653 247 if (callee_method->name() == ciSymbol::profile_name() &&
never@3653 248 callee_method->holder()->name() == ciSymbol::java_lang_StringCache()) {
never@3653 249 return "profiling method";
never@3653 250 }
never@3653 251 }
never@3653 252
duke@435 253 // use frequency-based objections only for non-trivial methods
twisti@3969 254 if (callee_method->code_size() <= MaxTrivialSize) return NULL;
kvn@476 255
kvn@476 256 // don't use counts with -Xcomp or CTW
kvn@476 257 if (UseInterpreter && !CompileTheWorld) {
kvn@476 258
kvn@476 259 if (!callee_method->has_compiled_code() &&
kvn@476 260 !callee_method->was_executed_more_than(0)) {
kvn@476 261 return "never executed";
kvn@476 262 }
kvn@476 263
kvn@476 264 if (is_init_with_ea(callee_method, caller_method, C)) {
kvn@476 265
kvn@476 266 // Escape Analysis: inline all executed constructors
kvn@476 267
kvn@476 268 } else if (!callee_method->was_executed_more_than(MIN2(MinInliningThreshold,
kvn@476 269 CompileThreshold >> 1))) {
kvn@476 270 return "executed < MinInliningThreshold times";
kvn@476 271 }
duke@435 272 }
duke@435 273
duke@435 274 return NULL;
duke@435 275 }
duke@435 276
duke@435 277 //-----------------------------try_to_inline-----------------------------------
duke@435 278 // return NULL if ok, reason for not inlining otherwise
duke@435 279 // Relocated from "InliningClosure::try_to_inline"
kvn@476 280 const char* InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) {
duke@435 281
duke@435 282 // Old algorithm had funny accumulating BC-size counters
duke@435 283 if (UseOldInlining && ClipInlining
duke@435 284 && (int)count_inline_bcs() >= DesiredMethodLimit) {
duke@435 285 return "size > DesiredMethodLimit";
duke@435 286 }
duke@435 287
duke@435 288 const char *msg = NULL;
twisti@2898 289 msg = should_inline(callee_method, caller_method, caller_bci, profile, wci_result);
twisti@2898 290 if (msg != NULL)
kvn@476 291 return msg;
twisti@2898 292
twisti@2898 293 msg = should_not_inline(callee_method, caller_method, wci_result);
twisti@2898 294 if (msg != NULL)
kvn@476 295 return msg;
duke@435 296
jrose@1592 297 if (InlineAccessors && callee_method->is_accessor()) {
jrose@1592 298 // accessor methods are not subject to any of the following limits.
jrose@1592 299 return NULL;
jrose@1592 300 }
duke@435 301
duke@435 302 // suppress a few checks for accessors and trivial methods
twisti@3969 303 if (callee_method->code_size() > MaxTrivialSize) {
kvn@476 304
duke@435 305 // don't inline into giant methods
kvn@476 306 if (C->unique() > (uint)NodeCountInliningCutoff) {
kvn@476 307 return "NodeCountInliningCutoff";
kvn@476 308 }
duke@435 309
kvn@476 310 if ((!UseInterpreter || CompileTheWorld) &&
kvn@476 311 is_init_with_ea(callee_method, caller_method, C)) {
kvn@476 312
kvn@476 313 // Escape Analysis stress testing when running Xcomp or CTW:
kvn@476 314 // inline constructors even if they are not reached.
kvn@476 315
kvn@476 316 } else if (profile.count() == 0) {
kvn@476 317 // don't inline unreached call sites
kvn@476 318 return "call site not reached";
kvn@476 319 }
duke@435 320 }
duke@435 321
jrose@1592 322 if (!C->do_inlining() && InlineAccessors) {
kvn@476 323 return "not an accessor";
kvn@476 324 }
never@2981 325 if (inline_level() > _max_inline_level) {
kvn@476 326 return "inlining too deep";
kvn@476 327 }
twisti@2687 328
twisti@2866 329 // detect direct and indirect recursive inlining
twisti@3969 330 if (!callee_method->is_compiled_lambda_form()) {
twisti@2866 331 // count the current method and the callee
twisti@2866 332 int inline_level = (method() == callee_method) ? 1 : 0;
twisti@2866 333 if (inline_level > MaxRecursiveInlineLevel)
twisti@2866 334 return "recursively inlining too deep";
twisti@2866 335 // count callers of current method and callee
twisti@2687 336 JVMState* jvms = caller_jvms();
twisti@2687 337 while (jvms != NULL && jvms->has_method()) {
twisti@2687 338 if (jvms->method() == callee_method) {
twisti@2687 339 inline_level++;
twisti@2687 340 if (inline_level > MaxRecursiveInlineLevel)
twisti@2687 341 return "recursively inlining too deep";
twisti@2687 342 }
twisti@2687 343 jvms = jvms->caller();
twisti@2687 344 }
twisti@2687 345 }
twisti@2687 346
twisti@3097 347 int size = callee_method->code_size_for_inlining();
duke@435 348
duke@435 349 if (UseOldInlining && ClipInlining
duke@435 350 && (int)count_inline_bcs() + size >= DesiredMethodLimit) {
duke@435 351 return "size > DesiredMethodLimit";
duke@435 352 }
duke@435 353
duke@435 354 // ok, inline this method
duke@435 355 return NULL;
duke@435 356 }
duke@435 357
duke@435 358 //------------------------------pass_initial_checks----------------------------
duke@435 359 bool pass_initial_checks(ciMethod* caller_method, int caller_bci, ciMethod* callee_method) {
duke@435 360 ciInstanceKlass *callee_holder = callee_method ? callee_method->holder() : NULL;
duke@435 361 // Check if a callee_method was suggested
duke@435 362 if( callee_method == NULL ) return false;
duke@435 363 // Check if klass of callee_method is loaded
duke@435 364 if( !callee_holder->is_loaded() ) return false;
duke@435 365 if( !callee_holder->is_initialized() ) return false;
duke@435 366 if( !UseInterpreter || CompileTheWorld /* running Xcomp or CTW */ ) {
duke@435 367 // Checks that constant pool's call site has been visited
duke@435 368 // stricter than callee_holder->is_initialized()
duke@435 369 ciBytecodeStream iter(caller_method);
duke@435 370 iter.force_bci(caller_bci);
duke@435 371 Bytecodes::Code call_bc = iter.cur_bc();
twisti@1572 372 // An invokedynamic instruction does not have a klass.
twisti@1572 373 if (call_bc != Bytecodes::_invokedynamic) {
jrose@1920 374 int index = iter.get_index_u2_cpcache();
twisti@1572 375 if (!caller_method->is_klass_loaded(index, true)) {
twisti@1572 376 return false;
twisti@1572 377 }
twisti@1572 378 // Try to do constant pool resolution if running Xcomp
twisti@1572 379 if( !caller_method->check_call(index, call_bc == Bytecodes::_invokestatic) ) {
twisti@1572 380 return false;
twisti@1572 381 }
duke@435 382 }
duke@435 383 }
duke@435 384 // We will attempt to see if a class/field/etc got properly loaded. If it
duke@435 385 // did not, it may attempt to throw an exception during our probing. Catch
duke@435 386 // and ignore such exceptions and do not attempt to compile the method.
duke@435 387 if( callee_method->should_exclude() ) return false;
duke@435 388
duke@435 389 return true;
duke@435 390 }
duke@435 391
twisti@3100 392 //------------------------------check_can_parse--------------------------------
twisti@3100 393 const char* InlineTree::check_can_parse(ciMethod* callee) {
twisti@3100 394 // Certain methods cannot be parsed at all:
twisti@3100 395 if ( callee->is_native()) return "native method";
twisti@3969 396 if ( callee->is_abstract()) return "abstract method";
twisti@3100 397 if (!callee->can_be_compiled()) return "not compilable (disabled)";
twisti@3100 398 if (!callee->has_balanced_monitors()) return "not compilable (unbalanced monitors)";
twisti@3100 399 if ( callee->get_flow_analysis()->failing()) return "not compilable (flow analysis failed)";
twisti@3100 400 return NULL;
twisti@3100 401 }
twisti@3100 402
duke@435 403 //------------------------------print_inlining---------------------------------
duke@435 404 // Really, the failure_msg can be a success message also.
twisti@2687 405 void InlineTree::print_inlining(ciMethod* callee_method, int caller_bci, const char* failure_msg) const {
never@2981 406 CompileTask::print_inlining(callee_method, inline_level(), caller_bci, failure_msg ? failure_msg : "inline");
twisti@2687 407 if (callee_method == NULL) tty->print(" callee not monotonic or profiled");
twisti@2687 408 if (Verbose && callee_method) {
duke@435 409 const InlineTree *top = this;
duke@435 410 while( top->caller_tree() != NULL ) { top = top->caller_tree(); }
twisti@3969 411 //tty->print(" bcs: %d+%d invoked: %d", top->count_inline_bcs(), callee_method->code_size(), callee_method->interpreter_invocation_count());
duke@435 412 }
duke@435 413 }
duke@435 414
duke@435 415 //------------------------------ok_to_inline-----------------------------------
duke@435 416 WarmCallInfo* InlineTree::ok_to_inline(ciMethod* callee_method, JVMState* jvms, ciCallProfile& profile, WarmCallInfo* initial_wci) {
duke@435 417 assert(callee_method != NULL, "caller checks for optimized virtual!");
duke@435 418 #ifdef ASSERT
duke@435 419 // Make sure the incoming jvms has the same information content as me.
duke@435 420 // This means that we can eventually make this whole class AllStatic.
duke@435 421 if (jvms->caller() == NULL) {
duke@435 422 assert(_caller_jvms == NULL, "redundant instance state");
duke@435 423 } else {
duke@435 424 assert(_caller_jvms->same_calls_as(jvms->caller()), "redundant instance state");
duke@435 425 }
duke@435 426 assert(_method == jvms->method(), "redundant instance state");
duke@435 427 #endif
duke@435 428 const char *failure_msg = NULL;
duke@435 429 int caller_bci = jvms->bci();
duke@435 430 ciMethod *caller_method = jvms->method();
duke@435 431
twisti@3100 432 // Do some initial checks.
twisti@3100 433 if (!pass_initial_checks(caller_method, caller_bci, callee_method)) {
twisti@3969 434 if (PrintInlining) print_inlining(callee_method, caller_bci, "failed initial checks");
duke@435 435 return NULL;
duke@435 436 }
duke@435 437
twisti@3100 438 // Do some parse checks.
twisti@3100 439 failure_msg = check_can_parse(callee_method);
twisti@3100 440 if (failure_msg != NULL) {
twisti@3100 441 if (PrintInlining) print_inlining(callee_method, caller_bci, failure_msg);
twisti@3100 442 return NULL;
twisti@3100 443 }
twisti@3100 444
duke@435 445 // Check if inlining policy says no.
duke@435 446 WarmCallInfo wci = *(initial_wci);
kvn@476 447 failure_msg = try_to_inline(callee_method, caller_method, caller_bci, profile, &wci);
duke@435 448 if (failure_msg != NULL && C->log() != NULL) {
vlivanov@4154 449 C->log()->inline_fail(failure_msg);
duke@435 450 }
duke@435 451
duke@435 452 #ifndef PRODUCT
duke@435 453 if (UseOldInlining && InlineWarmCalls
duke@435 454 && (PrintOpto || PrintOptoInlining || PrintInlining)) {
duke@435 455 bool cold = wci.is_cold();
duke@435 456 bool hot = !cold && wci.is_hot();
duke@435 457 bool old_cold = (failure_msg != NULL);
duke@435 458 if (old_cold != cold || (Verbose || WizardMode)) {
duke@435 459 tty->print(" OldInlining= %4s : %s\n WCI=",
duke@435 460 old_cold ? "cold" : "hot", failure_msg ? failure_msg : "OK");
duke@435 461 wci.print();
duke@435 462 }
duke@435 463 }
duke@435 464 #endif
duke@435 465 if (UseOldInlining) {
duke@435 466 if (failure_msg == NULL)
duke@435 467 wci = *(WarmCallInfo::always_hot());
duke@435 468 else
duke@435 469 wci = *(WarmCallInfo::always_cold());
duke@435 470 }
duke@435 471 if (!InlineWarmCalls) {
duke@435 472 if (!wci.is_cold() && !wci.is_hot()) {
duke@435 473 // Do not inline the warm calls.
duke@435 474 wci = *(WarmCallInfo::always_cold());
duke@435 475 }
duke@435 476 }
duke@435 477
duke@435 478 if (!wci.is_cold()) {
duke@435 479 // In -UseOldInlining, the failure_msg may also be a success message.
duke@435 480 if (failure_msg == NULL) failure_msg = "inline (hot)";
duke@435 481
duke@435 482 // Inline!
twisti@3100 483 if (PrintInlining) print_inlining(callee_method, caller_bci, failure_msg);
duke@435 484 if (UseOldInlining)
duke@435 485 build_inline_tree_for_callee(callee_method, jvms, caller_bci);
duke@435 486 if (InlineWarmCalls && !wci.is_hot())
duke@435 487 return new (C) WarmCallInfo(wci); // copy to heap
duke@435 488 return WarmCallInfo::always_hot();
duke@435 489 }
duke@435 490
duke@435 491 // Do not inline
duke@435 492 if (failure_msg == NULL) failure_msg = "too cold to inline";
twisti@3100 493 if (PrintInlining) print_inlining(callee_method, caller_bci, failure_msg);
duke@435 494 return NULL;
duke@435 495 }
duke@435 496
duke@435 497 //------------------------------compute_callee_frequency-----------------------
duke@435 498 float InlineTree::compute_callee_frequency( int caller_bci ) const {
duke@435 499 int count = method()->interpreter_call_site_count(caller_bci);
duke@435 500 int invcnt = method()->interpreter_invocation_count();
duke@435 501 float freq = (float)count/(float)invcnt;
duke@435 502 // Call-site count / interpreter invocation count, scaled recursively.
duke@435 503 // Always between 0.0 and 1.0. Represents the percentage of the method's
duke@435 504 // total execution time used at this call site.
duke@435 505
duke@435 506 return freq;
duke@435 507 }
duke@435 508
duke@435 509 //------------------------------build_inline_tree_for_callee-------------------
duke@435 510 InlineTree *InlineTree::build_inline_tree_for_callee( ciMethod* callee_method, JVMState* caller_jvms, int caller_bci) {
duke@435 511 float recur_frequency = _site_invoke_ratio * compute_callee_frequency(caller_bci);
duke@435 512 // Attempt inlining.
duke@435 513 InlineTree* old_ilt = callee_at(caller_bci, callee_method);
duke@435 514 if (old_ilt != NULL) {
duke@435 515 return old_ilt;
duke@435 516 }
never@2981 517 int max_inline_level_adjust = 0;
jrose@1592 518 if (caller_jvms->method() != NULL) {
twisti@3969 519 if (caller_jvms->method()->is_compiled_lambda_form())
never@2981 520 max_inline_level_adjust += 1; // don't count actions in MH or indy adapter frames
twisti@3969 521 else if (callee_method->is_method_handle_intrinsic() ||
twisti@3969 522 callee_method->is_compiled_lambda_form()) {
never@2981 523 max_inline_level_adjust += 1; // don't count method handle calls from java.lang.invoke implem
jrose@1592 524 }
never@2981 525 if (max_inline_level_adjust != 0 && PrintInlining && (Verbose || WizardMode)) {
never@2981 526 CompileTask::print_inline_indent(inline_level());
twisti@2898 527 tty->print_cr(" \\-> discounting inline depth");
jrose@1592 528 }
never@2981 529 if (max_inline_level_adjust != 0 && C->log()) {
jrose@1592 530 int id1 = C->log()->identify(caller_jvms->method());
jrose@1592 531 int id2 = C->log()->identify(callee_method);
never@2981 532 C->log()->elem("inline_level_discount caller='%d' callee='%d'", id1, id2);
jrose@1592 533 }
jrose@1592 534 }
never@2981 535 InlineTree* ilt = new InlineTree(C, this, callee_method, caller_jvms, caller_bci, recur_frequency, _max_inline_level + max_inline_level_adjust);
never@2981 536 _subtrees.append(ilt);
duke@435 537
duke@435 538 NOT_PRODUCT( _count_inlines += 1; )
duke@435 539
duke@435 540 return ilt;
duke@435 541 }
duke@435 542
duke@435 543
duke@435 544 //---------------------------------------callee_at-----------------------------
duke@435 545 InlineTree *InlineTree::callee_at(int bci, ciMethod* callee) const {
duke@435 546 for (int i = 0; i < _subtrees.length(); i++) {
duke@435 547 InlineTree* sub = _subtrees.at(i);
duke@435 548 if (sub->caller_bci() == bci && callee == sub->method()) {
duke@435 549 return sub;
duke@435 550 }
duke@435 551 }
duke@435 552 return NULL;
duke@435 553 }
duke@435 554
duke@435 555
duke@435 556 //------------------------------build_inline_tree_root-------------------------
duke@435 557 InlineTree *InlineTree::build_inline_tree_root() {
duke@435 558 Compile* C = Compile::current();
duke@435 559
duke@435 560 // Root of inline tree
never@2981 561 InlineTree* ilt = new InlineTree(C, NULL, C->method(), NULL, -1, 1.0F, MaxInlineLevel);
duke@435 562
duke@435 563 return ilt;
duke@435 564 }
duke@435 565
duke@435 566
duke@435 567 //-------------------------find_subtree_from_root-----------------------------
duke@435 568 // Given a jvms, which determines a call chain from the root method,
duke@435 569 // find the corresponding inline tree.
duke@435 570 // Note: This method will be removed or replaced as InlineTree goes away.
twisti@3969 571 InlineTree* InlineTree::find_subtree_from_root(InlineTree* root, JVMState* jvms, ciMethod* callee) {
duke@435 572 InlineTree* iltp = root;
duke@435 573 uint depth = jvms && jvms->has_method() ? jvms->depth() : 0;
duke@435 574 for (uint d = 1; d <= depth; d++) {
duke@435 575 JVMState* jvmsp = jvms->of_depth(d);
duke@435 576 // Select the corresponding subtree for this bci.
duke@435 577 assert(jvmsp->method() == iltp->method(), "tree still in sync");
duke@435 578 ciMethod* d_callee = (d == depth) ? callee : jvms->of_depth(d+1)->method();
duke@435 579 InlineTree* sub = iltp->callee_at(jvmsp->bci(), d_callee);
twisti@3969 580 if (sub == NULL) {
twisti@3969 581 if (d == depth) {
twisti@3969 582 sub = iltp->build_inline_tree_for_callee(d_callee, jvmsp, jvmsp->bci());
duke@435 583 }
twisti@3969 584 guarantee(sub != NULL, "should be a sub-ilt here");
twisti@3969 585 return sub;
duke@435 586 }
duke@435 587 iltp = sub;
duke@435 588 }
duke@435 589 return iltp;
duke@435 590 }
never@3138 591
never@3138 592
never@3138 593
never@3138 594 #ifndef PRODUCT
never@3138 595 void InlineTree::print_impl(outputStream* st, int indent) const {
never@3138 596 for (int i = 0; i < indent; i++) st->print(" ");
never@3138 597 st->print(" @ %d ", caller_bci());
never@3138 598 method()->print_short_name(st);
never@3138 599 st->cr();
never@3138 600
never@3138 601 for (int i = 0 ; i < _subtrees.length(); i++) {
never@3138 602 _subtrees.at(i)->print_impl(st, indent + 2);
never@3138 603 }
never@3138 604 }
never@3138 605
never@3138 606 void InlineTree::print_value_on(outputStream* st) const {
never@3138 607 print_impl(st, 2);
never@3138 608 }
never@3138 609 #endif

mercurial