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