From 66f7387b5ffa53861b92b068fb9832fc433d9f79 Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Wed, 18 Jan 2023 08:15:19 +0000 Subject: [PATCH] 8299074: nmethod marked for deoptimization is not deoptimized Reviewed-by: eosterlund, rehn, kvn --- src/hotspot/share/code/dependencyContext.cpp | 28 +++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/hotspot/share/code/dependencyContext.cpp b/src/hotspot/share/code/dependencyContext.cpp index 1b3f3cf789f..2526bd36d91 100644 --- a/src/hotspot/share/code/dependencyContext.cpp +++ b/src/hotspot/share/code/dependencyContext.cpp @@ -68,16 +68,22 @@ int DependencyContext::mark_dependent_nmethods(DepChange& changes) { int found = 0; for (nmethodBucket* b = dependencies_not_unloading(); b != NULL; b = b->next_not_unloading()) { nmethod* nm = b->get_nmethod(); - if (b->count() > 0 && !nm->is_marked_for_deoptimization() && nm->check_dependency_on(changes)) { - if (TraceDependencies) { - ResourceMark rm; - tty->print_cr("Marked for deoptimization"); - changes.print(); - nm->print(); - nm->print_dependencies(); + 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) { + ResourceMark rm; + tty->print_cr("Marked for deoptimization"); + changes.print(); + nm->print(); + nm->print_dependencies(); + } + changes.mark_for_deoptimization(nm); + found++; } - changes.mark_for_deoptimization(nm); - found++; } } return found; @@ -189,7 +195,9 @@ int DependencyContext::remove_and_mark_for_deoptimization_all_dependents() { int marked = 0; while (b != NULL) { 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(); marked++; }