src/share/vm/runtime/advancedThresholdPolicy.cpp
Print this page
@@ -189,11 +189,11 @@
}
task = next_task;
}
if (max_task->comp_level() == CompLevel_full_profile && TieredStopAtLevel > CompLevel_full_profile
- && is_method_profiled(max_method)) {
+ && is_method_profiled(max_method) && CompLevel_limited_profile >= TieredStartAtLevel) {
max_task->set_comp_level(CompLevel_limited_profile);
if (PrintTieredEvents) {
print_event(UPDATE_IN_QUEUE, max_method, max_method, max_task->osr_bci(), (CompLevel)max_task->comp_level());
}
}
@@ -395,11 +395,12 @@
}
}
break;
}
}
- return MIN2(next_level, (CompLevel)TieredStopAtLevel);
+ next_level = MIN2(next_level, (CompLevel)TieredStopAtLevel);
+ return MAX2(next_level, (CompLevel)TieredStartAtLevel);
}
// Determine if a method should be compiled with a normal entry point at a different level.
CompLevel AdvancedThresholdPolicy::call_event(Method* method, CompLevel cur_level) {
CompLevel osr_level = MIN2((CompLevel) method->highest_osr_comp_level(),
@@ -469,10 +470,16 @@
}
if (is_compilation_enabled()) {
CompLevel next_osr_level = loop_event(imh(), level);
CompLevel max_osr_level = (CompLevel)imh->highest_osr_comp_level();
+ next_osr_level = MIN2((CompLevel)TieredStartAtLevel, next_osr_level);
+ // Do not compile of TieredStartAtLevel > max_osr_level
+ if (next_osr_level > max_osr_level) {
+ return;
+ }
+
// At the very least compile the OSR version
if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_osr_level != level) {
compile(imh, bci, next_osr_level, thread);
}
@@ -516,11 +523,11 @@
}
}
} else {
cur_level = comp_level(imh());
next_level = call_event(imh(), cur_level);
- if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_level != cur_level) {
+ if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_level != cur_level && next_level >= TieredStartAtLevel) {
compile(imh, InvocationEntryBci, next_level, thread);
}
}
}
}