hotspot/src/share/vm/compiler/compileBroker.cpp
changeset 16372 20c2c4dc8b77
parent 15946 f688e7528dc6
child 16611 6807a703dd6b
equal deleted inserted replaced
16371:5a0b66604a5b 16372:20c2c4dc8b77
    63 HS_DTRACE_PROBE_DECL8(hotspot, method__compile__begin,
    63 HS_DTRACE_PROBE_DECL8(hotspot, method__compile__begin,
    64   char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t);
    64   char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t);
    65 HS_DTRACE_PROBE_DECL9(hotspot, method__compile__end,
    65 HS_DTRACE_PROBE_DECL9(hotspot, method__compile__end,
    66   char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t, bool);
    66   char*, intptr_t, char*, intptr_t, char*, intptr_t, char*, intptr_t, bool);
    67 
    67 
    68 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method)              \
    68 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method, comp_name)   \
    69   {                                                                      \
    69   {                                                                      \
    70     char* comp_name = (char*)(compiler)->name();                         \
       
    71     Symbol* klass_name = (method)->klass_name();                         \
    70     Symbol* klass_name = (method)->klass_name();                         \
    72     Symbol* name = (method)->name();                                     \
    71     Symbol* name = (method)->name();                                     \
    73     Symbol* signature = (method)->signature();                           \
    72     Symbol* signature = (method)->signature();                           \
    74     HS_DTRACE_PROBE8(hotspot, method__compile__begin,                    \
    73     HS_DTRACE_PROBE8(hotspot, method__compile__begin,                    \
    75       comp_name, strlen(comp_name),                                      \
    74       comp_name, strlen(comp_name),                                      \
    76       klass_name->bytes(), klass_name->utf8_length(),                    \
    75       klass_name->bytes(), klass_name->utf8_length(),                    \
    77       name->bytes(), name->utf8_length(),                                \
    76       name->bytes(), name->utf8_length(),                                \
    78       signature->bytes(), signature->utf8_length());                     \
    77       signature->bytes(), signature->utf8_length());                     \
    79   }
    78   }
    80 
    79 
    81 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success)       \
    80 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method,                \
       
    81                                         comp_name, success)              \
    82   {                                                                      \
    82   {                                                                      \
    83     char* comp_name = (char*)(compiler)->name();                         \
       
    84     Symbol* klass_name = (method)->klass_name();                         \
    83     Symbol* klass_name = (method)->klass_name();                         \
    85     Symbol* name = (method)->name();                                     \
    84     Symbol* name = (method)->name();                                     \
    86     Symbol* signature = (method)->signature();                           \
    85     Symbol* signature = (method)->signature();                           \
    87     HS_DTRACE_PROBE9(hotspot, method__compile__end,                      \
    86     HS_DTRACE_PROBE9(hotspot, method__compile__end,                      \
    88       comp_name, strlen(comp_name),                                      \
    87       comp_name, strlen(comp_name),                                      \
    91       signature->bytes(), signature->utf8_length(), (success));          \
    90       signature->bytes(), signature->utf8_length(), (success));          \
    92   }
    91   }
    93 
    92 
    94 #else /* USDT2 */
    93 #else /* USDT2 */
    95 
    94 
    96 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method)              \
    95 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method, comp_name)   \
    97   {                                                                      \
    96   {                                                                      \
    98     char* comp_name = (char*)(compiler)->name();                         \
       
    99     Symbol* klass_name = (method)->klass_name();                         \
    97     Symbol* klass_name = (method)->klass_name();                         \
   100     Symbol* name = (method)->name();                                     \
    98     Symbol* name = (method)->name();                                     \
   101     Symbol* signature = (method)->signature();                           \
    99     Symbol* signature = (method)->signature();                           \
   102     HOTSPOT_METHOD_COMPILE_BEGIN(                                       \
   100     HOTSPOT_METHOD_COMPILE_BEGIN(                                        \
   103       comp_name, strlen(comp_name),                                      \
   101       comp_name, strlen(comp_name),                                      \
   104       (char *) klass_name->bytes(), klass_name->utf8_length(),          \
   102       (char *) klass_name->bytes(), klass_name->utf8_length(),           \
   105       (char *) name->bytes(), name->utf8_length(),                       \
   103       (char *) name->bytes(), name->utf8_length(),                       \
   106       (char *) signature->bytes(), signature->utf8_length());            \
   104       (char *) signature->bytes(), signature->utf8_length());            \
   107   }
   105   }
   108 
   106 
   109 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success)       \
   107 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method,                \
       
   108                                         comp_name, success)              \
   110   {                                                                      \
   109   {                                                                      \
   111     char* comp_name = (char*)(compiler)->name();                         \
       
   112     Symbol* klass_name = (method)->klass_name();                         \
   110     Symbol* klass_name = (method)->klass_name();                         \
   113     Symbol* name = (method)->name();                                     \
   111     Symbol* name = (method)->name();                                     \
   114     Symbol* signature = (method)->signature();                           \
   112     Symbol* signature = (method)->signature();                           \
   115     HOTSPOT_METHOD_COMPILE_END(                                          \
   113     HOTSPOT_METHOD_COMPILE_END(                                          \
   116       comp_name, strlen(comp_name),                                      \
   114       comp_name, strlen(comp_name),                                      \
   120   }
   118   }
   121 #endif /* USDT2 */
   119 #endif /* USDT2 */
   122 
   120 
   123 #else //  ndef DTRACE_ENABLED
   121 #else //  ndef DTRACE_ENABLED
   124 
   122 
   125 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method)
   123 #define DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler, method, comp_name)
   126 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, success)
   124 #define DTRACE_METHOD_COMPILE_END_PROBE(compiler, method, comp_name, success)
   127 
   125 
   128 #endif // ndef DTRACE_ENABLED
   126 #endif // ndef DTRACE_ENABLED
   129 
   127 
   130 bool CompileBroker::_initialized = false;
   128 bool CompileBroker::_initialized = false;
   131 volatile bool CompileBroker::_should_block = false;
   129 volatile bool CompileBroker::_should_block = false;
   357 //
   355 //
   358 // Otherwise it's the same as CompileTask::print_line()
   356 // Otherwise it's the same as CompileTask::print_line()
   359 //
   357 //
   360 void CompileTask::print_line_on_error(outputStream* st, char* buf, int buflen) {
   358 void CompileTask::print_line_on_error(outputStream* st, char* buf, int buflen) {
   361   // print compiler name
   359   // print compiler name
   362   st->print("%s:", CompileBroker::compiler(comp_level())->name());
   360   st->print("%s:", CompileBroker::compiler_name(comp_level()));
   363   print_compilation(st);
   361   print_compilation(st);
   364 }
   362 }
   365 
   363 
   366 // ------------------------------------------------------------------
   364 // ------------------------------------------------------------------
   367 // CompileTask::print_line
   365 // CompileTask::print_line
   368 void CompileTask::print_line() {
   366 void CompileTask::print_line() {
   369   ttyLocker ttyl;  // keep the following output all in one block
   367   ttyLocker ttyl;  // keep the following output all in one block
   370   // print compiler name if requested
   368   // print compiler name if requested
   371   if (CIPrintCompilerName) tty->print("%s:", CompileBroker::compiler(comp_level())->name());
   369   if (CIPrintCompilerName) tty->print("%s:", CompileBroker::compiler_name(comp_level()));
   372   print_compilation();
   370   print_compilation();
   373 }
   371 }
   374 
   372 
   375 
   373 
   376 // ------------------------------------------------------------------
   374 // ------------------------------------------------------------------
  1215 
  1213 
  1216   // return quickly if possible
  1214   // return quickly if possible
  1217 
  1215 
  1218   // lock, make sure that the compilation
  1216   // lock, make sure that the compilation
  1219   // isn't prohibited in a straightforward way.
  1217   // isn't prohibited in a straightforward way.
  1220 
  1218   AbstractCompiler *comp = CompileBroker::compiler(comp_level);
  1221   if (compiler(comp_level) == NULL || !compiler(comp_level)->can_compile_method(method) || compilation_is_prohibited(method, osr_bci, comp_level)) {
  1219   if (comp == NULL || !comp->can_compile_method(method) ||
       
  1220       compilation_is_prohibited(method, osr_bci, comp_level)) {
  1222     return NULL;
  1221     return NULL;
  1223   }
  1222   }
  1224 
  1223 
  1225   if (osr_bci == InvocationEntryBci) {
  1224   if (osr_bci == InvocationEntryBci) {
  1226     // standard compilation
  1225     // standard compilation
  1253     if (method->is_not_osr_compilable(comp_level)) return NULL;
  1252     if (method->is_not_osr_compilable(comp_level)) return NULL;
  1254   }
  1253   }
  1255 
  1254 
  1256   assert(!HAS_PENDING_EXCEPTION, "No exception should be present");
  1255   assert(!HAS_PENDING_EXCEPTION, "No exception should be present");
  1257   // some prerequisites that are compiler specific
  1256   // some prerequisites that are compiler specific
  1258   if (compiler(comp_level)->is_c2() || compiler(comp_level)->is_shark()) {
  1257   if (comp->is_c2() || comp->is_shark()) {
  1259     method->constants()->resolve_string_constants(CHECK_AND_CLEAR_NULL);
  1258     method->constants()->resolve_string_constants(CHECK_AND_CLEAR_NULL);
  1260     // Resolve all classes seen in the signature of the method
  1259     // Resolve all classes seen in the signature of the method
  1261     // we are compiling.
  1260     // we are compiling.
  1262     Method::load_signature_classes(method, CHECK_AND_CLEAR_NULL);
  1261     Method::load_signature_classes(method, CHECK_AND_CLEAR_NULL);
  1263   }
  1262   }
  1370 //
  1369 //
  1371 // See if this compilation is not allowed.
  1370 // See if this compilation is not allowed.
  1372 bool CompileBroker::compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level) {
  1371 bool CompileBroker::compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level) {
  1373   bool is_native = method->is_native();
  1372   bool is_native = method->is_native();
  1374   // Some compilers may not support the compilation of natives.
  1373   // Some compilers may not support the compilation of natives.
       
  1374   AbstractCompiler *comp = compiler(comp_level);
  1375   if (is_native &&
  1375   if (is_native &&
  1376       (!CICompileNatives || !compiler(comp_level)->supports_native())) {
  1376       (!CICompileNatives || comp == NULL || !comp->supports_native())) {
  1377     method->set_not_compilable_quietly(comp_level);
  1377     method->set_not_compilable_quietly(comp_level);
  1378     return true;
  1378     return true;
  1379   }
  1379   }
  1380 
  1380 
  1381   bool is_osr = (osr_bci != standard_entry_bci);
  1381   bool is_osr = (osr_bci != standard_entry_bci);
  1382   // Some compilers may not support on stack replacement.
  1382   // Some compilers may not support on stack replacement.
  1383   if (is_osr &&
  1383   if (is_osr &&
  1384       (!CICompileOSR || !compiler(comp_level)->supports_osr())) {
  1384       (!CICompileOSR || comp == NULL || !comp->supports_osr())) {
  1385     method->set_not_osr_compilable(comp_level);
  1385     method->set_not_osr_compilable(comp_level);
  1386     return true;
  1386     return true;
  1387   }
  1387   }
  1388 
  1388 
  1389   // The method may be explicitly excluded by the user.
  1389   // The method may be explicitly excluded by the user.
  1751   uint compile_id = task->compile_id();
  1751   uint compile_id = task->compile_id();
  1752   int osr_bci = task->osr_bci();
  1752   int osr_bci = task->osr_bci();
  1753   bool is_osr = (osr_bci != standard_entry_bci);
  1753   bool is_osr = (osr_bci != standard_entry_bci);
  1754   bool should_log = (thread->log() != NULL);
  1754   bool should_log = (thread->log() != NULL);
  1755   bool should_break = false;
  1755   bool should_break = false;
       
  1756   int task_level = task->comp_level();
  1756   {
  1757   {
  1757     // create the handle inside it's own block so it can't
  1758     // create the handle inside it's own block so it can't
  1758     // accidentally be referenced once the thread transitions to
  1759     // accidentally be referenced once the thread transitions to
  1759     // native.  The NoHandleMark before the transition should catch
  1760     // native.  The NoHandleMark before the transition should catch
  1760     // any cases where this occurs in the future.
  1761     // any cases where this occurs in the future.
  1764       should_log = false;
  1765       should_log = false;
  1765     }
  1766     }
  1766     assert(!method->is_native(), "no longer compile natives");
  1767     assert(!method->is_native(), "no longer compile natives");
  1767 
  1768 
  1768     // Save information about this method in case of failure.
  1769     // Save information about this method in case of failure.
  1769     set_last_compile(thread, method, is_osr, task->comp_level());
  1770     set_last_compile(thread, method, is_osr, task_level);
  1770 
  1771 
  1771     DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler(task->comp_level()), method);
  1772     DTRACE_METHOD_COMPILE_BEGIN_PROBE(compiler(task_level), method,
       
  1773                                       compiler_name(task_level));
  1772   }
  1774   }
  1773 
  1775 
  1774   // Allocate a new set of JNI handles.
  1776   // Allocate a new set of JNI handles.
  1775   push_jni_handle_block();
  1777   push_jni_handle_block();
  1776   Method* target_handle = task->method();
  1778   Method* target_handle = task->method();
  1803 
  1805 
  1804     ciMethod* target = ci_env.get_method_from_handle(target_handle);
  1806     ciMethod* target = ci_env.get_method_from_handle(target_handle);
  1805 
  1807 
  1806     TraceTime t1("compilation", &time);
  1808     TraceTime t1("compilation", &time);
  1807 
  1809 
  1808     compiler(task->comp_level())->compile_method(&ci_env, target, osr_bci);
  1810     AbstractCompiler *comp = compiler(task_level);
       
  1811     if (comp == NULL) {
       
  1812       ci_env.record_method_not_compilable("no compiler", !TieredCompilation);
       
  1813     } else {
       
  1814       comp->compile_method(&ci_env, target, osr_bci);
       
  1815     }
  1809 
  1816 
  1810     if (!ci_env.failing() && task->code() == NULL) {
  1817     if (!ci_env.failing() && task->code() == NULL) {
  1811       //assert(false, "compiler should always document failure");
  1818       //assert(false, "compiler should always document failure");
  1812       // The compiler elected, without comment, not to register a result.
  1819       // The compiler elected, without comment, not to register a result.
  1813       // Do not attempt further compilations of this method.
  1820       // Do not attempt further compilations of this method.
  1841   }
  1848   }
  1842   pop_jni_handle_block();
  1849   pop_jni_handle_block();
  1843 
  1850 
  1844   methodHandle method(thread, task->method());
  1851   methodHandle method(thread, task->method());
  1845 
  1852 
  1846   DTRACE_METHOD_COMPILE_END_PROBE(compiler(task->comp_level()), method, task->is_success());
  1853   DTRACE_METHOD_COMPILE_END_PROBE(compiler(task_level), method,
       
  1854                                   compiler_name(task_level), task->is_success());
  1847 
  1855 
  1848   collect_statistics(thread, time, task);
  1856   collect_statistics(thread, time, task);
  1849 
  1857 
  1850   if (PrintCompilation && PrintCompilation2) {
  1858   if (PrintCompilation && PrintCompilation2) {
  1851     tty->print("%7d ", (int) tty->time_stamp().milliseconds());  // print timestamp
  1859     tty->print("%7d ", (int) tty->time_stamp().milliseconds());  // print timestamp
  1866     else
  1874     else
  1867       method->set_not_compilable_quietly();
  1875       method->set_not_compilable_quietly();
  1868     break;
  1876     break;
  1869   case ciEnv::MethodCompilable_not_at_tier:
  1877   case ciEnv::MethodCompilable_not_at_tier:
  1870     if (is_osr)
  1878     if (is_osr)
  1871       method->set_not_osr_compilable_quietly(task->comp_level());
  1879       method->set_not_osr_compilable_quietly(task_level);
  1872     else
  1880     else
  1873       method->set_not_compilable_quietly(task->comp_level());
  1881       method->set_not_compilable_quietly(task_level);
  1874     break;
  1882     break;
  1875   }
  1883   }
  1876 
  1884 
  1877   // Note that the queued_for_compilation bits are cleared without
  1885   // Note that the queued_for_compilation bits are cleared without
  1878   // protection of a mutex. [They were set by the requester thread,
  1886   // protection of a mutex. [They were set by the requester thread,
  2126   }
  2134   }
  2127   // set the current method for the thread to null
  2135   // set the current method for the thread to null
  2128   if (UsePerfData) counters->set_current_method("");
  2136   if (UsePerfData) counters->set_current_method("");
  2129 }
  2137 }
  2130 
  2138 
  2131 
  2139 const char* CompileBroker::compiler_name(int comp_level) {
       
  2140   AbstractCompiler *comp = CompileBroker::compiler(comp_level);
       
  2141   if (comp == NULL) {
       
  2142     return "no compiler";
       
  2143   } else {
       
  2144     return (comp->name());
       
  2145   }
       
  2146 }
  2132 
  2147 
  2133 void CompileBroker::print_times() {
  2148 void CompileBroker::print_times() {
  2134   tty->cr();
  2149   tty->cr();
  2135   tty->print_cr("Accumulated compiler times (for compiled methods only)");
  2150   tty->print_cr("Accumulated compiler times (for compiled methods only)");
  2136   tty->print_cr("------------------------------------------------");
  2151   tty->print_cr("------------------------------------------------");
  2140   tty->print_cr("    Standard compilation   : %6.3f s, Average : %2.3f",
  2155   tty->print_cr("    Standard compilation   : %6.3f s, Average : %2.3f",
  2141                 CompileBroker::_t_standard_compilation.seconds(),
  2156                 CompileBroker::_t_standard_compilation.seconds(),
  2142                 CompileBroker::_t_standard_compilation.seconds() / CompileBroker::_total_standard_compile_count);
  2157                 CompileBroker::_t_standard_compilation.seconds() / CompileBroker::_total_standard_compile_count);
  2143   tty->print_cr("    On stack replacement   : %6.3f s, Average : %2.3f", CompileBroker::_t_osr_compilation.seconds(), CompileBroker::_t_osr_compilation.seconds() / CompileBroker::_total_osr_compile_count);
  2158   tty->print_cr("    On stack replacement   : %6.3f s, Average : %2.3f", CompileBroker::_t_osr_compilation.seconds(), CompileBroker::_t_osr_compilation.seconds() / CompileBroker::_total_osr_compile_count);
  2144 
  2159 
  2145   if (compiler(CompLevel_simple) != NULL) {
  2160   AbstractCompiler *comp = compiler(CompLevel_simple);
  2146     compiler(CompLevel_simple)->print_timers();
  2161   if (comp != NULL) {
  2147   }
  2162     comp->print_timers();
  2148   if (compiler(CompLevel_full_optimization) != NULL) {
  2163   }
  2149     compiler(CompLevel_full_optimization)->print_timers();
  2164   comp = compiler(CompLevel_full_optimization);
       
  2165   if (comp != NULL) {
       
  2166     comp->print_timers();
  2150   }
  2167   }
  2151   tty->cr();
  2168   tty->cr();
  2152   int tcb = CompileBroker::_sum_osr_bytes_compiled + CompileBroker::_sum_standard_bytes_compiled;
  2169   int tcb = CompileBroker::_sum_osr_bytes_compiled + CompileBroker::_sum_standard_bytes_compiled;
  2153   tty->print_cr("  Total compiled bytecodes : %6d bytes", tcb);
  2170   tty->print_cr("  Total compiled bytecodes : %6d bytes", tcb);
  2154   tty->print_cr("    Standard compilation   : %6d bytes", CompileBroker::_sum_standard_bytes_compiled);
  2171   tty->print_cr("    Standard compilation   : %6d bytes", CompileBroker::_sum_standard_bytes_compiled);