diff --git a/src/hotspot/share/compiler/compiler_globals.hpp b/src/hotspot/share/compiler/compiler_globals.hpp index ee281744ff0..87f5725596a 100644 --- a/src/hotspot/share/compiler/compiler_globals.hpp +++ b/src/hotspot/share/compiler/compiler_globals.hpp @@ -488,6 +488,9 @@ product(bool, PrecompileOnlyAndExit, false, \ "Exit after precompilation step is over") \ \ + product(bool, PreloadReduceTraps, true, DIAGNOSTIC, \ + "Preload code should avoid traps as much as possible.") \ + \ product(bool, PreloadBlocking, false, DIAGNOSTIC, \ "Preload code is processed with blocking. Startup would not " \ "proceed until all code preloaded code is done loading.") \ diff --git a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp index 2ad3bea26f8..b52191f68bc 100644 --- a/src/hotspot/share/opto/compile.cpp +++ b/src/hotspot/share/opto/compile.cpp @@ -4115,6 +4115,10 @@ bool Compile::too_many_traps(ciMethod* method, if (method->has_trap_at(bci)) { return true; } + if (PreloadReduceTraps && for_preload()) { + // Preload code should not have traps, if possible. + return true; + } ciMethodData* md = method->method_data(); if (md->is_empty()) { // Assume the trap has not occurred, or that it occurred only @@ -4140,6 +4144,10 @@ bool Compile::too_many_traps(ciMethod* method, // Less-accurate variant which does not require a method and bci. bool Compile::too_many_traps(Deoptimization::DeoptReason reason, ciMethodData* logmd) { + if (PreloadReduceTraps && for_preload()) { + // Preload code should not have traps, if possible. + return true; + } if (trap_count(reason) >= Deoptimization::per_method_trap_limit(reason)) { // Too many traps globally. // Note that we use cumulative trap_count, not just md->trap_count. diff --git a/src/hotspot/share/opto/graphKit.cpp b/src/hotspot/share/opto/graphKit.cpp index adf448dffdf..1f7e0a00ea2 100644 --- a/src/hotspot/share/opto/graphKit.cpp +++ b/src/hotspot/share/opto/graphKit.cpp @@ -2123,6 +2123,16 @@ Node* GraphKit::uncommon_trap(int trap_request, trap_request), bci()); } + if (PreloadReduceTraps && Compile::current()->for_preload() && + (action != Deoptimization::Action_none)) { + ResourceMark rm; + ciMethod* cim = Compile::current()->method(); + log_debug(scc,deoptimization)("Uncommon trap in preload code: reason=%s action=%s method=%s::%s bci=%d, %s", + Deoptimization::trap_reason_name(reason), Deoptimization::trap_action_name(action), + cim->holder()->name()->as_klass_external_name(), cim->name()->as_klass_external_name(), + bci(), comment); + } + CompileLog* log = C->log(); if (log != nullptr) { int kid = (klass == nullptr)? -1: log->identify(klass); diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index 55f6e9595fb..ad6c54bcd14 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -2013,8 +2013,8 @@ static void log_deopt(nmethod* nm, Method* tm, intptr_t pc, frame& fr, int trap_ if (lt.is_enabled()) { LogStream ls(lt); bool is_osr = nm->is_osr_method(); - ls.print("cid=%4d %s level=%d", - nm->compile_id(), (is_osr ? "osr" : " "), nm->comp_level()); + ls.print("cid=%4d %s%s level=%d", + nm->compile_id(), (is_osr ? "osr" : " "), (nm->preloaded() ? "preload" : ""), nm->comp_level()); ls.print(" %s", tm->name_and_sig_as_C_string()); ls.print(" trap_bci=%d ", trap_bci); if (is_osr) {