mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
gh-141976: Protect against non-progressing specializations in tracing JIT (GH-141989)
This commit is contained in:
parent
46295677a1
commit
ebf3427615
3 changed files with 21 additions and 0 deletions
|
|
@ -142,6 +142,7 @@ typedef struct _optimization_stats {
|
|||
uint64_t recursive_call;
|
||||
uint64_t low_confidence;
|
||||
uint64_t unknown_callee;
|
||||
uint64_t trace_immediately_deopts;
|
||||
uint64_t executors_invalidated;
|
||||
UOpStats opcode[PYSTATS_MAX_UOP_ID + 1];
|
||||
uint64_t unsupported_opcode[256];
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Protect against specialization failures in the tracing JIT compiler for performance reasons.
|
||||
|
|
@ -610,6 +610,25 @@ _PyJit_translate_single_bytecode_to_trace(
|
|||
target--;
|
||||
}
|
||||
|
||||
if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]] > 0) {
|
||||
uint16_t backoff = (this_instr + 1)->counter.value_and_backoff;
|
||||
// adaptive_counter_cooldown is a fresh specialization.
|
||||
// trigger_backoff_counter is what we set during tracing.
|
||||
// All tracing backoffs should be freshly specialized or untouched.
|
||||
// If not, that indicates a deopt during tracing, and
|
||||
// thus the "actual" instruction executed is not the one that is
|
||||
// in the instruction stream, but rather the deopt.
|
||||
// It's important we check for this, as some specializations might make
|
||||
// no progress (they can immediately deopt after specializing).
|
||||
// We do this to improve performance, as otherwise a compiled trace
|
||||
// will just deopt immediately.
|
||||
if (backoff != adaptive_counter_cooldown().value_and_backoff &&
|
||||
backoff != trigger_backoff_counter().value_and_backoff) {
|
||||
OPT_STAT_INC(trace_immediately_deopts);
|
||||
opcode = _PyOpcode_Deopt[opcode];
|
||||
}
|
||||
}
|
||||
|
||||
int old_stack_level = _tstate->jit_tracer_state.prev_state.instr_stacklevel;
|
||||
|
||||
// Strange control-flow
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue