src/share/vm/opto/graphKit.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/graphKit.cpp	Fri Jul 24 10:17:21 2009
--- new/src/share/vm/opto/graphKit.cpp	Fri Jul 24 10:17:20 2009

*** 191,200 **** --- 191,202 ---- //-------------------------make_exception_state-------------------------------- // Turn the current JVM state into an exception state, appending the ex_oop. SafePointNode* GraphKit::make_exception_state(Node* ex_oop) { sync_jvms(); + // do not leak the current reexecute state to the exception path + jvms()->set_reexecute_undefined(); SafePointNode* ex_map = stop(); // do not manipulate this map any more set_saved_ex_oop(ex_map, ex_oop); return ex_map; }
*** 618,627 **** --- 620,639 ---- BuildCutout::~BuildCutout() { GraphKit* kit = _kit; assert(kit->stopped(), "cutout code must stop, throw, return, etc."); } + //---------------------------PreserveReexecuteState---------------------------- + PreserveReexecuteState::PreserveReexecuteState(GraphKit* kit) { + _kit = kit; + _sp = kit->sp(); + _reexecute = kit->jvms()->_reexecute; + } + PreserveReexecuteState::~PreserveReexecuteState() { + _kit->jvms()->_reexecute = _reexecute; + _kit->set_sp(_sp); + } //------------------------------clone_map-------------------------------------- // Implementation of PreserveJVMState // // Only clone_map(...) here. If this function is only used in the
*** 736,745 **** --- 748,769 ---- return true; } #endif //ASSERT + // Helper function for enforcing certain bytecodes to reexecute if + // deoptimization happens + static bool should_reexecute_implied_by_bytecode(JVMState *jvms) { + ciMethod* cur_method = jvms->method(); + int cur_bci = jvms->bci(); + if (cur_method != NULL && cur_bci != InvocationEntryBci) { + Bytecodes::Code code = cur_method->java_code_at_bci(cur_bci); + return Interpreter::bytecode_should_reexecute(code); + } else + return false; + } + // Helper function for adding JVMState and debug information to node void GraphKit::add_safepoint_edges(SafePointNode* call, bool must_throw) { // Add the safepoint edges to the call (or other safepoint). // Make sure dead locals are set to top. This
*** 779,788 **** --- 803,819 ---- // do not scribble on the input jvms JVMState* out_jvms = youngest_jvms->clone_deep(C); call->set_jvms(out_jvms); // Start jvms list for call node + // For a known set of bytecodes, the interpreter should reexecute them if + // deoptimization happens. We set the reexecute state for them here + if (out_jvms->is_reexecute_undefined() && //don't change if already specified + should_reexecute_implied_by_bytecode(out_jvms)) { + out_jvms->set_should_reexecute(true); //NOTE: youngest_jvms not changed + } + // Presize the call: debug_only(uint non_debug_edges = call->req()); call->add_req_batch(top(), youngest_jvms->debug_depth()); assert(call->req() == non_debug_edges + youngest_jvms->debug_depth(), "");

src/share/vm/opto/graphKit.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File