src/share/vm/opto/parse1.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/opto/parse1.cpp Tue May 6 15:13:03 2014
--- new/src/share/vm/opto/parse1.cpp Tue May 6 15:13:03 2014
*** 566,575 ****
--- 566,578 ----
set_map(entry_map);
load_interpreter_state(osr_buf);
} else {
set_map(entry_map);
do_method_entry();
+ if (depth() == 1 && C->age_code()) {
+ decrement_code_age();
+ }
}
if (depth() == 1) {
// Add check to deoptimize the nmethod if RTM state was changed
rtm_deopt();
}
*** 2046,2055 ****
--- 2049,2084 ----
}
}
#endif
}
+ void Parse::decrement_code_age() {
+ // Get the Method* node.
+ MethodCounters* mc = method()->ensure_method_counters();
+ if (mc == NULL) {
+ C->record_failure("Must have MCs");
+ return;
+ }
+ assert(!is_osr_parse(), "Not doing this for OSRs");
+
+ // Set starting bci for uncommon trap.
+ set_parse_bci(0);
+
+ const TypePtr* adr_type = TypeRawPtr::make((address)mc);
+ Node* mc_adr = makecon(adr_type);
+ Node* cnt_adr = basic_plus_adr(mc_adr, mc_adr, in_bytes(MethodCounters::nmethod_age_offset()));
+ Node* cnt = make_load(control(), cnt_adr, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
+ Node* decr = _gvn.transform(new (C) SubINode(cnt, makecon(TypeInt::ONE)));
+ store_to_memory(control(), cnt_adr, decr, T_INT, adr_type, MemNode::unordered);
+ Node *chk = _gvn.transform(new (C) CmpINode(decr, makecon(TypeInt::ZERO)));
+ Node* tst = _gvn.transform(new (C) BoolNode(chk, BoolTest::gt));
+ { BuildCutout unless(this, tst, PROB_ALWAYS);
+ uncommon_trap(Deoptimization::Reason_age,
+ Deoptimization::Action_make_not_entrant);
+ }
+ }
+
//------------------------------return_current---------------------------------
// Append current _map to _exit_return
void Parse::return_current(Node* value) {
if (RegisterFinalizersAtInit &&
method()->intrinsic_id() == vmIntrinsics::_Object_init) {
src/share/vm/opto/parse1.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File