8299074: nmethod marked for deoptimization is not deoptimized

Reviewed-by: eosterlund, rehn, kvn
This commit is contained in:
Tobias Hartmann 2023-01-18 08:15:19 +00:00
parent 1f438a8a70
commit 66f7387b5f

View file

@ -68,7 +68,12 @@ int DependencyContext::mark_dependent_nmethods(DepChange& changes) {
int found = 0; int found = 0;
for (nmethodBucket* b = dependencies_not_unloading(); b != NULL; b = b->next_not_unloading()) { for (nmethodBucket* b = dependencies_not_unloading(); b != NULL; b = b->next_not_unloading()) {
nmethod* nm = b->get_nmethod(); nmethod* nm = b->get_nmethod();
if (b->count() > 0 && !nm->is_marked_for_deoptimization() && nm->check_dependency_on(changes)) { if (b->count() > 0) {
if (nm->is_marked_for_deoptimization()) {
// Also count already (concurrently) marked nmethods to make sure
// deoptimization is triggered before execution in this thread continues.
found++;
} else if (nm->check_dependency_on(changes)) {
if (TraceDependencies) { if (TraceDependencies) {
ResourceMark rm; ResourceMark rm;
tty->print_cr("Marked for deoptimization"); tty->print_cr("Marked for deoptimization");
@ -80,6 +85,7 @@ int DependencyContext::mark_dependent_nmethods(DepChange& changes) {
found++; found++;
} }
} }
}
return found; return found;
} }
@ -189,7 +195,9 @@ int DependencyContext::remove_and_mark_for_deoptimization_all_dependents() {
int marked = 0; int marked = 0;
while (b != NULL) { while (b != NULL) {
nmethod* nm = b->get_nmethod(); nmethod* nm = b->get_nmethod();
if (b->count() > 0 && !nm->is_marked_for_deoptimization()) { if (b->count() > 0) {
// Also count already (concurrently) marked nmethods to make sure
// deoptimization is triggered before execution in this thread continues.
nm->mark_for_deoptimization(); nm->mark_for_deoptimization();
marked++; marked++;
} }