hotspot/src/share/vm/runtime/compilationPolicy.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14391 df0a1573d5bd
child 17000 11bf92e571a2
child 16689 efce070b8d42
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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
     2
 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4750
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4750
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4750
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    26
#include "code/compiledIC.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    27
#include "code/nmethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    28
#include "code/scopeDesc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    29
#include "compiler/compilerOracle.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    30
#include "interpreter/interpreter.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
    31
#include "oops/methodData.hpp"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
    32
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    33
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    34
#include "prims/nativeLookup.hpp"
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    35
#include "runtime/advancedThresholdPolicy.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    36
#include "runtime/compilationPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    37
#include "runtime/frame.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    38
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    39
#include "runtime/rframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    40
#include "runtime/simpleThresholdPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    41
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    42
#include "runtime/thread.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    43
#include "runtime/timer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    44
#include "runtime/vframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    45
#include "runtime/vm_operations.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    46
#include "utilities/events.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6747
diff changeset
    47
#include "utilities/globalDefinitions.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
CompilationPolicy* CompilationPolicy::_policy;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
elapsedTimer       CompilationPolicy::_accumulated_time;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
bool               CompilationPolicy::_in_vm_startup;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
// Determine compilation policy based on command line argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
void compilationPolicy_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  CompilationPolicy::set_in_vm_startup(DelayCompilationDuringStartup);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  switch(CompilationPolicyChoice) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  case 0:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    CompilationPolicy::set_policy(new SimpleCompPolicy());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    CompilationPolicy::set_policy(new StackWalkCompPolicy());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    break;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    69
  case 2:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    70
#ifdef TIERED
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    71
    CompilationPolicy::set_policy(new SimpleThresholdPolicy());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    72
#else
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    73
    Unimplemented();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    74
#endif
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    75
    break;
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    76
  case 3:
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    77
#ifdef TIERED
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    78
    CompilationPolicy::set_policy(new AdvancedThresholdPolicy());
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    79
#else
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    80
    Unimplemented();
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    81
#endif
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    82
    break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  default:
8667
b32929355d27 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 7397
diff changeset
    84
    fatal("CompilationPolicyChoice must be in the range: [0-3]");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    86
  CompilationPolicy::policy()->initialize();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
