Skip to content

Commit b9505df

Browse files
author
Igor Veresov
committed
8253118: Avoid unnecessary deopts when OSR nmethods of the same level are present.
Reviewed-by: kvn
1 parent 3c4e824 commit b9505df

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/hotspot/share/compiler/tieredThresholdPolicy.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -507,16 +507,19 @@ nmethod* TieredThresholdPolicy::event(const methodHandle& method, const methodHa
507507
// method == inlinee if the event originated in the main method
508508
method_back_branch_event(method, inlinee, bci, comp_level, nm, THREAD);
509509
// Check if event led to a higher level OSR compilation
510-
CompLevel expected_comp_level = comp_level;
510+
CompLevel expected_comp_level = MIN2(CompLevel_full_optimization, static_cast<CompLevel>(comp_level + 1));
511511
if (!CompilationModeFlag::disable_intermediate() && inlinee->is_not_osr_compilable(expected_comp_level)) {
512512
// It's not possble to reach the expected level so fall back to simple.
513513
expected_comp_level = CompLevel_simple;
514514
}
515-
nmethod* osr_nm = inlinee->lookup_osr_nmethod_for(bci, expected_comp_level, false);
516-
assert(osr_nm == NULL || osr_nm->comp_level() >= expected_comp_level, "lookup_osr_nmethod_for is broken");
517-
if (osr_nm != NULL) {
518-
// Perform OSR with new nmethod
519-
return osr_nm;
515+
CompLevel max_osr_level = static_cast<CompLevel>(inlinee->highest_osr_comp_level());
516+
if (max_osr_level >= expected_comp_level) { // fast check to avoid locking in a typical scenario
517+
nmethod* osr_nm = inlinee->lookup_osr_nmethod_for(bci, expected_comp_level, false);
518+
assert(osr_nm == NULL || osr_nm->comp_level() >= expected_comp_level, "lookup_osr_nmethod_for is broken");
519+
if (osr_nm != NULL && osr_nm->comp_level() != comp_level) {
520+
// Perform OSR with new nmethod
521+
return osr_nm;
522+
}
520523
}
521524
}
522525
return NULL;

0 commit comments

Comments
 (0)