mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-19 10:34:38 +02:00
8031752: Failed speculative optimizations should be reattempted when root of compilation is different
Support for speculative traps that keep track of the root of the compilation in which a trap occurs. Reviewed-by: kvn, twisti
This commit is contained in:
parent
532b570e81
commit
493557fc90
16 changed files with 772 additions and 164 deletions
|
@ -1489,6 +1489,7 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra
|
|||
bool maybe_prior_trap = false;
|
||||
bool maybe_prior_recompile = false;
|
||||
pdata = query_update_method_data(trap_mdo, trap_bci, reason,
|
||||
nm->method(),
|
||||
//outputs:
|
||||
this_trap_count,
|
||||
maybe_prior_trap,
|
||||
|
@ -1534,7 +1535,7 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra
|
|||
}
|
||||
|
||||
// Go back to the compiler if there are too many traps in this method.
|
||||
if (this_trap_count >= (uint)PerMethodTrapLimit) {
|
||||
if (this_trap_count >= per_method_trap_limit(reason)) {
|
||||
// If there are too many traps in this method, force a recompile.
|
||||
// This will allow the compiler to see the limit overflow, and
|
||||
// take corrective action, if possible.
|
||||
|
@ -1622,6 +1623,7 @@ ProfileData*
|
|||
Deoptimization::query_update_method_data(MethodData* trap_mdo,
|
||||
int trap_bci,
|
||||
Deoptimization::DeoptReason reason,
|
||||
Method* compiled_method,
|
||||
//outputs:
|
||||
uint& ret_this_trap_count,
|
||||
bool& ret_maybe_prior_trap,
|
||||
|
@ -1645,9 +1647,16 @@ Deoptimization::query_update_method_data(MethodData* trap_mdo,
|
|||
// Find the profile data for this BCI. If there isn't one,
|
||||
// try to allocate one from the MDO's set of spares.
|
||||
// This will let us detect a repeated trap at this point.
|
||||
pdata = trap_mdo->allocate_bci_to_data(trap_bci);
|
||||
pdata = trap_mdo->allocate_bci_to_data(trap_bci, reason_is_speculate(reason) ? compiled_method : NULL);
|
||||
|
||||
if (pdata != NULL) {
|
||||
if (reason_is_speculate(reason) && !pdata->is_SpeculativeTrapData()) {
|
||||
if (LogCompilation && xtty != NULL) {
|
||||
ttyLocker ttyl;
|
||||
// no more room for speculative traps in this MDO
|
||||
xtty->elem("speculative_traps_oom");
|
||||
}
|
||||
}
|
||||
// Query the trap state of this profile datum.
|
||||
int tstate0 = pdata->trap_state();
|
||||
if (!trap_state_has_reason(tstate0, per_bc_reason))
|
||||
|
@ -1685,8 +1694,10 @@ Deoptimization::update_method_data_from_interpreter(MethodData* trap_mdo, int tr
|
|||
uint ignore_this_trap_count;
|
||||
bool ignore_maybe_prior_trap;
|
||||
bool ignore_maybe_prior_recompile;
|
||||
assert(!reason_is_speculate(reason), "reason speculate only used by compiler");
|
||||
query_update_method_data(trap_mdo, trap_bci,
|
||||
(DeoptReason)reason,
|
||||
NULL,
|
||||
ignore_this_trap_count,
|
||||
ignore_maybe_prior_trap,
|
||||
ignore_maybe_prior_recompile);
|
||||
|
@ -1814,7 +1825,8 @@ const char* Deoptimization::_trap_reason_name[Reason_LIMIT] = {
|
|||
"div0_check",
|
||||
"age",
|
||||
"predicate",
|
||||
"loop_limit_check"
|
||||
"loop_limit_check",
|
||||
"speculate_class_check"
|
||||
};
|
||||
const char* Deoptimization::_trap_action_name[Action_LIMIT] = {
|
||||
// Note: Keep this in sync. with enum DeoptAction.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue