1 | /* |
2 | * Copyright (c) 2010, 2019, 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 "compiler/compilerOracle.hpp" |
28 | #include "memory/resourceArea.hpp" |
29 | #include "runtime/arguments.hpp" |
30 | #include "runtime/handles.inline.hpp" |
31 | #include "runtime/safepoint.hpp" |
32 | #include "runtime/safepointVerifiers.hpp" |
33 | #include "runtime/tieredThresholdPolicy.hpp" |
34 | #include "code/scopeDesc.hpp" |
35 | #include "oops/method.inline.hpp" |
36 | #if INCLUDE_JVMCI |
37 | #include "jvmci/jvmci.hpp" |
38 | #endif |
39 | |
40 | #ifdef TIERED |
41 | |
42 | #include "c1/c1_Compiler.hpp" |
43 | #include "opto/c2compiler.hpp" |
44 | |
45 | template<CompLevel level> |
46 | bool TieredThresholdPolicy::call_predicate_helper(int i, int b, double scale, Method* method) { |
47 | double threshold_scaling; |
48 | if (CompilerOracle::has_option_value(method, "CompileThresholdScaling" , threshold_scaling)) { |
49 | scale *= threshold_scaling; |
50 | } |
51 | switch(level) { |
52 | case CompLevel_aot: |
53 | return (i >= Tier3AOTInvocationThreshold * scale) || |
54 | (i >= Tier3AOTMinInvocationThreshold * scale && i + b >= Tier3AOTCompileThreshold * scale); |
55 | case CompLevel_none: |
56 | case CompLevel_limited_profile: |
57 | return (i >= Tier3InvocationThreshold * scale) || |
58 | (i >= Tier3MinInvocationThreshold * scale && i + b >= Tier3CompileThreshold * scale); |
59 | case CompLevel_full_profile: |
60 | return (i >= Tier4InvocationThreshold * scale) || |
61 | (i >= Tier4MinInvocationThreshold * scale && i + b >= Tier4CompileThreshold * scale); |
62 | } |
63 | return true; |
64 | } |
65 | |
66 | template<CompLevel level> |
67 | bool TieredThresholdPolicy::loop_predicate_helper(int i, int b, double scale, Method* method) { |
68 | double threshold_scaling; |
69 | if (CompilerOracle::has_option_value(method, "CompileThresholdScaling" , threshold_scaling)) { |
70 | scale *= threshold_scaling; |
71 | } |
72 | switch(level) { |
73 | case CompLevel_aot: |
74 | return b >= Tier3AOTBackEdgeThreshold * scale; |
75 | case CompLevel_none: |
76 | case CompLevel_limited_profile: |
77 | return b >= Tier3BackEdgeThreshold * scale; |
78 | case CompLevel_full_profile: |
79 | return b >= Tier4BackEdgeThreshold * scale; |
80 | } |
81 | return true; |
82 | } |
83 | |
84 | // Simple methods are as good being compiled with C1 as C2. |
85 | // Determine if a given method is such a case. |
86 | bool TieredThresholdPolicy::is_trivial(Method* method) { |
87 | if (method->is_accessor() || |
88 | method->is_constant_getter()) { |
89 | return true; |
90 | } |
91 | return false; |
92 | } |
93 | |
94 | bool TieredThresholdPolicy::should_compile_at_level_simple(Method* method) { |
95 | if (TieredThresholdPolicy::is_trivial(method)) { |
96 | return true; |
97 | } |
98 | #if INCLUDE_JVMCI |
99 | if (UseJVMCICompiler) { |
100 | AbstractCompiler* comp = CompileBroker::compiler(CompLevel_full_optimization); |
101 | if (comp != NULL && comp->is_jvmci() && ((JVMCICompiler*) comp)->force_comp_at_level_simple(method)) { |
102 | return true; |
103 | } |
104 | } |
105 | #endif |
106 | return false; |
107 | } |
108 | |
109 | CompLevel TieredThresholdPolicy::comp_level(Method* method) { |
110 | CompiledMethod *nm = method->code(); |
111 | if (nm != NULL && nm->is_in_use()) { |
112 | return (CompLevel)nm->comp_level(); |
113 | } |
114 | return CompLevel_none; |
115 | } |
116 | |
117 | void TieredThresholdPolicy::print_counters(const char* prefix, const methodHandle& mh) { |
118 | int invocation_count = mh->invocation_count(); |
119 | int backedge_count = mh->backedge_count(); |
120 | MethodData* mdh = mh->method_data(); |
121 | int mdo_invocations = 0, mdo_backedges = 0; |
122 | int mdo_invocations_start = 0, mdo_backedges_start = 0; |
123 | if (mdh != NULL) { |
124 | mdo_invocations = mdh->invocation_count(); |
125 | mdo_backedges = mdh->backedge_count(); |
126 | mdo_invocations_start = mdh->invocation_count_start(); |
127 | mdo_backedges_start = mdh->backedge_count_start(); |
128 | } |
129 | tty->print(" %stotal=%d,%d %smdo=%d(%d),%d(%d)" , prefix, |
130 | invocation_count, backedge_count, prefix, |
131 | mdo_invocations, mdo_invocations_start, |
132 | mdo_backedges, mdo_backedges_start); |
133 | tty->print(" %smax levels=%d,%d" , prefix, |
134 | mh->highest_comp_level(), mh->highest_osr_comp_level()); |
135 | } |
136 | |
137 | // Print an event. |
138 | void TieredThresholdPolicy::print_event(EventType type, const methodHandle& mh, const methodHandle& imh, |
139 | int bci, CompLevel level) { |
140 | bool inlinee_event = mh() != imh(); |
141 | |
142 | ttyLocker tty_lock; |
143 | tty->print("%lf: [" , os::elapsedTime()); |
144 | |
145 | switch(type) { |
146 | case CALL: |
147 | tty->print("call" ); |
148 | break; |
149 | case LOOP: |
150 | tty->print("loop" ); |
151 | break; |
152 | case COMPILE: |
153 | tty->print("compile" ); |
154 | break; |
155 | case REMOVE_FROM_QUEUE: |
156 | tty->print("remove-from-queue" ); |
157 | break; |
158 | case UPDATE_IN_QUEUE: |
159 | tty->print("update-in-queue" ); |
160 | break; |
161 | case REPROFILE: |
162 | tty->print("reprofile" ); |
163 | break; |
164 | case MAKE_NOT_ENTRANT: |
165 | tty->print("make-not-entrant" ); |
166 | break; |
167 | default: |
168 | tty->print("unknown" ); |
169 | } |
170 | |
171 | tty->print(" level=%d " , level); |
172 | |
173 | ResourceMark rm; |
174 | char *method_name = mh->name_and_sig_as_C_string(); |
175 | tty->print("[%s" , method_name); |
176 | if (inlinee_event) { |
177 | char *inlinee_name = imh->name_and_sig_as_C_string(); |
178 | tty->print(" [%s]] " , inlinee_name); |
179 | } |
180 | else tty->print("] " ); |
181 | tty->print("@%d queues=%d,%d" , bci, CompileBroker::queue_size(CompLevel_full_profile), |
182 | CompileBroker::queue_size(CompLevel_full_optimization)); |
183 | |
184 | print_specific(type, mh, imh, bci, level); |
185 | |
186 | if (type != COMPILE) { |
187 | print_counters("" , mh); |
188 | if (inlinee_event) { |
189 | print_counters("inlinee " , imh); |
190 | } |
191 | tty->print(" compilable=" ); |
192 | bool need_comma = false; |
193 | if (!mh->is_not_compilable(CompLevel_full_profile)) { |
194 | tty->print("c1" ); |
195 | need_comma = true; |
196 | } |
197 | if (!mh->is_not_osr_compilable(CompLevel_full_profile)) { |
198 | if (need_comma) tty->print("," ); |
199 | tty->print("c1-osr" ); |
200 | need_comma = true; |
201 | } |
202 | if (!mh->is_not_compilable(CompLevel_full_optimization)) { |
203 | if (need_comma) tty->print("," ); |
204 | tty->print("c2" ); |
205 | need_comma = true; |
206 | } |
207 | if (!mh->is_not_osr_compilable(CompLevel_full_optimization)) { |
208 | if (need_comma) tty->print("," ); |
209 | tty->print("c2-osr" ); |
210 | } |
211 | tty->print(" status=" ); |
212 | if (mh->queued_for_compilation()) { |
213 | tty->print("in-queue" ); |
214 | } else tty->print("idle" ); |
215 | } |
216 | tty->print_cr("]" ); |
217 | } |
218 | |
219 | void TieredThresholdPolicy::initialize() { |
220 | int count = CICompilerCount; |
221 | bool c1_only = TieredStopAtLevel < CompLevel_full_optimization; |
222 | #ifdef _LP64 |
223 | // Turn on ergonomic compiler count selection |
224 | if (FLAG_IS_DEFAULT(CICompilerCountPerCPU) && FLAG_IS_DEFAULT(CICompilerCount)) { |
225 | FLAG_SET_DEFAULT(CICompilerCountPerCPU, true); |
226 | } |
227 | if (CICompilerCountPerCPU) { |
228 | // Simple log n seems to grow too slowly for tiered, try something faster: log n * log log n |
229 | int log_cpu = log2_int(os::active_processor_count()); |
230 | int loglog_cpu = log2_int(MAX2(log_cpu, 1)); |
231 | count = MAX2(log_cpu * loglog_cpu * 3 / 2, 2); |
232 | // Make sure there is enough space in the code cache to hold all the compiler buffers |
233 | size_t c1_size = Compiler::code_buffer_size(); |
234 | size_t c2_size = C2Compiler::initial_code_buffer_size(); |
235 | size_t buffer_size = c1_only ? c1_size : (c1_size/3 + 2*c2_size/3); |
236 | int max_count = (ReservedCodeCacheSize - (CodeCacheMinimumUseSpace DEBUG_ONLY(* 3))) / (int)buffer_size; |
237 | if (count > max_count) { |
238 | // Lower the compiler count such that all buffers fit into the code cache |
239 | count = MAX2(max_count, c1_only ? 1 : 2); |
240 | } |
241 | FLAG_SET_ERGO(CICompilerCount, count); |
242 | } |
243 | #else |
244 | // On 32-bit systems, the number of compiler threads is limited to 3. |
245 | // On these systems, the virtual address space available to the JVM |
246 | // is usually limited to 2-4 GB (the exact value depends on the platform). |
247 | // As the compilers (especially C2) can consume a large amount of |
248 | // memory, scaling the number of compiler threads with the number of |
249 | // available cores can result in the exhaustion of the address space |
250 | /// available to the VM and thus cause the VM to crash. |
251 | if (FLAG_IS_DEFAULT(CICompilerCount)) { |
252 | count = 3; |
253 | FLAG_SET_ERGO(CICompilerCount, count); |
254 | } |
255 | #endif |
256 | |
257 | if (c1_only) { |
258 | // No C2 compiler thread required |
259 | set_c1_count(count); |
260 | } else { |
261 | set_c1_count(MAX2(count / 3, 1)); |
262 | set_c2_count(MAX2(count - c1_count(), 1)); |
263 | } |
264 | assert(count == c1_count() + c2_count(), "inconsistent compiler thread count" ); |
265 | |
266 | // Some inlining tuning |
267 | #ifdef X86 |
268 | if (FLAG_IS_DEFAULT(InlineSmallCode)) { |
269 | FLAG_SET_DEFAULT(InlineSmallCode, 2000); |
270 | } |
271 | #endif |
272 | |
273 | #if defined SPARC || defined AARCH64 |
274 | if (FLAG_IS_DEFAULT(InlineSmallCode)) { |
275 | FLAG_SET_DEFAULT(InlineSmallCode, 2500); |
276 | } |
277 | #endif |
278 | |
279 | set_increase_threshold_at_ratio(); |
280 | set_start_time(os::javaTimeMillis()); |
281 | } |
282 | |
283 | void TieredThresholdPolicy::set_carry_if_necessary(InvocationCounter *counter) { |
284 | if (!counter->carry() && counter->count() > InvocationCounter::count_limit / 2) { |
285 | counter->set_carry_flag(); |
286 | } |
287 | } |
288 | |
289 | // Set carry flags on the counters if necessary |
290 | void TieredThresholdPolicy::handle_counter_overflow(Method* method) { |
291 | MethodCounters *mcs = method->method_counters(); |
292 | if (mcs != NULL) { |
293 | set_carry_if_necessary(mcs->invocation_counter()); |
294 | set_carry_if_necessary(mcs->backedge_counter()); |
295 | } |
296 | MethodData* mdo = method->method_data(); |
297 | if (mdo != NULL) { |
298 | set_carry_if_necessary(mdo->invocation_counter()); |
299 | set_carry_if_necessary(mdo->backedge_counter()); |
300 | } |
301 | } |
302 | |
303 | // Called with the queue locked and with at least one element |
304 | CompileTask* TieredThresholdPolicy::select_task(CompileQueue* compile_queue) { |
305 | CompileTask *max_blocking_task = NULL; |
306 | CompileTask *max_task = NULL; |
307 | Method* max_method = NULL; |
308 | jlong t = os::javaTimeMillis(); |
309 | // Iterate through the queue and find a method with a maximum rate. |
310 | for (CompileTask* task = compile_queue->first(); task != NULL;) { |
311 | CompileTask* next_task = task->next(); |
312 | Method* method = task->method(); |
313 | // If a method was unloaded or has been stale for some time, remove it from the queue. |
314 | // Blocking tasks and tasks submitted from whitebox API don't become stale |
315 | if (task->is_unloaded() || (task->can_become_stale() && is_stale(t, TieredCompileTaskTimeout, method) && !is_old(method))) { |
316 | if (!task->is_unloaded()) { |
317 | if (PrintTieredEvents) { |
318 | print_event(REMOVE_FROM_QUEUE, method, method, task->osr_bci(), (CompLevel) task->comp_level()); |
319 | } |
320 | method->clear_queued_for_compilation(); |
321 | } |
322 | compile_queue->remove_and_mark_stale(task); |
323 | task = next_task; |
324 | continue; |
325 | } |
326 | update_rate(t, method); |
327 | if (max_task == NULL || compare_methods(method, max_method)) { |
328 | // Select a method with the highest rate |
329 | max_task = task; |
330 | max_method = method; |
331 | } |
332 | |
333 | if (task->is_blocking()) { |
334 | if (max_blocking_task == NULL || compare_methods(method, max_blocking_task->method())) { |
335 | max_blocking_task = task; |
336 | } |
337 | } |
338 | |
339 | task = next_task; |
340 | } |
341 | |
342 | if (max_blocking_task != NULL) { |
343 | // In blocking compilation mode, the CompileBroker will make |
344 | // compilations submitted by a JVMCI compiler thread non-blocking. These |
345 | // compilations should be scheduled after all blocking compilations |
346 | // to service non-compiler related compilations sooner and reduce the |
347 | // chance of such compilations timing out. |
348 | max_task = max_blocking_task; |
349 | max_method = max_task->method(); |
350 | } |
351 | |
352 | if (max_task != NULL && max_task->comp_level() == CompLevel_full_profile && |
353 | TieredStopAtLevel > CompLevel_full_profile && |
354 | max_method != NULL && is_method_profiled(max_method)) { |
355 | max_task->set_comp_level(CompLevel_limited_profile); |
356 | |
357 | if (CompileBroker::compilation_is_complete(max_method, max_task->osr_bci(), CompLevel_limited_profile)) { |
358 | if (PrintTieredEvents) { |
359 | print_event(REMOVE_FROM_QUEUE, max_method, max_method, max_task->osr_bci(), (CompLevel)max_task->comp_level()); |
360 | } |
361 | compile_queue->remove_and_mark_stale(max_task); |
362 | max_method->clear_queued_for_compilation(); |
363 | return NULL; |
364 | } |
365 | |
366 | if (PrintTieredEvents) { |
367 | print_event(UPDATE_IN_QUEUE, max_method, max_method, max_task->osr_bci(), (CompLevel)max_task->comp_level()); |
368 | } |
369 | } |
370 | |
371 | return max_task; |
372 | } |
373 | |
374 | void TieredThresholdPolicy::reprofile(ScopeDesc* trap_scope, bool is_osr) { |
375 | for (ScopeDesc* sd = trap_scope;; sd = sd->sender()) { |
376 | if (PrintTieredEvents) { |
377 | methodHandle mh(sd->method()); |
378 | print_event(REPROFILE, mh, mh, InvocationEntryBci, CompLevel_none); |
379 | } |
380 | MethodData* mdo = sd->method()->method_data(); |
381 | if (mdo != NULL) { |
382 | mdo->reset_start_counters(); |
383 | } |
384 | if (sd->is_top()) break; |
385 | } |
386 | } |
387 | |
388 | nmethod* TieredThresholdPolicy::event(const methodHandle& method, const methodHandle& inlinee, |
389 | int branch_bci, int bci, CompLevel comp_level, CompiledMethod* nm, JavaThread* thread) { |
390 | if (comp_level == CompLevel_none && |
391 | JvmtiExport::can_post_interpreter_events() && |
392 | thread->is_interp_only_mode()) { |
393 | return NULL; |
394 | } |
395 | if (ReplayCompiles) { |
396 | // Don't trigger other compiles in testing mode |
397 | return NULL; |
398 | } |
399 | |
400 | handle_counter_overflow(method()); |
401 | if (method() != inlinee()) { |
402 | handle_counter_overflow(inlinee()); |
403 | } |
404 | |
405 | if (PrintTieredEvents) { |
406 | print_event(bci == InvocationEntryBci ? CALL : LOOP, method, inlinee, bci, comp_level); |
407 | } |
408 | |
409 | if (bci == InvocationEntryBci) { |
410 | method_invocation_event(method, inlinee, comp_level, nm, thread); |
411 | } else { |
412 | // method == inlinee if the event originated in the main method |
413 | method_back_branch_event(method, inlinee, bci, comp_level, nm, thread); |
414 | // Check if event led to a higher level OSR compilation |
415 | CompLevel expected_comp_level = comp_level; |
416 | if (inlinee->is_not_osr_compilable(expected_comp_level)) { |
417 | // It's not possble to reach the expected level so fall back to simple. |
418 | expected_comp_level = CompLevel_simple; |
419 | } |
420 | nmethod* osr_nm = inlinee->lookup_osr_nmethod_for(bci, expected_comp_level, false); |
421 | assert(osr_nm == NULL || osr_nm->comp_level() >= expected_comp_level, "lookup_osr_nmethod_for is broken" ); |
422 | if (osr_nm != NULL) { |
423 | // Perform OSR with new nmethod |
424 | return osr_nm; |
425 | } |
426 | } |
427 | return NULL; |
428 | } |
429 | |
430 | // Check if the method can be compiled, change level if necessary |
431 | void TieredThresholdPolicy::compile(const methodHandle& mh, int bci, CompLevel level, JavaThread* thread) { |
432 | assert(level <= TieredStopAtLevel, "Invalid compilation level" ); |
433 | if (level == CompLevel_none) { |
434 | return; |
435 | } |
436 | if (level == CompLevel_aot) { |
437 | if (mh->has_aot_code()) { |
438 | if (PrintTieredEvents) { |
439 | print_event(COMPILE, mh, mh, bci, level); |
440 | } |
441 | MutexLocker ml(Compile_lock); |
442 | NoSafepointVerifier nsv; |
443 | if (mh->has_aot_code() && mh->code() != mh->aot_code()) { |
444 | mh->aot_code()->make_entrant(); |
445 | if (mh->has_compiled_code()) { |
446 | mh->code()->make_not_entrant(); |
447 | } |
448 | Method::set_code(mh, mh->aot_code()); |
449 | } |
450 | } |
451 | return; |
452 | } |
453 | |
454 | // Check if the method can be compiled. If it cannot be compiled with C1, continue profiling |
455 | // in the interpreter and then compile with C2 (the transition function will request that, |
456 | // see common() ). If the method cannot be compiled with C2 but still can with C1, compile it with |
457 | // pure C1. |
458 | if ((bci == InvocationEntryBci && !can_be_compiled(mh, level))) { |
459 | if (level == CompLevel_full_optimization && can_be_compiled(mh, CompLevel_simple)) { |
460 | compile(mh, bci, CompLevel_simple, thread); |
461 | } |
462 | return; |
463 | } |
464 | if ((bci != InvocationEntryBci && !can_be_osr_compiled(mh, level))) { |
465 | if (level == CompLevel_full_optimization && can_be_osr_compiled(mh, CompLevel_simple)) { |
466 | nmethod* osr_nm = mh->lookup_osr_nmethod_for(bci, CompLevel_simple, false); |
467 | if (osr_nm != NULL && osr_nm->comp_level() > CompLevel_simple) { |
468 | // Invalidate the existing OSR nmethod so that a compile at CompLevel_simple is permitted. |
469 | osr_nm->make_not_entrant(); |
470 | } |
471 | compile(mh, bci, CompLevel_simple, thread); |
472 | } |
473 | return; |
474 | } |
475 | if (bci != InvocationEntryBci && mh->is_not_osr_compilable(level)) { |
476 | return; |
477 | } |
478 | if (!CompileBroker::compilation_is_in_queue(mh)) { |
479 | if (PrintTieredEvents) { |
480 | print_event(COMPILE, mh, mh, bci, level); |
481 | } |
482 | submit_compile(mh, bci, level, thread); |
483 | } |
484 | } |
485 | |
486 | // Update the rate and submit compile |
487 | void TieredThresholdPolicy::submit_compile(const methodHandle& mh, int bci, CompLevel level, JavaThread* thread) { |
488 | int hot_count = (bci == InvocationEntryBci) ? mh->invocation_count() : mh->backedge_count(); |
489 | update_rate(os::javaTimeMillis(), mh()); |
490 | CompileBroker::compile_method(mh, bci, level, mh, hot_count, CompileTask::Reason_Tiered, thread); |
491 | } |
492 | |
493 | // Print an event. |
494 | void TieredThresholdPolicy::print_specific(EventType type, const methodHandle& mh, const methodHandle& imh, |
495 | int bci, CompLevel level) { |
496 | tty->print(" rate=" ); |
497 | if (mh->prev_time() == 0) tty->print("n/a" ); |
498 | else tty->print("%f" , mh->rate()); |
499 | |
500 | tty->print(" k=%.2lf,%.2lf" , threshold_scale(CompLevel_full_profile, Tier3LoadFeedback), |
501 | threshold_scale(CompLevel_full_optimization, Tier4LoadFeedback)); |
502 | |
503 | } |
504 | |
505 | // update_rate() is called from select_task() while holding a compile queue lock. |
506 | void TieredThresholdPolicy::update_rate(jlong t, Method* m) { |
507 | // Skip update if counters are absent. |
508 | // Can't allocate them since we are holding compile queue lock. |
509 | if (m->method_counters() == NULL) return; |
510 | |
511 | if (is_old(m)) { |
512 | // We don't remove old methods from the queue, |
513 | // so we can just zero the rate. |
514 | m->set_rate(0); |
515 | return; |
516 | } |
517 | |
518 | // We don't update the rate if we've just came out of a safepoint. |
519 | // delta_s is the time since last safepoint in milliseconds. |
520 | jlong delta_s = t - SafepointTracing::end_of_last_safepoint_epoch_ms(); |
521 | jlong delta_t = t - (m->prev_time() != 0 ? m->prev_time() : start_time()); // milliseconds since the last measurement |
522 | // How many events were there since the last time? |
523 | int event_count = m->invocation_count() + m->backedge_count(); |
524 | int delta_e = event_count - m->prev_event_count(); |
525 | |
526 | // We should be running for at least 1ms. |
527 | if (delta_s >= TieredRateUpdateMinTime) { |
528 | // And we must've taken the previous point at least 1ms before. |
529 | if (delta_t >= TieredRateUpdateMinTime && delta_e > 0) { |
530 | m->set_prev_time(t); |
531 | m->set_prev_event_count(event_count); |
532 | m->set_rate((float)delta_e / (float)delta_t); // Rate is events per millisecond |
533 | } else { |
534 | if (delta_t > TieredRateUpdateMaxTime && delta_e == 0) { |
535 | // If nothing happened for 25ms, zero the rate. Don't modify prev values. |
536 | m->set_rate(0); |
537 | } |
538 | } |
539 | } |
540 | } |
541 | |
542 | // Check if this method has been stale for a given number of milliseconds. |
543 | // See select_task(). |
544 | bool TieredThresholdPolicy::is_stale(jlong t, jlong timeout, Method* m) { |
545 | jlong delta_s = t - SafepointTracing::end_of_last_safepoint_epoch_ms(); |
546 | jlong delta_t = t - m->prev_time(); |
547 | if (delta_t > timeout && delta_s > timeout) { |
548 | int event_count = m->invocation_count() + m->backedge_count(); |
549 | int delta_e = event_count - m->prev_event_count(); |
550 | // Return true if there were no events. |
551 | return delta_e == 0; |
552 | } |
553 | return false; |
554 | } |
555 | |
556 | // We don't remove old methods from the compile queue even if they have |
557 | // very low activity. See select_task(). |
558 | bool TieredThresholdPolicy::is_old(Method* method) { |
559 | return method->invocation_count() > 50000 || method->backedge_count() > 500000; |
560 | } |
561 | |
562 | double TieredThresholdPolicy::weight(Method* method) { |
563 | return (double)(method->rate() + 1) * |
564 | (method->invocation_count() + 1) * (method->backedge_count() + 1); |
565 | } |
566 | |
567 | // Apply heuristics and return true if x should be compiled before y |
568 | bool TieredThresholdPolicy::compare_methods(Method* x, Method* y) { |
569 | if (x->highest_comp_level() > y->highest_comp_level()) { |
570 | // recompilation after deopt |
571 | return true; |
572 | } else |
573 | if (x->highest_comp_level() == y->highest_comp_level()) { |
574 | if (weight(x) > weight(y)) { |
575 | return true; |
576 | } |
577 | } |
578 | return false; |
579 | } |
580 | |
581 | // Is method profiled enough? |
582 | bool TieredThresholdPolicy::is_method_profiled(Method* method) { |
583 | MethodData* mdo = method->method_data(); |
584 | if (mdo != NULL) { |
585 | int i = mdo->invocation_count_delta(); |
586 | int b = mdo->backedge_count_delta(); |
587 | return call_predicate_helper<CompLevel_full_profile>(i, b, 1, method); |
588 | } |
589 | return false; |
590 | } |
591 | |
592 | double TieredThresholdPolicy::threshold_scale(CompLevel level, int feedback_k) { |
593 | double queue_size = CompileBroker::queue_size(level); |
594 | int comp_count = compiler_count(level); |
595 | double k = queue_size / (feedback_k * comp_count) + 1; |
596 | |
597 | // Increase C1 compile threshold when the code cache is filled more |
598 | // than specified by IncreaseFirstTierCompileThresholdAt percentage. |
599 | // The main intention is to keep enough free space for C2 compiled code |
600 | // to achieve peak performance if the code cache is under stress. |
601 | if ((TieredStopAtLevel == CompLevel_full_optimization) && (level != CompLevel_full_optimization)) { |
602 | double current_reverse_free_ratio = CodeCache::reverse_free_ratio(CodeCache::get_code_blob_type(level)); |
603 | if (current_reverse_free_ratio > _increase_threshold_at_ratio) { |
604 | k *= exp(current_reverse_free_ratio - _increase_threshold_at_ratio); |
605 | } |
606 | } |
607 | return k; |
608 | } |
609 | |
610 | // Call and loop predicates determine whether a transition to a higher |
611 | // compilation level should be performed (pointers to predicate functions |
612 | // are passed to common()). |
613 | // Tier?LoadFeedback is basically a coefficient that determines of |
614 | // how many methods per compiler thread can be in the queue before |
615 | // the threshold values double. |
616 | bool TieredThresholdPolicy::loop_predicate(int i, int b, CompLevel cur_level, Method* method) { |
617 | switch(cur_level) { |
618 | case CompLevel_aot: { |
619 | double k = threshold_scale(CompLevel_full_profile, Tier3LoadFeedback); |
620 | return loop_predicate_helper<CompLevel_aot>(i, b, k, method); |
621 | } |
622 | case CompLevel_none: |
623 | case CompLevel_limited_profile: { |
624 | double k = threshold_scale(CompLevel_full_profile, Tier3LoadFeedback); |
625 | return loop_predicate_helper<CompLevel_none>(i, b, k, method); |
626 | } |
627 | case CompLevel_full_profile: { |
628 | double k = threshold_scale(CompLevel_full_optimization, Tier4LoadFeedback); |
629 | return loop_predicate_helper<CompLevel_full_profile>(i, b, k, method); |
630 | } |
631 | default: |
632 | return true; |
633 | } |
634 | } |
635 | |
636 | bool TieredThresholdPolicy::call_predicate(int i, int b, CompLevel cur_level, Method* method) { |
637 | switch(cur_level) { |
638 | case CompLevel_aot: { |
639 | double k = threshold_scale(CompLevel_full_profile, Tier3LoadFeedback); |
640 | return call_predicate_helper<CompLevel_aot>(i, b, k, method); |
641 | } |
642 | case CompLevel_none: |
643 | case CompLevel_limited_profile: { |
644 | double k = threshold_scale(CompLevel_full_profile, Tier3LoadFeedback); |
645 | return call_predicate_helper<CompLevel_none>(i, b, k, method); |
646 | } |
647 | case CompLevel_full_profile: { |
648 | double k = threshold_scale(CompLevel_full_optimization, Tier4LoadFeedback); |
649 | return call_predicate_helper<CompLevel_full_profile>(i, b, k, method); |
650 | } |
651 | default: |
652 | return true; |
653 | } |
654 | } |
655 | |
656 | // Determine is a method is mature. |
657 | bool TieredThresholdPolicy::is_mature(Method* method) { |
658 | if (should_compile_at_level_simple(method)) return true; |
659 | MethodData* mdo = method->method_data(); |
660 | if (mdo != NULL) { |
661 | int i = mdo->invocation_count(); |
662 | int b = mdo->backedge_count(); |
663 | double k = ProfileMaturityPercentage / 100.0; |
664 | return call_predicate_helper<CompLevel_full_profile>(i, b, k, method) || |
665 | loop_predicate_helper<CompLevel_full_profile>(i, b, k, method); |
666 | } |
667 | return false; |
668 | } |
669 | |
670 | // If a method is old enough and is still in the interpreter we would want to |
671 | // start profiling without waiting for the compiled method to arrive. |
672 | // We also take the load on compilers into the account. |
673 | bool TieredThresholdPolicy::should_create_mdo(Method* method, CompLevel cur_level) { |
674 | if (cur_level == CompLevel_none && |
675 | CompileBroker::queue_size(CompLevel_full_optimization) <= |
676 | Tier3DelayOn * compiler_count(CompLevel_full_optimization)) { |
677 | int i = method->invocation_count(); |
678 | int b = method->backedge_count(); |
679 | double k = Tier0ProfilingStartPercentage / 100.0; |
680 | return call_predicate_helper<CompLevel_none>(i, b, k, method) || loop_predicate_helper<CompLevel_none>(i, b, k, method); |
681 | } |
682 | return false; |
683 | } |
684 | |
685 | // Inlining control: if we're compiling a profiled method with C1 and the callee |
686 | // is known to have OSRed in a C2 version, don't inline it. |
687 | bool TieredThresholdPolicy::should_not_inline(ciEnv* env, ciMethod* callee) { |
688 | CompLevel comp_level = (CompLevel)env->comp_level(); |
689 | if (comp_level == CompLevel_full_profile || |
690 | comp_level == CompLevel_limited_profile) { |
691 | return callee->highest_osr_comp_level() == CompLevel_full_optimization; |
692 | } |
693 | return false; |
694 | } |
695 | |
696 | // Create MDO if necessary. |
697 | void TieredThresholdPolicy::create_mdo(const methodHandle& mh, JavaThread* THREAD) { |
698 | if (mh->is_native() || |
699 | mh->is_abstract() || |
700 | mh->is_accessor() || |
701 | mh->is_constant_getter()) { |
702 | return; |
703 | } |
704 | if (mh->method_data() == NULL) { |
705 | Method::build_interpreter_method_data(mh, CHECK_AND_CLEAR); |
706 | } |
707 | } |
708 | |
709 | |
710 | /* |
711 | * Method states: |
712 | * 0 - interpreter (CompLevel_none) |
713 | * 1 - pure C1 (CompLevel_simple) |
714 | * 2 - C1 with invocation and backedge counting (CompLevel_limited_profile) |
715 | * 3 - C1 with full profiling (CompLevel_full_profile) |
716 | * 4 - C2 (CompLevel_full_optimization) |
717 | * |
718 | * Common state transition patterns: |
719 | * a. 0 -> 3 -> 4. |
720 | * The most common path. But note that even in this straightforward case |
721 | * profiling can start at level 0 and finish at level 3. |
722 | * |
723 | * b. 0 -> 2 -> 3 -> 4. |
724 | * This case occurs when the load on C2 is deemed too high. So, instead of transitioning |
725 | * into state 3 directly and over-profiling while a method is in the C2 queue we transition to |
726 | * level 2 and wait until the load on C2 decreases. This path is disabled for OSRs. |
727 | * |
728 | * c. 0 -> (3->2) -> 4. |
729 | * In this case we enqueue a method for compilation at level 3, but the C1 queue is long enough |
730 | * to enable the profiling to fully occur at level 0. In this case we change the compilation level |
731 | * of the method to 2 while the request is still in-queue, because it'll allow it to run much faster |
732 | * without full profiling while c2 is compiling. |
733 | * |
734 | * d. 0 -> 3 -> 1 or 0 -> 2 -> 1. |
735 | * After a method was once compiled with C1 it can be identified as trivial and be compiled to |
736 | * level 1. These transition can also occur if a method can't be compiled with C2 but can with C1. |
737 | * |
738 | * e. 0 -> 4. |
739 | * This can happen if a method fails C1 compilation (it will still be profiled in the interpreter) |
740 | * or because of a deopt that didn't require reprofiling (compilation won't happen in this case because |
741 | * the compiled version already exists). |
742 | * |
743 | * Note that since state 0 can be reached from any other state via deoptimization different loops |
744 | * are possible. |
745 | * |
746 | */ |
747 | |
748 | // Common transition function. Given a predicate determines if a method should transition to another level. |
749 | CompLevel TieredThresholdPolicy::common(Predicate p, Method* method, CompLevel cur_level, bool disable_feedback) { |
750 | CompLevel next_level = cur_level; |
751 | int i = method->invocation_count(); |
752 | int b = method->backedge_count(); |
753 | |
754 | if (should_compile_at_level_simple(method)) { |
755 | next_level = CompLevel_simple; |
756 | } else { |
757 | switch(cur_level) { |
758 | default: break; |
759 | case CompLevel_aot: { |
760 | // If we were at full profile level, would we switch to full opt? |
761 | if (common(p, method, CompLevel_full_profile, disable_feedback) == CompLevel_full_optimization) { |
762 | next_level = CompLevel_full_optimization; |
763 | } else if (disable_feedback || (CompileBroker::queue_size(CompLevel_full_optimization) <= |
764 | Tier3DelayOff * compiler_count(CompLevel_full_optimization) && |
765 | (this->*p)(i, b, cur_level, method))) { |
766 | next_level = CompLevel_full_profile; |
767 | } |
768 | } |
769 | break; |
770 | case CompLevel_none: |
771 | // If we were at full profile level, would we switch to full opt? |
772 | if (common(p, method, CompLevel_full_profile, disable_feedback) == CompLevel_full_optimization) { |
773 | next_level = CompLevel_full_optimization; |
774 | } else if ((this->*p)(i, b, cur_level, method)) { |
775 | #if INCLUDE_JVMCI |
776 | if (EnableJVMCI && UseJVMCICompiler) { |
777 | // Since JVMCI takes a while to warm up, its queue inevitably backs up during |
778 | // early VM execution. As of 2014-06-13, JVMCI's inliner assumes that the root |
779 | // compilation method and all potential inlinees have mature profiles (which |
780 | // includes type profiling). If it sees immature profiles, JVMCI's inliner |
781 | // can perform pathologically bad (e.g., causing OutOfMemoryErrors due to |
782 | // exploring/inlining too many graphs). Since a rewrite of the inliner is |
783 | // in progress, we simply disable the dialing back heuristic for now and will |
784 | // revisit this decision once the new inliner is completed. |
785 | next_level = CompLevel_full_profile; |
786 | } else |
787 | #endif |
788 | { |
789 | // C1-generated fully profiled code is about 30% slower than the limited profile |
790 | // code that has only invocation and backedge counters. The observation is that |
791 | // if C2 queue is large enough we can spend too much time in the fully profiled code |
792 | // while waiting for C2 to pick the method from the queue. To alleviate this problem |
793 | // we introduce a feedback on the C2 queue size. If the C2 queue is sufficiently long |
794 | // we choose to compile a limited profiled version and then recompile with full profiling |
795 | // when the load on C2 goes down. |
796 | if (!disable_feedback && CompileBroker::queue_size(CompLevel_full_optimization) > |
797 | Tier3DelayOn * compiler_count(CompLevel_full_optimization)) { |
798 | next_level = CompLevel_limited_profile; |
799 | } else { |
800 | next_level = CompLevel_full_profile; |
801 | } |
802 | } |
803 | } |
804 | break; |
805 | case CompLevel_limited_profile: |
806 | if (is_method_profiled(method)) { |
807 | // Special case: we got here because this method was fully profiled in the interpreter. |
808 | next_level = CompLevel_full_optimization; |
809 | } else { |
810 | MethodData* mdo = method->method_data(); |
811 | if (mdo != NULL) { |
812 | if (mdo->would_profile()) { |
813 | if (disable_feedback || (CompileBroker::queue_size(CompLevel_full_optimization) <= |
814 | Tier3DelayOff * compiler_count(CompLevel_full_optimization) && |
815 | (this->*p)(i, b, cur_level, method))) { |
816 | next_level = CompLevel_full_profile; |
817 | } |
818 | } else { |
819 | next_level = CompLevel_full_optimization; |
820 | } |
821 | } else { |
822 | // If there is no MDO we need to profile |
823 | if (disable_feedback || (CompileBroker::queue_size(CompLevel_full_optimization) <= |
824 | Tier3DelayOff * compiler_count(CompLevel_full_optimization) && |
825 | (this->*p)(i, b, cur_level, method))) { |
826 | next_level = CompLevel_full_profile; |
827 | } |
828 | } |
829 | } |
830 | break; |
831 | case CompLevel_full_profile: |
832 | { |
833 | MethodData* mdo = method->method_data(); |
834 | if (mdo != NULL) { |
835 | if (mdo->would_profile()) { |
836 | int mdo_i = mdo->invocation_count_delta(); |
837 | int mdo_b = mdo->backedge_count_delta(); |
838 | if ((this->*p)(mdo_i, mdo_b, cur_level, method)) { |
839 | next_level = CompLevel_full_optimization; |
840 | } |
841 | } else { |
842 | next_level = CompLevel_full_optimization; |
843 | } |
844 | } |
845 | } |
846 | break; |
847 | } |
848 | } |
849 | return MIN2(next_level, (CompLevel)TieredStopAtLevel); |
850 | } |
851 | |
852 | // Determine if a method should be compiled with a normal entry point at a different level. |
853 | CompLevel TieredThresholdPolicy::call_event(Method* method, CompLevel cur_level, JavaThread * thread) { |
854 | CompLevel osr_level = MIN2((CompLevel) method->highest_osr_comp_level(), |
855 | common(&TieredThresholdPolicy::loop_predicate, method, cur_level, true)); |
856 | CompLevel next_level = common(&TieredThresholdPolicy::call_predicate, method, cur_level); |
857 | |
858 | // If OSR method level is greater than the regular method level, the levels should be |
859 | // equalized by raising the regular method level in order to avoid OSRs during each |
860 | // invocation of the method. |
861 | if (osr_level == CompLevel_full_optimization && cur_level == CompLevel_full_profile) { |
862 | MethodData* mdo = method->method_data(); |
863 | guarantee(mdo != NULL, "MDO should not be NULL" ); |
864 | if (mdo->invocation_count() >= 1) { |
865 | next_level = CompLevel_full_optimization; |
866 | } |
867 | } else { |
868 | next_level = MAX2(osr_level, next_level); |
869 | } |
870 | return next_level; |
871 | } |
872 | |
873 | // Determine if we should do an OSR compilation of a given method. |
874 | CompLevel TieredThresholdPolicy::loop_event(Method* method, CompLevel cur_level, JavaThread* thread) { |
875 | CompLevel next_level = common(&TieredThresholdPolicy::loop_predicate, method, cur_level, true); |
876 | if (cur_level == CompLevel_none) { |
877 | // If there is a live OSR method that means that we deopted to the interpreter |
878 | // for the transition. |
879 | CompLevel osr_level = MIN2((CompLevel)method->highest_osr_comp_level(), next_level); |
880 | if (osr_level > CompLevel_none) { |
881 | return osr_level; |
882 | } |
883 | } |
884 | return next_level; |
885 | } |
886 | |
887 | bool TieredThresholdPolicy::maybe_switch_to_aot(const methodHandle& mh, CompLevel cur_level, CompLevel next_level, JavaThread* thread) { |
888 | if (UseAOT) { |
889 | if (cur_level == CompLevel_full_profile || cur_level == CompLevel_none) { |
890 | // If the current level is full profile or interpreter and we're switching to any other level, |
891 | // activate the AOT code back first so that we won't waste time overprofiling. |
892 | compile(mh, InvocationEntryBci, CompLevel_aot, thread); |
893 | // Fall through for JIT compilation. |
894 | } |
895 | if (next_level == CompLevel_limited_profile && cur_level != CompLevel_aot && mh->has_aot_code()) { |
896 | // If the next level is limited profile, use the aot code (if there is any), |
897 | // since it's essentially the same thing. |
898 | compile(mh, InvocationEntryBci, CompLevel_aot, thread); |
899 | // Not need to JIT, we're done. |
900 | return true; |
901 | } |
902 | } |
903 | return false; |
904 | } |
905 | |
906 | |
907 | // Handle the invocation event. |
908 | void TieredThresholdPolicy::method_invocation_event(const methodHandle& mh, const methodHandle& imh, |
909 | CompLevel level, CompiledMethod* nm, JavaThread* thread) { |
910 | if (should_create_mdo(mh(), level)) { |
911 | create_mdo(mh, thread); |
912 | } |
913 | CompLevel next_level = call_event(mh(), level, thread); |
914 | if (next_level != level) { |
915 | if (maybe_switch_to_aot(mh, level, next_level, thread)) { |
916 | // No JITting necessary |
917 | return; |
918 | } |
919 | if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh)) { |
920 | compile(mh, InvocationEntryBci, next_level, thread); |
921 | } |
922 | } |
923 | } |
924 | |
925 | // Handle the back branch event. Notice that we can compile the method |
926 | // with a regular entry from here. |
927 | void TieredThresholdPolicy::method_back_branch_event(const methodHandle& mh, const methodHandle& imh, |
928 | int bci, CompLevel level, CompiledMethod* nm, JavaThread* thread) { |
929 | if (should_create_mdo(mh(), level)) { |
930 | create_mdo(mh, thread); |
931 | } |
932 | // Check if MDO should be created for the inlined method |
933 | if (should_create_mdo(imh(), level)) { |
934 | create_mdo(imh, thread); |
935 | } |
936 | |
937 | if (is_compilation_enabled()) { |
938 | CompLevel next_osr_level = loop_event(imh(), level, thread); |
939 | CompLevel max_osr_level = (CompLevel)imh->highest_osr_comp_level(); |
940 | // At the very least compile the OSR version |
941 | if (!CompileBroker::compilation_is_in_queue(imh) && (next_osr_level != level)) { |
942 | compile(imh, bci, next_osr_level, thread); |
943 | } |
944 | |
945 | // Use loop event as an opportunity to also check if there's been |
946 | // enough calls. |
947 | CompLevel cur_level, next_level; |
948 | if (mh() != imh()) { // If there is an enclosing method |
949 | if (level == CompLevel_aot) { |
950 | // Recompile the enclosing method to prevent infinite OSRs. Stay at AOT level while it's compiling. |
951 | if (max_osr_level != CompLevel_none && !CompileBroker::compilation_is_in_queue(mh)) { |
952 | compile(mh, InvocationEntryBci, MIN2((CompLevel)TieredStopAtLevel, CompLevel_full_profile), thread); |
953 | } |
954 | } else { |
955 | // Current loop event level is not AOT |
956 | guarantee(nm != NULL, "Should have nmethod here" ); |
957 | cur_level = comp_level(mh()); |
958 | next_level = call_event(mh(), cur_level, thread); |
959 | |
960 | if (max_osr_level == CompLevel_full_optimization) { |
961 | // The inlinee OSRed to full opt, we need to modify the enclosing method to avoid deopts |
962 | bool make_not_entrant = false; |
963 | if (nm->is_osr_method()) { |
964 | // This is an osr method, just make it not entrant and recompile later if needed |
965 | make_not_entrant = true; |
966 | } else { |
967 | if (next_level != CompLevel_full_optimization) { |
968 | // next_level is not full opt, so we need to recompile the |
969 | // enclosing method without the inlinee |
970 | cur_level = CompLevel_none; |
971 | make_not_entrant = true; |
972 | } |
973 | } |
974 | if (make_not_entrant) { |
975 | if (PrintTieredEvents) { |
976 | int osr_bci = nm->is_osr_method() ? nm->osr_entry_bci() : InvocationEntryBci; |
977 | print_event(MAKE_NOT_ENTRANT, mh(), mh(), osr_bci, level); |
978 | } |
979 | nm->make_not_entrant(); |
980 | } |
981 | } |
982 | // Fix up next_level if necessary to avoid deopts |
983 | if (next_level == CompLevel_limited_profile && max_osr_level == CompLevel_full_profile) { |
984 | next_level = CompLevel_full_profile; |
985 | } |
986 | if (cur_level != next_level) { |
987 | if (!maybe_switch_to_aot(mh, cur_level, next_level, thread) && !CompileBroker::compilation_is_in_queue(mh)) { |
988 | compile(mh, InvocationEntryBci, next_level, thread); |
989 | } |
990 | } |
991 | } |
992 | } else { |
993 | cur_level = comp_level(mh()); |
994 | next_level = call_event(mh(), cur_level, thread); |
995 | if (next_level != cur_level) { |
996 | if (!maybe_switch_to_aot(mh, cur_level, next_level, thread) && !CompileBroker::compilation_is_in_queue(mh)) { |
997 | compile(mh, InvocationEntryBci, next_level, thread); |
998 | } |
999 | } |
1000 | } |
1001 | } |
1002 | } |
1003 | |
1004 | #endif |
1005 | |