# HG changeset patch # User Bernhard Urban # Date 1385644351 -3600 # Node ID 6b2d8d20ecbda7ad231cd911cecc7bab63667eb5 # Parent b199147f187e8dd04fcd9e45372cb7a79afad972 deoptimization: add helper to minimize hsx diff #resolve GRAAL-531 diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/c1/c1_Runtime1.cpp --- a/src/share/vm/c1/c1_Runtime1.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/c1/c1_Runtime1.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -169,7 +169,7 @@ RegisterMap reg_map(thread, false); frame runtime_frame = thread->last_frame(); frame caller_frame = runtime_frame.sender(®_map); - Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); assert(caller_is_deopted(), "Must be deoptimized"); } } @@ -431,7 +431,7 @@ if (osr_nm != NULL) { RegisterMap map(thread, false); frame fr = thread->last_frame().sender(&map); - Deoptimization::deoptimize_frame(thread, fr.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread, fr.id()); } JRT_BLOCK_END return NULL; @@ -502,7 +502,7 @@ // We don't really want to deoptimize the nmethod itself since we // can actually continue in the exception handler ourselves but I // don't see an easy way to have the desired effect. - Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); assert(caller_is_deopted(), "Must be deoptimized"); return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls(); @@ -696,7 +696,7 @@ assert(CodeCache::find_nmethod(caller_frame.pc()) != NULL, "sanity"); // Deoptimize the caller frame. - Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); // Return to the now deoptimized frame. JRT_END @@ -932,7 +932,7 @@ nm->make_not_entrant(); } - Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); // Return to the now deoptimized frame. } @@ -1434,7 +1434,7 @@ } - Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_none); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); JRT_END diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/opto/runtime.cpp --- a/src/share/vm/opto/runtime.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/opto/runtime.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -1,5 +1,6 @@ /* * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1185,7 +1186,7 @@ frame caller_frame = stub_frame.sender(®_map); // Deoptimize the caller frame. - Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread, caller_frame.id()); } diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/prims/jvmtiEnv.cpp --- a/src/share/vm/prims/jvmtiEnv.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/prims/jvmtiEnv.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -1442,7 +1442,7 @@ // If any of the top 2 frames is a compiled one, need to deoptimize it for (int i = 0; i < 2; i++) { if (!is_interpreted[i]) { - Deoptimization::deoptimize_frame(java_thread, frame_sp[i], Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(java_thread, frame_sp[i]); } } diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/prims/jvmtiEnvBase.cpp --- a/src/share/vm/prims/jvmtiEnvBase.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/prims/jvmtiEnvBase.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -1338,7 +1338,7 @@ if (!vf->fr().can_be_deoptimized()) { return JVMTI_ERROR_OPAQUE_FRAME; } - Deoptimization::deoptimize_frame(java_thread, jvf->fr().id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(java_thread, jvf->fr().id()); } // Get information about method return type diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/prims/jvmtiImpl.cpp --- a/src/share/vm/prims/jvmtiImpl.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/prims/jvmtiImpl.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -752,7 +752,7 @@ // Schedule deoptimization so that eventually the local // update will be written to an interpreter frame. - Deoptimization::deoptimize_frame(_jvf->thread(), _jvf->fr().id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(_jvf->thread(), _jvf->fr().id()); // Now store a new value for the local which will be applied // once deoptimization occurs. Note however that while this diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/runtime/deoptimization.cpp --- a/src/share/vm/runtime/deoptimization.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/runtime/deoptimization.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -1214,6 +1214,10 @@ fr.deoptimize(thread); } +void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map) { + deoptimize(thread, fr, map, Reason_constraint); +} + void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map, DeoptReason reason) { // Deoptimize only if the frame comes from compile code. // Do not deoptimize the frame which is already patched @@ -1253,6 +1257,9 @@ } } +void Deoptimization::deoptimize_frame(JavaThread* thread, intptr_t* id) { + deoptimize_frame(thread, id, Reason_constraint); +} // JVMTI PopFrame support JRT_LEAF(void, Deoptimization::popframe_preserve_args(JavaThread* thread, int bytes_to_save, void* start_address)) diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/runtime/deoptimization.hpp --- a/src/share/vm/runtime/deoptimization.hpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/runtime/deoptimization.hpp Thu Nov 28 14:12:31 2013 +0100 @@ -124,6 +124,7 @@ static int deoptimize_dependents(); // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame + static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map); static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason); private: @@ -264,6 +265,7 @@ // if thread is not the current thread then execute // VM_DeoptimizeFrame otherwise deoptimize directly. static void deoptimize_frame(JavaThread* thread, intptr_t* id, DeoptReason reason); + static void deoptimize_frame(JavaThread* thread, intptr_t* id); // Statistics static void gather_statistics(DeoptReason reason, DeoptAction action, diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/runtime/safepoint.cpp --- a/src/share/vm/runtime/safepoint.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/runtime/safepoint.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -1081,7 +1081,7 @@ // as otherwise we may never deliver it. if (thread()->has_async_condition()) { ThreadInVMfromJavaNoAsyncException __tiv(thread()); - Deoptimization::deoptimize_frame(thread(), caller_fr.id(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize_frame(thread(), caller_fr.id()); } // If an exception has been installed we must check for a pending deoptimization diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/runtime/thread.cpp --- a/src/share/vm/runtime/thread.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/runtime/thread.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -2265,7 +2265,7 @@ RegisterMap reg_map(this, UseBiasedLocking); frame compiled_frame = f.sender(®_map); if (!StressCompiledExceptionHandlers && compiled_frame.can_be_deoptimized()) { - Deoptimization::deoptimize(this, compiled_frame, ®_map, Deoptimization::Reason_constraint); + Deoptimization::deoptimize(this, compiled_frame, ®_map); } } } @@ -2698,7 +2698,7 @@ trace_frames(); trace_stack(); } - Deoptimization::deoptimize(this, *fst.current(), fst.register_map(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize(this, *fst.current(), fst.register_map()); } } @@ -2734,7 +2734,7 @@ this->name(), nm != NULL ? nm->compile_id() : -1); } - Deoptimization::deoptimize(this, *fst.current(), fst.register_map(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize(this, *fst.current(), fst.register_map()); } } } diff -r b199147f187e -r 6b2d8d20ecbd src/share/vm/runtime/vm_operations.cpp --- a/src/share/vm/runtime/vm_operations.cpp Thu Nov 28 13:19:58 2013 +0100 +++ b/src/share/vm/runtime/vm_operations.cpp Thu Nov 28 14:12:31 2013 +0100 @@ -150,7 +150,7 @@ if (fst.current()->can_be_deoptimized()) { if (fcount++ == fnum) { fcount = 0; - Deoptimization::deoptimize(thread, *fst.current(), fst.register_map(), Deoptimization::Reason_constraint); + Deoptimization::deoptimize(thread, *fst.current(), fst.register_map()); } } }