void CompilationPolicy::completed_vm_startup() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  if (TraceCompilationPolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    tty->print("CompilationPolicy: completed vm startup.\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  _in_vm_startup = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
// Returns true if m must be compiled before executing it
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
// This is intended to force compiles for methods (usually for
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
// debugging) that would otherwise be interpreted for some reason.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    99
bool CompilationPolicy::must_be_compiled(methodHandle m, int comp_level) {
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   100
  // Don't allow Xcomp to cause compiles in replay mode
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   101
  if (ReplayCompiles) return false;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   102
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  if (m->has_compiled_code()) return false;       // already compiled
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   104
  if (!can_be_compiled(m, comp_level)) return false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  return !UseInterpreter ||                                              // must compile all methods
4750
71fd601907dc 4360113: Evict nmethods when code cache gets full
kvn
parents: 4645
diff changeset
   107
         (UseCompiler && AlwaysCompileLoopMethods && m->has_loops() && CompileBroker::should_compile_new_jobs()); // eagerly compile loop methods
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
// Returns true if m is allowed to be compiled
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   111
bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  if (m->is_abstract()) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
4645
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   115
  // Math intrinsics should never be compiled as this can lead to
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   116
  // monotonicity problems because the interpreter will prefer the
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   117
  // compiled code to the intrinsic version.  This can't happen in
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   118
  // production because the invocation counter can't be incremented
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   119
  // but we shouldn't expose the system to this problem in testing
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   120
  // modes.
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   121
  if (!AbstractInterpreter::can_be_compiled(m)) {
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   122
    return false;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   123
  }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   124
  if (comp_level == CompLevel_all) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   125
    return !m->is_not_compilable(CompLevel_simple) && !m->is_not_compilable(CompLevel_full_optimization);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   126
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   127
    return !m->is_not_compilable(comp_level);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   128
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   129
}
4645
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 1
diff changeset
   130
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   131
bool CompilationPolicy::is_compilation_enabled() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   132
  // NOTE: CompileBroker::should_compile_new_jobs() checks for UseCompiler
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   133
  return !delay_compilation_during_startup() && CompileBroker::should_compile_new_jobs();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
void CompilationPolicy::print_time() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  tty->print_cr ("Accumulated compilationPolicy times:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  tty->print_cr ("---------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  tty->print_cr ("  Total: %3.3f sec.", _accumulated_time.seconds());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   143
void NonTieredCompPolicy::trace_osr_completion(nmethod* osr_nm) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  if (TraceOnStackReplacement) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    if (osr_nm == NULL) tty->print_cr("compilation failed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    else tty->print_cr("nmethod " INTPTR_FORMAT, osr_nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   151
void NonTieredCompPolicy::initialize() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   152
  // Setup the compiler thread numbers
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   153
  if (CICompilerCountPerCPU) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   154
    // Example: if CICompilerCountPerCPU is true, then we get
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   155
    // max(log2(8)-1,1) = 2 compiler threads on an 8-way machine.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   156
    // May help big-app startup time.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   157
    _compiler_count = MAX2(log2_intptr(os::active_processor_count())-1,1);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   158
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   159
    _compiler_count = CICompilerCount;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   160
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   161
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   162
6747
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   163
// Note: this policy is used ONLY if TieredCompilation is off.
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   164
// compiler_count() behaves the following way:
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   165
// - with TIERED build (with both COMPILER1 and COMPILER2 defined) it should return
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   166
//   zero for the c1 compilation levels, hence the particular ordering of the
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   167
//   statements.
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   168
// - the same should happen when COMPILER2 is defined and COMPILER1 is not
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   169
//   (server build without TIERED defined).
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   170
// - if only COMPILER1 is defined (client build), zero should be returned for
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   171
//   the c2 level.
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   172
// - if neither is defined - always return zero.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   173
int NonTieredCompPolicy::compiler_count(CompLevel comp_level) {
6747
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   174
  assert(!TieredCompilation, "This policy should not be used with TieredCompilation");
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   175
#ifdef COMPILER2
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   176
  if (is_c2_compile(comp_level)) {
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   177
    return _compiler_count;
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   178
  } else {
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   179
    return 0;
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   180
  }
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   181
#endif
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   182
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   183
#ifdef COMPILER1
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   184
  if (is_c1_compile(comp_level)) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   185
    return _compiler_count;
6747
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   186
  } else {
ab166511728e 6987115: Non-tiered compilation policy creates unnecessary C1 threads
iveresov
parents: 6453
diff changeset
   187
    return 0;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   188
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   189
#endif
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   190
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   191
  return 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   192
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   193
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   194
void NonTieredCompPolicy::reset_counter_for_invocation_event(methodHandle m) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // Make sure invocation and backedge counter doesn't overflow again right away
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // as would be the case for native methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // BUT also make sure the method doesn't look like it was never executed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // Set carry bit and reduce counter's value to min(count, CompileThreshold/2).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  m->invocation_counter()->set_carry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  m->backedge_counter()->set_carry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  assert(!m->was_never_executed(), "don't reset to 0 -- could be mistaken for never-executed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   206
void NonTieredCompPolicy::reset_counter_for_back_branch_event(methodHandle m) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // Delay next back-branch event but pump up invocation counter to triger
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  // whole method compilation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  InvocationCounter* i = m->invocation_counter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  InvocationCounter* b = m->backedge_counter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // Don't set invocation_counter's value too low otherwise the method will
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // look like immature (ic < ~5300) which prevents the inlining based on
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // the type profiling.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  i->set(i->state(), CompileThreshold);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // Don't reset counter too low - it is used to check if OSR method is ready.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  b->set(b->state(), CompileThreshold / 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   220
//
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   221
// CounterDecay
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   222
//
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   223
// Interates through invocation counters and decrements them. This
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   224
// is done at each safepoint.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   225
//
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   226
class CounterDecay : public AllStatic {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   227
  static jlong _last_timestamp;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   228
  static void do_method(Method* m) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   229
    m->invocation_counter()->decay();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   230
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   231
public:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   232
  static void decay();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   233
  static bool is_decay_needed() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   234
    return (os::javaTimeMillis() - _last_timestamp) > CounterDecayMinIntervalLength;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   235
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   236
};
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   237
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   238
jlong CounterDecay::_last_timestamp = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   239
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   240
void CounterDecay::decay() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   241
  _last_timestamp = os::javaTimeMillis();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   242
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   243
  // This operation is going to be performed only at the end of a safepoint
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   244
  // and hence GC's will not be going on, all Java mutators are suspended
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   245
  // at this point and hence SystemDictionary_lock is also not needed.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   246
  assert(SafepointSynchronize::is_at_safepoint(), "can only be executed at a safepoint");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   247
  int nclasses = SystemDictionary::number_of_classes();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   248
  double classes_per_tick = nclasses * (CounterDecayMinIntervalLength * 1e-3 /
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   249
                                        CounterHalfLifeTime);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   250
  for (int i = 0; i < classes_per_tick; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   251
    Klass* k = SystemDictionary::try_get_next_class();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   252
    if (k != NULL && k->oop_is_instance()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   253
      InstanceKlass::cast(k)->methods_do(do_method);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   254
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   255
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   256
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   257
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   258
// Called at the end of the safepoint
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   259
void NonTieredCompPolicy::do_safepoint_work() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   260
  if(UseCounterDecay && CounterDecay::is_decay_needed()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   261
    CounterDecay::decay();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   262
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   263
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   264
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   265
void NonTieredCompPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   266
  ScopeDesc* sd = trap_scope;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   267
  for (; !sd->is_top(); sd = sd->sender()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   268
    // Reset ICs of inlined methods, since they can trigger compilations also.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   269
    sd->method()->invocation_counter()->reset();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   270
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   271
  InvocationCounter* c = sd->method()->invocation_counter();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   272
  if (is_osr) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   273
    // It was an OSR method, so bump the count higher.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   274
    c->set(c->state(), CompileThreshold);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   275
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   276
    c->reset();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   277
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   278
  sd->method()->backedge_counter()->reset();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   279
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   280
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   281
// This method can be called by any component of the runtime to notify the policy
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   282
// that it's recommended to delay the complation of this method.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   283
void NonTieredCompPolicy::delay_compilation(Method* method) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   284
  method->invocation_counter()->decay();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   285
  method->backedge_counter()->decay();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   286
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   287
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   288
void NonTieredCompPolicy::disable_compilation(Method* method) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   289
  method->invocation_counter()->set_state(InvocationCounter::wait_for_nothing);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   290
  method->backedge_counter()->set_state(InvocationCounter::wait_for_nothing);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   291
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   292
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   293
CompileTask* NonTieredCompPolicy::select_task(CompileQueue* compile_queue) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   294
  return compile_queue->first();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   295
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   296
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   297
bool NonTieredCompPolicy::is_mature(Method* method) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   298
  MethodData* mdo = method->method_data();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   299
  assert(mdo != NULL, "Should be");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   300
  uint current = mdo->mileage_of(method);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   301
  uint initial = mdo->creation_mileage();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   302
  if (current < initial)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   303
    return true;  // some sort of overflow
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   304
  uint target;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   305
  if (ProfileMaturityPercentage <= 0)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   306
    target = (uint) -ProfileMaturityPercentage;  // absolute value
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   307
  else
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   308
    target = (uint)( (ProfileMaturityPercentage * CompileThreshold) / 100 );
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   309
  return (current >= initial + target);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   310
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   311
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   312
nmethod* NonTieredCompPolicy::event(methodHandle method, methodHandle inlinee, int branch_bci,
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   313
                                    int bci, CompLevel comp_level, nmethod* nm, JavaThread* thread) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   314
  assert(comp_level == CompLevel_none, "This should be only called from the interpreter");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   315
  NOT_PRODUCT(trace_frequency_counter_overflow(method, branch_bci, bci));
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   316
  if (JvmtiExport::can_post_interpreter_events() && thread->is_interp_only_mode()) {
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   317
    // If certain JVMTI events (e.g. frame pop event) are requested then the
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   318
    // thread is forced to remain in interpreted code. This is
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   319
    // implemented partly by a check in the run_compiled_code
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   320
    // section of the interpreter whether we should skip running
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   321
    // compiled code, and partly by skipping OSR compiles for
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   322
    // interpreted-only threads.
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   323
    if (bci != InvocationEntryBci) {
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   324
      reset_counter_for_back_branch_event(method);
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   325
      return NULL;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   326
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   327
  }
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   328
  if (CompileTheWorld || ReplayCompiles) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   329
    // Don't trigger other compiles in testing mode
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   330
    if (bci == InvocationEntryBci) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   331
      reset_counter_for_invocation_event(method);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   332
    } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   333
      reset_counter_for_back_branch_event(method);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   334
    }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   335
    return NULL;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   336
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   337
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   338
  if (bci == InvocationEntryBci) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   339
    // when code cache is full, compilation gets switched off, UseCompiler
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   340
    // is set to false
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   341
    if (!method->has_compiled_code() && UseCompiler) {
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   342
      method_invocation_event(method, thread);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   343
    } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   344
      // Force counter overflow on method entry, even if no compilation
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   345
      // happened.  (The method_invocation_event call does this also.)
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   346
      reset_counter_for_invocation_event(method);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   347
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   348
    // compilation at an invocation overflow no longer goes and retries test for
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   349
    // compiled method. We always run the loser of the race as interpreted.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   350
    // so return NULL
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   351
    return NULL;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   352
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   353
    // counter overflow in a loop => try to do on-stack-replacement
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   354
    nmethod* osr_nm = method->lookup_osr_nmethod_for(bci, CompLevel_highest_tier, true);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   355
    NOT_PRODUCT(trace_osr_request(method, osr_nm, bci));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   356
    // when code cache is full, we should not compile any more...
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   357
    if (osr_nm == NULL && UseCompiler) {
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   358
      method_back_branch_event(method, bci, thread);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   359
      osr_nm = method->lookup_osr_nmethod_for(bci, CompLevel_highest_tier, true);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   360
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   361
    if (osr_nm == NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   362
      reset_counter_for_back_branch_event(method);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   363
      return NULL;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   364
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   365
    return osr_nm;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   366
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   367
  return NULL;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   368
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   369
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   370
#ifndef PRODUCT
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   371
void NonTieredCompPolicy::trace_frequency_counter_overflow(methodHandle m, int branch_bci, int bci) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   372
  if (TraceInvocationCounterOverflow) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   373
    InvocationCounter* ic = m->invocation_counter();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   374
    InvocationCounter* bc = m->backedge_counter();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   375
    ResourceMark rm;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   376
    const char* msg =
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   377
      bci == InvocationEntryBci
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   378
      ? "comp-policy cntr ovfl @ %d in entry of "
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   379
      : "comp-policy cntr ovfl @ %d in loop of ";
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   380
    tty->print(msg, bci);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   381
    m->print_value();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   382
    tty->cr();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   383
    ic->print();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   384
    bc->print();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   385
    if (ProfileInterpreter) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   386
      if (bci != InvocationEntryBci) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   387
        MethodData* mdo = m->method_data();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   388
        if (mdo != NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   389
          int count = mdo->bci_to_data(branch_bci)->as_JumpData()->taken();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   390
          tty->print_cr("back branch count = %d", count);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   391
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   392
      }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   393
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   394
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   395
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   396
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   397
void NonTieredCompPolicy::trace_osr_request(methodHandle method, nmethod* osr, int bci) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   398
  if (TraceOnStackReplacement) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   399
    ResourceMark rm;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   400
    tty->print(osr != NULL ? "Reused OSR entry for " : "Requesting OSR entry for ");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   401
    method->print_short_name(tty);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   402
    tty->print_cr(" at bci %d", bci);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   403
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   404
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   405
#endif // !PRODUCT
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   406
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
// SimpleCompPolicy - compile current method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   409
void SimpleCompPolicy::method_invocation_event(methodHandle m, JavaThread* thread) {
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   410
  const int comp_level = CompLevel_highest_tier;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   411
  const int hot_count = m->invocation_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  reset_counter_for_invocation_event(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  const char* comment = "count";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   415
  if (is_compilation_enabled() && can_be_compiled(m)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    nmethod* nm = m->code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
    if (nm == NULL ) {
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   418
      CompileBroker::compile_method(m, InvocationEntryBci, comp_level, m, hot_count, comment, thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   423
void SimpleCompPolicy::method_back_branch_event(methodHandle m, int bci, JavaThread* thread) {
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   424
  const int comp_level = CompLevel_highest_tier;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   425
  const int hot_count = m->backedge_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  const char* comment = "backedge_count";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   428
  if (is_compilation_enabled() && !m->is_not_osr_compilable(comp_level) && can_be_compiled(m)) {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   429
    CompileBroker::compile_method(m, bci, comp_level, m, hot_count, comment, thread);
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   430
    NOT_PRODUCT(trace_osr_completion(m->lookup_osr_nmethod_for(bci, comp_level, true));)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
// StackWalkCompPolicy - walk up stack to find a suitable method to compile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
const char* StackWalkCompPolicy::_msg = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
// Consider m for compilation
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   440
void StackWalkCompPolicy::method_invocation_event(methodHandle m, JavaThread* thread) {
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   441
  const int comp_level = CompLevel_highest_tier;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   442
  const int hot_count = m->invocation_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  reset_counter_for_invocation_event(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  const char* comment = "count";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   446
  if (is_compilation_enabled() && m->code() == NULL && can_be_compiled(m)) {
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   447
    ResourceMark rm(thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    frame       fr     = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
    assert(fr.is_interpreted_frame(), "must be interpreted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    assert(fr.interpreter_frame_method() == m(), "bad method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    if (TraceCompilationPolicy) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
      tty->print("method invocation trigger: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
      m->print_short_name(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
      tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", (address)m(), m->code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    RegisterMap reg_map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    javaVFrame* triggerVF = thread->last_java_vframe(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    // triggerVF is the frame that triggered its counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    RFrame* first = new InterpretedRFrame(triggerVF->fr(), thread, m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    if (first->top_method()->code() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
      // called obsolete method/nmethod -- no need to recompile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
      if (TraceCompilationPolicy) tty->print_cr(" --> " INTPTR_FORMAT, first->top_method()->code());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
      if (TimeCompilationPolicy) accumulated_time()->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
      GrowableArray<RFrame*>* stack = new GrowableArray<RFrame*>(50);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
      stack->push(first);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
      RFrame* top = findTopInlinableFrame(stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
      if (TimeCompilationPolicy) accumulated_time()->stop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
      assert(top != NULL, "findTopInlinableFrame returned null");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
      if (TraceCompilationPolicy) top->print();
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   473
      CompileBroker::compile_method(top->top_method(), InvocationEntryBci, comp_level,
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   474
                                    m, hot_count, comment, thread);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
11572
84afef481892 7131259: compile_method and CompilationPolicy::event shouldn't be declared TRAPS
iveresov
parents: 10014
diff changeset
   479
void StackWalkCompPolicy::method_back_branch_event(methodHandle m, int bci, JavaThread* thread) {
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   480
  const int comp_level = CompLevel_highest_tier;
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   481
  const int hot_count = m->backedge_count();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  const char* comment = "backedge_count";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
13891
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   484
  if (is_compilation_enabled() && !m->is_not_osr_compilable(comp_level) && can_be_compiled(m)) {
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   485
    CompileBroker::compile_method(m, bci, comp_level, m, hot_count, comment, thread);
35dabd293e56 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 13728
diff changeset
   486
    NOT_PRODUCT(trace_osr_completion(m->lookup_osr_nmethod_for(bci, comp_level, true));)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
RFrame* StackWalkCompPolicy::findTopInlinableFrame(GrowableArray<RFrame*>* stack) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // go up the stack until finding a frame that (probably) won't be inlined
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // into its caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  RFrame* current = stack->at(0); // current choice for stopping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  assert( current && !current->is_compiled(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  const char* msg = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  while (1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
    // before going up the stack further, check if doing so would get us into
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    // compiled code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    RFrame* next = senderOf(current, stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    if( !next )               // No next frame up the stack?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
      break;                  // Then compile with current frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    methodHandle m = current->top_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    methodHandle next_m = next->top_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    if (TraceCompilationPolicy && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
      tty->print("[caller: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
      next_m->print_short_name(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
      tty->print("] ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    if( !Inline ) {           // Inlining turned off
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
      msg = "Inlining turned off";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    if (next_m->is_not_compilable()) { // Did fail to compile this before/
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
      msg = "caller not compilable";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
    if (next->num() > MaxRecompilationSearchLength) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
      // don't go up too high when searching for recompilees
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
      msg = "don't go up any further: > MaxRecompilationSearchLength";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    if (next->distance() > MaxInterpretedSearchLength) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      // don't go up too high when searching for recompilees
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
      msg = "don't go up any further: next > MaxInterpretedSearchLength";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    // Compiled frame above already decided not to inline;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    // do not recompile him.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    if (next->is_compiled()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
      msg = "not going up into optimized code";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
    // Interpreted frame above us was already compiled.  Do not force
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    // a recompile, although if the frame above us runs long enough an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    // OSR might still happen.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
    if( current->is_interpreted() && next_m->has_compiled_code() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
      msg = "not going up -- already compiled caller";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    // Compute how frequent this call site is.  We have current method 'm'.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
    // We know next method 'next_m' is interpreted.  Find the call site and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
    // check the various invocation counts.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    int invcnt = 0;             // Caller counts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
    if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
      invcnt = next_m->interpreter_invocation_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
    int cnt = 0;                // Call site counts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
    if (ProfileInterpreter && next_m->method_data() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
      int bci = next->top_vframe()->bci();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
      ProfileData* data = next_m->method_data()->bci_to_data(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
      if (data != NULL && data->is_CounterData())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
        cnt = data->as_CounterData()->count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    // Caller counts / call-site counts; i.e. is this call site
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    // a hot call site for method next_m?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
    int freq = (invcnt) ? cnt/invcnt : cnt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    // Check size and frequency limits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    if ((msg = shouldInline(m, freq, cnt)) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
    // Check inlining negative tests
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
    if ((msg = shouldNotInline(m)) != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    // If the caller method is too big or something then we do not want to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    // compile it just to inline a method
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   579
    if (!can_be_compiled(next_m)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
      msg = "caller cannot be compiled";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    if( next_m->name() == vmSymbols::class_initializer_name() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
      msg = "do not compile class initializer (OSR ok)";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
    if (TraceCompilationPolicy && Verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
      tty->print("\n\t     check caller: ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
      next_m->print_short_name(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
      tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", (address)next_m(), next_m->code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    current = next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  assert( !current || !current->is_compiled(), "" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  if (TraceCompilationPolicy && msg) tty->print("(%s)\n", msg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  return current;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
RFrame* StackWalkCompPolicy::senderOf(RFrame* rf, GrowableArray<RFrame*>* stack) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  RFrame* sender = rf->caller();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  if (sender && sender->num() == stack->length()) stack->push(sender);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  return sender;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
const char* StackWalkCompPolicy::shouldInline(methodHandle m, float freq, int cnt) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  // Allows targeted inlining
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  // positive filter: should send be inlined?  returns NULL (--> yes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  // or rejection msg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  int max_size = MaxInlineSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  int cost = m->code_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  // Check for too many throws (and not too huge)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  if (m->interpreter_throwout_count() > InlineThrowCount && cost < InlineThrowMaxSize ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  // bump the max size if the call is frequent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  if ((freq >= InlineFrequencyRatio) || (cnt >= InlineFrequencyCount)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    if (TraceFrequencyInlining) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
      tty->print("(Inlined frequent method)\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
      m->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    max_size = FreqInlineSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  if (cost > max_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
    return (_msg = "too big");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
const char* StackWalkCompPolicy::shouldNotInline(methodHandle m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  // negative filter: should send NOT be inlined?  returns NULL (--> inline) or rejection msg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  if (m->is_abstract()) return (_msg = "abstract method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  // note: we allow ik->is_abstract()
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13891
diff changeset
   643
  if (!m->method_holder()->is_initialized()) return (_msg = "method holder not initialized");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  if (m->is_native()) return (_msg = "native method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  nmethod* m_code = m->code();
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5547
diff changeset
   646
  if (m_code != NULL && m_code->code_size() > InlineSmallCode)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    return (_msg = "already compiled into a big method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // use frequency-based objections only for non-trivial methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  if (m->code_size() <= MaxTrivialSize) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  if (UseInterpreter) {     // don't use counts with -Xcomp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
    if ((m->code() == NULL) && m->was_never_executed()) return (_msg = "never executed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    if (!m->was_executed_more_than(MIN2(MinInliningThreshold, CompileThreshold >> 1))) return (_msg = "executed < MinInliningThreshold times");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 11572
diff changeset
   655
  if (Method::has_unloaded_classes_in_signature(m, JavaThread::current())) return (_msg = "unloaded signature classes");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
#endif // COMPILER2