8222637: Obsolete NeedsDeoptSuspend

Reviewed-by: dlong, coleenp, dholmes
This commit is contained in:
Robbin Ehn 2019-04-26 10:18:47 +02:00
parent f6382d9b88
commit 1814ecf475
13 changed files with 4 additions and 95 deletions

View File

@ -33,7 +33,6 @@
// (see globals.hpp)
define_pd_global(bool, ShareVtableStubs, true);
define_pd_global(bool, NeedsDeoptSuspend, false); // only register window machines need this
define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks
define_pd_global(bool, TrapBasedNullChecks, false);

View File

@ -40,8 +40,6 @@ define_pd_global(uintx, CodeCacheSegmentSize, 64 TIERED_ONLY(+64)); // Tiered co
define_pd_global(intx, CodeEntryAlignment, 16);
define_pd_global(intx, OptoLoopAlignment, 16);
define_pd_global(bool, NeedsDeoptSuspend, false); // only register window machines need this
#define DEFAULT_STACK_YELLOW_PAGES (2)
#define DEFAULT_STACK_RED_PAGES (1)
#define DEFAULT_STACK_SHADOW_PAGES (5 DEBUG_ONLY(+1))

View File

@ -33,8 +33,6 @@
// (see globals.hpp)
define_pd_global(bool, ShareVtableStubs, true);
define_pd_global(bool, NeedsDeoptSuspend, false); // Only register window machines need this.
define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks.
define_pd_global(bool, TrapBasedNullChecks, true);

View File

@ -35,7 +35,6 @@
// z/Architecture remembers branch targets, so don't share vtables.
define_pd_global(bool, ShareVtableStubs, true);
define_pd_global(bool, NeedsDeoptSuspend, false); // Only register window machines need this.
define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks.
define_pd_global(bool, TrapBasedNullChecks, true);

View File

@ -38,7 +38,6 @@
// according to the prior table. So, we let the thread continue and let it block by itself.
define_pd_global(bool, DontYieldALot, true); // yield no more than 100 times per second
define_pd_global(bool, ShareVtableStubs, false); // improves performance markedly for mtrt and compress
define_pd_global(bool, NeedsDeoptSuspend, true); // register window machines need this
define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks
define_pd_global(bool, TrapBasedNullChecks, false); // Not needed on sparc.

View File

@ -32,7 +32,6 @@
// (see globals.hpp)
define_pd_global(bool, ShareVtableStubs, true);
define_pd_global(bool, NeedsDeoptSuspend, false); // only register window machines need this
define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks
define_pd_global(bool, TrapBasedNullChecks, false); // Not needed on x86.

View File

@ -33,7 +33,6 @@
// runtime system. See globals.hpp for details of what they do.
define_pd_global(bool, ShareVtableStubs, true);
define_pd_global(bool, NeedsDeoptSuspend, false);
define_pd_global(bool, ImplicitNullChecks, true);
define_pd_global(bool, TrapBasedNullChecks, false);

View File

