1 /*
   2  * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "compiler/compileBroker.hpp"
  27 #include "memory/resourceArea.hpp"
  28 #include "runtime/arguments.hpp"
  29 #include "runtime/simpleThresholdPolicy.hpp"
  30 #include "runtime/simpleThresholdPolicy.inline.hpp"
  31 #include "code/scopeDesc.hpp"
  32 
  33 // Print an event.
  34 void SimpleThresholdPolicy::print_event(EventType type, methodHandle mh, methodHandle imh,
  35                                         int bci, CompLevel level) {
  36   bool inlinee_event = mh() != imh();
  37 
  38   ttyLocker tty_lock;
  39   tty->print("%lf: [", os::elapsedTime());
  40 
  41   int invocation_count = mh->invocation_count();
  42   int backedge_count = mh->backedge_count();
  43   switch(type) {
  44   case CALL:
  45     tty->print("call");
  46     break;
  47   case LOOP:
  48     tty->print("loop");
  49     break;
  50   case COMPILE:
  51     tty->print("compile");
  52     break;
  53   case REMOVE_FROM_QUEUE:
  54     tty->print("remove-from-queue");
  55     break;
  56   case UPDATE_IN_QUEUE:
  57     tty->print("update-in-queue");
  58     break;
  59   case REPROFILE:
  60     tty->print("reprofile");
  61     break;
  62   case MAKE_NOT_ENTRANT:
  63     tty->print("make-not-entrant");
  64     break;
  65   default:
  66     tty->print("unknown");
  67   }
  68 
  69   tty->print(" level: %d ", level);
  70 
  71   ResourceMark rm;
  72   char *method_name = mh->name_and_sig_as_C_string();
  73   tty->print("[%s", method_name);
  74   if (inlinee_event) {
  75     char *inlinee_name = imh->name_and_sig_as_C_string();
  76     tty->print(" [%s]] ", inlinee_name);
  77   }
  78   else tty->print("] ");
  79   tty->print("@%d queues: %d,%d", bci, CompileBroker::queue_size(CompLevel_full_profile),
  80                                        CompileBroker::queue_size(CompLevel_full_optimization));
  81 
  82   print_specific(type, mh, imh, bci, level);
  83 
  84   if (type != COMPILE) {
  85     methodDataHandle mdh = mh->method_data();
  86     int mdo_invocations = 0, mdo_backedges = 0;
  87     int mdo_invocations_start = 0, mdo_backedges_start = 0;
  88     if (mdh() != NULL) {
  89       mdo_invocations = mdh->invocation_count();
  90       mdo_backedges = mdh->backedge_count();
  91       mdo_invocations_start = mdh->invocation_count_start();
  92       mdo_backedges_start = mdh->backedge_count_start();
  93     }
  94     tty->print(" total: %d,%d mdo: %d(%d),%d(%d)",
  95                invocation_count, backedge_count,
  96                mdo_invocations, mdo_invocations_start,
  97                mdo_backedges, mdo_backedges_start);
  98     tty->print(" max levels: %d,%d",
  99                 mh->highest_comp_level(), mh->highest_osr_comp_level());
 100     if (inlinee_event) {
 101       tty->print(" inlinee max levels: %d,%d", imh->highest_comp_level(), imh->highest_osr_comp_level());
 102     }
 103     tty->print(" compilable: ");
 104     bool need_comma = false;
 105     if (!mh->is_not_compilable(CompLevel_full_profile)) {
 106       tty->print("c1");
 107       need_comma = true;
 108     }
 109     if (!mh->is_not_compilable(CompLevel_full_optimization)) {
 110       if (need_comma) tty->print(", ");
 111       tty->print("c2");
 112       need_comma = true;
 113     }
 114     if (!mh->is_not_osr_compilable()) {
 115       if (need_comma) tty->print(", ");
 116       tty->print("osr");
 117     }
 118     tty->print(" status:");
 119     if (mh->queued_for_compilation()) {
 120       tty->print(" in queue");
 121     } else tty->print(" idle");
 122   }
 123   tty->print_cr("]");
 124 }
 125 
 126 void SimpleThresholdPolicy::initialize() {
 127   if (FLAG_IS_DEFAULT(CICompilerCount)) {
 128     FLAG_SET_DEFAULT(CICompilerCount, 3);
 129   }
 130   int count = CICompilerCount;
 131   if (CICompilerCountPerCPU) {
 132     count = MAX2(log2_intptr(os::active_processor_count()), 1) * 3 / 2;
 133   }
 134   set_c1_count(MAX2(count / 3, 1));
 135   set_c2_count(MAX2(count - count / 3, 1));
 136 }
 137 
 138 void SimpleThresholdPolicy::set_carry_if_necessary(InvocationCounter *counter) {
 139   if (!counter->carry() && counter->count() > InvocationCounter::count_limit / 2) {
 140     counter->set_carry_flag();
 141   }
 142 }
 143 
 144 // Set carry flags on the counters if necessary
 145 void SimpleThresholdPolicy::handle_counter_overflow(methodOop method) {
 146   set_carry_if_necessary(method->invocation_counter());
 147   set_carry_if_necessary(method->backedge_counter());
 148   methodDataOop mdo = method->method_data();
 149   if (mdo != NULL) {
 150     set_carry_if_necessary(mdo->invocation_counter());
 151     set_carry_if_necessary(mdo->backedge_counter());
 152   }
 153 }
 154 
 155 // Called with the queue locked and with at least one element
 156 CompileTask* SimpleThresholdPolicy::select_task(CompileQueue* compile_queue) {
 157   return compile_queue->first();
 158 }
 159 
 160 void SimpleThresholdPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) {
 161   for (ScopeDesc* sd = trap_scope;; sd = sd->sender()) {
 162     if (PrintTieredEvents) {
 163       methodHandle mh(sd->method());
 164       print_event(REPROFILE, mh, mh, InvocationEntryBci, CompLevel_none);
 165     }
 166     methodDataOop mdo = sd->method()->method_data();
 167     if (mdo != NULL) {
 168       mdo->reset_start_counters();
 169     }
 170     if (sd->is_top()) break;
 171   }
 172 }
 173 
 174 nmethod* SimpleThresholdPolicy::event(methodHandle method, methodHandle inlinee,
 175                                       int branch_bci, int bci, CompLevel comp_level, nmethod* nm, TRAPS) {
 176   if (comp_level == CompLevel_none &&
 177       JvmtiExport::can_post_interpreter_events()) {
 178     assert(THREAD->is_Java_thread(), "Should be java thread");
 179     if (((JavaThread*)THREAD)->is_interp_only_mode()) {
 180       return NULL;
 181     }
 182   }
 183   nmethod *osr_nm = NULL;
 184 
 185   handle_counter_overflow(method());
 186   if (method() != inlinee()) {
 187     handle_counter_overflow(inlinee());
 188   }
 189 
 190   if (PrintTieredEvents) {
 191     print_event(bci == InvocationEntryBci ? CALL : LOOP, method, inlinee, bci, comp_level);
 192   }
 193 
 194   if (bci == InvocationEntryBci) {
 195     method_invocation_event(method, inlinee, comp_level, nm, THREAD);
 196   } else {
 197     method_back_branch_event(method, inlinee, bci, comp_level, nm, THREAD);
 198     // method == inlinee if the event originated in the main method
 199     int highest_level = inlinee->highest_osr_comp_level();
 200     if (highest_level > comp_level) {
 201       osr_nm = inlinee->lookup_osr_nmethod_for(bci, highest_level, false);
 202     }
 203   }
 204   return osr_nm;
 205 }
 206 
 207 // Check if the method can be compiled, change level if necessary
 208 void SimpleThresholdPolicy::compile(methodHandle mh, int bci, CompLevel level, TRAPS) {
 209   assert(level <= TieredStopAtLevel, "Invalid compilation level");
 210   if (level == CompLevel_none) {
 211     return;
 212   }
 213   // Check if the method can be compiled. If it cannot be compiled with C1, continue profiling
 214   // in the interpreter and then compile with C2 (the transition function will request that,
 215   // see common() ). If the method cannot be compiled with C2 but still can with C1, compile it with
 216   // pure C1.
 217   if (!can_be_compiled(mh, level)) {
 218     if (level == CompLevel_full_optimization && can_be_compiled(mh, CompLevel_simple)) {
 219         compile(mh, bci, CompLevel_simple, THREAD);
 220     }
 221     return;
 222   }
 223   if (bci != InvocationEntryBci && mh->is_not_osr_compilable()) {
 224     return;
 225   }
 226   if (!CompileBroker::compilation_is_in_queue(mh, bci)) {
 227     if (PrintTieredEvents) {
 228       print_event(COMPILE, mh, mh, bci, level);
 229     }
 230     submit_compile(mh, bci, level, THREAD);
 231   }
 232 }
 233 
 234 // Tell the broker to compile the method
 235 void SimpleThresholdPolicy::submit_compile(methodHandle mh, int bci, CompLevel level, TRAPS) {
 236   int hot_count = (bci == InvocationEntryBci) ? mh->invocation_count() : mh->backedge_count();
 237   CompileBroker::compile_method(mh, bci, level, mh, hot_count, "tiered", THREAD);
 238 }
 239 
 240 // Call and loop predicates determine whether a transition to a higher
 241 // compilation level should be performed (pointers to predicate functions
 242 // are passed to common() transition function).
 243 bool SimpleThresholdPolicy::loop_predicate(int i, int b, CompLevel cur_level) {
 244   switch(cur_level) {
 245   case CompLevel_none:
 246   case CompLevel_limited_profile: {
 247     return loop_predicate_helper<CompLevel_none>(i, b, 1.0);
 248   }
 249   case CompLevel_full_profile: {
 250     return loop_predicate_helper<CompLevel_full_profile>(i, b, 1.0);
 251   }
 252   default:
 253     return true;
 254   }
 255 }
 256 
 257 bool SimpleThresholdPolicy::call_predicate(int i, int b, CompLevel cur_level) {
 258   switch(cur_level) {
 259   case CompLevel_none:
 260   case CompLevel_limited_profile: {
 261     return call_predicate_helper<CompLevel_none>(i, b, 1.0);
 262   }
 263   case CompLevel_full_profile: {
 264     return call_predicate_helper<CompLevel_full_profile>(i, b, 1.0);
 265   }
 266   default:
 267     return true;
 268   }
 269 }
 270 
 271 // Determine is a method is mature.
 272 bool SimpleThresholdPolicy::is_mature(methodOop method) {
 273   if (is_trivial(method)) return true;
 274   methodDataOop mdo = method->method_data();
 275   if (mdo != NULL) {
 276     int i = mdo->invocation_count();
 277     int b = mdo->backedge_count();
 278     double k = ProfileMaturityPercentage / 100.0;
 279     return call_predicate_helper<CompLevel_full_profile>(i, b, k) ||
 280            loop_predicate_helper<CompLevel_full_profile>(i, b, k);
 281   }
 282   return false;
 283 }
 284 
 285 // Common transition function. Given a predicate determines if a method should transition to another level.
 286 CompLevel SimpleThresholdPolicy::common(Predicate p, methodOop method, CompLevel cur_level) {
 287   CompLevel next_level = cur_level;
 288   int i = method->invocation_count();
 289   int b = method->backedge_count();
 290 
 291   if (is_trivial(method)) {
 292     next_level = CompLevel_simple;
 293   } else {
 294     switch(cur_level) {
 295     case CompLevel_none:
 296       // If we were at full profile level, would we switch to full opt?
 297       if (common(p, method, CompLevel_full_profile) == CompLevel_full_optimization) {
 298         next_level = CompLevel_full_optimization;
 299       } else if ((this->*p)(i, b, cur_level)) {
 300         next_level = CompLevel_full_profile;
 301       }
 302       break;
 303     case CompLevel_limited_profile:
 304     case CompLevel_full_profile:
 305       {
 306         methodDataOop mdo = method->method_data();
 307         if (mdo != NULL) {
 308           if (mdo->would_profile()) {
 309             int mdo_i = mdo->invocation_count_delta();
 310             int mdo_b = mdo->backedge_count_delta();
 311             if ((this->*p)(mdo_i, mdo_b, cur_level)) {
 312               next_level = CompLevel_full_optimization;
 313             }
 314           } else {
 315             next_level = CompLevel_full_optimization;
 316           }
 317         }
 318       }
 319       break;
 320     }
 321   }
 322   return MIN2(next_level, (CompLevel)TieredStopAtLevel);
 323 }
 324 
 325 // Determine if a method should be compiled with a normal entry point at a different level.
 326 CompLevel SimpleThresholdPolicy::call_event(methodOop method,  CompLevel cur_level) {
 327   CompLevel osr_level = MIN2((CompLevel) method->highest_osr_comp_level(),
 328                              common(&SimpleThresholdPolicy::loop_predicate, method, cur_level));
 329   CompLevel next_level = common(&SimpleThresholdPolicy::call_predicate, method, cur_level);
 330 
 331   // If OSR method level is greater than the regular method level, the levels should be
 332   // equalized by raising the regular method level in order to avoid OSRs during each
 333   // invocation of the method.
 334   if (osr_level == CompLevel_full_optimization && cur_level == CompLevel_full_profile) {
 335     methodDataOop mdo = method->method_data();
 336     guarantee(mdo != NULL, "MDO should not be NULL");
 337     if (mdo->invocation_count() >= 1) {
 338       next_level = CompLevel_full_optimization;
 339     }
 340   } else {
 341     next_level = MAX2(osr_level, next_level);
 342   }
 343 
 344   return next_level;
 345 }
 346 
 347 // Determine if we should do an OSR compilation of a given method.
 348 CompLevel SimpleThresholdPolicy::loop_event(methodOop method, CompLevel cur_level) {
 349   CompLevel next_level = common(&SimpleThresholdPolicy::loop_predicate, method, cur_level);
 350   if (cur_level == CompLevel_none) {
 351     // If there is a live OSR method that means that we deopted to the interpreter
 352     // for the transition.
 353     CompLevel osr_level = MIN2((CompLevel)method->highest_osr_comp_level(), next_level);
 354     if (osr_level > CompLevel_none) {
 355       return osr_level;
 356     }
 357   }
 358   return next_level;
 359 }
 360 
 361 
 362 // Handle the invocation event.
 363 void SimpleThresholdPolicy::method_invocation_event(methodHandle mh, methodHandle imh,
 364                                               CompLevel level, nmethod* nm, TRAPS) {
 365   if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, InvocationEntryBci)) {
 366     CompLevel next_level = call_event(mh(), level);
 367     if (next_level != level) {
 368       compile(mh, InvocationEntryBci, next_level, THREAD);
 369     }
 370   }
 371 }
 372 
 373 // Handle the back branch event. Notice that we can compile the method
 374 // with a regular entry from here.
 375 void SimpleThresholdPolicy::method_back_branch_event(methodHandle mh, methodHandle imh,
 376                                                      int bci, CompLevel level, nmethod* nm, TRAPS) {
 377   // If the method is already compiling, quickly bail out.
 378   if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, bci)) {
 379     // Use loop event as an opportinity to also check there's been
 380     // enough calls.
 381     CompLevel cur_level = comp_level(mh());
 382     CompLevel next_level = call_event(mh(), cur_level);
 383     CompLevel next_osr_level = loop_event(mh(), level);
 384 
 385     next_level = MAX2(next_level,
 386                       next_osr_level < CompLevel_full_optimization ? next_osr_level : cur_level);
 387     bool is_compiling = false;
 388     if (next_level != cur_level) {
 389       compile(mh, InvocationEntryBci, next_level, THREAD);
 390       is_compiling = true;
 391     }
 392 
 393     // Do the OSR version
 394     if (!is_compiling && next_osr_level != level) {
 395       compile(mh, bci, next_osr_level, THREAD);
 396     }
 397   }
 398 }