8062169: Multiple OSR compilations issued for same bci
Summary: Fixed 'SimpleThresholdPolicy::event' to always perform OSR if an OSR nmethod is available.
Reviewed-by: kvn, iveresov
--- a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Tue Aug 05 14:44:18 2014 -0700
+++ b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Fri Oct 31 12:16:20 2014 +0100
@@ -196,7 +196,6 @@
// Don't trigger other compiles in testing mode
return NULL;
}
- nmethod *osr_nm = NULL;
handle_counter_overflow(method());
if (method() != inlinee()) {
@@ -210,14 +209,16 @@
if (bci == InvocationEntryBci) {
method_invocation_event(method, inlinee, comp_level, nm, thread);
} else {
+ // method == inlinee if the event originated in the main method
method_back_branch_event(method, inlinee, bci, comp_level, nm, thread);
- // method == inlinee if the event originated in the main method
- int highest_level = inlinee->highest_osr_comp_level();
- if (highest_level > comp_level) {
- osr_nm = inlinee->lookup_osr_nmethod_for(bci, highest_level, false);
+ // Check if event led to a higher level OSR compilation
+ nmethod* osr_nm = inlinee->lookup_osr_nmethod_for(bci, comp_level, false);
+ if (osr_nm != NULL && osr_nm->comp_level() > comp_level) {
+ // Perform OSR with new nmethod
+ return osr_nm;
}
}
- return osr_nm;
+ return NULL;
}
// Check if the method can be compiled, change level if necessary