@ -565,6 +565,7 @@ static SpecialFlag const special_jvm_flags[] = {
{ "ProfilerNumberOfStubMethods", JDK_Version::undefined(), JDK_Version::jdk(13), JDK_Version::jdk(14) },
{ "ProfilerNumberOfRuntimeStubNodes", JDK_Version::undefined(), JDK_Version::jdk(13), JDK_Version::jdk(14) },
{ "UseImplicitStableValues", JDK_Version::undefined(), JDK_Version::jdk(13), JDK_Version::jdk(14) },
{ "NeedsDeoptSuspend", JDK_Version::undefined(), JDK_Version::jdk(13), JDK_Version::jdk(14) },
#ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS
// These entries will generate build errors. Their purpose is to test the macros.

View File

@ -271,64 +271,11 @@ bool frame::can_be_deoptimized() const {
}
void frame::deoptimize(JavaThread* thread) {
assert(thread->frame_anchor()->has_last_Java_frame() &&
thread->frame_anchor()->walkable(), "must be");
// Schedule deoptimization of an nmethod activation with this frame.
assert(_cb != NULL && _cb->is_compiled(), "must be");
// This is a fix for register window patching race
if (NeedsDeoptSuspend && Thread::current() != thread) {
assert(SafepointSynchronize::is_at_safepoint(),
"patching other threads for deopt may only occur at a safepoint");
// It is possible especially with DeoptimizeALot/DeoptimizeRandom that
// we could see the frame again and ask for it to be deoptimized since
// it might move for a long time. That is harmless and we just ignore it.
if (id() == thread->must_deopt_id()) {
assert(thread->is_deopt_suspend(), "lost suspension");
return;
}
// We are at a safepoint so the target thread can only be
// in 4 states:
// blocked - no problem
// blocked_trans - no problem (i.e. could have woken up from blocked
// during a safepoint).
// native - register window pc patching race
// native_trans - momentary state
//
// We could just wait out a thread in native_trans to block.
// Then we'd have all the issues that the safepoint code has as to
// whether to spin or block. It isn't worth it. Just treat it like
// native and be done with it.
//
// Examine the state of the thread at the start of safepoint since
// threads that were in native at the start of the safepoint could
// come to a halt during the safepoint, changing the current value
// of the safepoint_state.
JavaThreadState state = thread->safepoint_state()->orig_thread_state();
if (state == _thread_in_native || state == _thread_in_native_trans) {
// Since we are at a safepoint the target thread will stop itself
// before it can return to java as long as we remain at the safepoint.
// Therefore we can put an additional request for the thread to stop
// no matter what no (like a suspend). This will cause the thread
// to notice it needs to do the deopt on its own once it leaves native.
//
// The only reason we must do this is because on machine with register
// windows we have a race with patching the return address and the
// window coming live as the thread returns to the Java code (but still
// in native mode) and then blocks. It is only this top most frame
// that is at risk. So in truth we could add an additional check to
// see if this frame is one that is at risk.
RegisterMap map(thread, false);
frame at_risk = thread->last_frame().sender(&map);
if (id() == at_risk.id()) {
thread->set_must_deopt_id(id());
thread->set_deopt_suspend();
return;
}
}
} // NeedsDeoptSuspend
// If the call site is a MethodHandle call site use the MH deopt
// handler.
CompiledMethod* cm = (CompiledMethod*) _cb;

View File

@ -324,9 +324,6 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
"Maximum number of pages to include in the page scan procedure") \
range(0, max_uintx) \
\
product_pd(bool, NeedsDeoptSuspend, \
"True for register window machines (sparc/ia64)") \
\
product(intx, UseSSE, 99, \
"Highest supported SSE instructions set on x86/x64") \
range(0, 99) \

View File

@ -2526,21 +2526,6 @@ void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread
SafepointMechanism::block_if_requested(curJT);
}
if (thread->is_deopt_suspend()) {
thread->clear_deopt_suspend();
RegisterMap map(thread, false);
frame f = thread->last_frame();
while (f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
f = f.sender(&map);
}
if (f.id() == thread->must_deopt_id()) {
thread->clear_must_deopt_id();
f.deoptimize(thread);
} else {
fatal("missed deoptimization!");
}
}
JFR_ONLY(SUSPEND_THREAD_CONDITIONAL(thread);)
}

View File

@ -286,7 +286,6 @@ class Thread: public ThreadShadow {
_external_suspend = 0x20000000U, // thread is asked to self suspend
_ext_suspended = 0x40000000U, // thread has self-suspended
_deopt_suspend = 0x10000000U, // thread needs to self suspend for deopt
_has_async_exception = 0x00000001U, // there is a pending async exception
_critical_native_unlock = 0x00000002U, // Must call back to unlock JNI critical lock
@ -1405,17 +1404,13 @@ class JavaThread: public Thread {
inline void set_external_suspend();
inline void clear_external_suspend();
inline void set_deopt_suspend();
inline void clear_deopt_suspend();
bool is_deopt_suspend() { return (_suspend_flags & _deopt_suspend) != 0; }
bool is_external_suspend() const {
return (_suspend_flags & _external_suspend) != 0;
}
// Whenever a thread transitions from native to vm/java it must suspend
// if external|deopt suspend is present.
bool is_suspend_after_native() const {
return (_suspend_flags & (_external_suspend | _deopt_suspend JFR_ONLY(| _trace_flag))) != 0;
return (_suspend_flags & (_external_suspend JFR_ONLY(| _trace_flag))) != 0;
}
// external suspend request is completed

View File

@ -108,13 +108,6 @@ inline void JavaThread::clear_external_suspend() {
clear_suspend_flag(_external_suspend);
}
inline void JavaThread::set_deopt_suspend() {
set_suspend_flag(_deopt_suspend);
}
inline void JavaThread::clear_deopt_suspend() {
clear_suspend_flag(_deopt_suspend);
}
inline void JavaThread::set_pending_async_exception(oop e) {
_pending_async_exception = e;
_special_runtime_exit_condition = _async_exception;