_PyBloomFilter jit_tracer_dependencies;
bool jit_tracer_dependencies_still_valid;
_PyUOpInstruction *jit_tracer_code_buffer;
- _Py_CODEUNIT *jit_tracer_initial_instr;
+ _Py_CODEUNIT *jit_tracer_insert_exec_instr;
+ _Py_CODEUNIT *jit_tracer_close_loop_instr;
int jit_tracer_initial_stack_depth;
int jit_tracer_initial_chain_depth;
PyCodeObject *jit_tracer_initial_code; // Strong
int jump_taken);
void
-_PyJIT_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *next_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit);
+_PyJIT_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *insert_exec_instr, _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit);
void _PyJIT_FinalizeTracing(PyThreadState *tstate);
}
int _is_sys_tracing = (tstate->c_tracefunc != NULL) || (tstate->c_profilefunc != NULL);
if (!_is_sys_tracing) {
- _PyJIT_InitializeTracing(tstate, frame, this_instr, STACK_LEVEL(), 0, NULL);
+ _PyJIT_InitializeTracing(tstate, frame, this_instr, next_instr, STACK_LEVEL(), 0, NULL);
ENTER_TRACING();
}
int _jump_taken = false;
_PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit);
assert(tstate->current_executor == (PyObject *)previous_executor);
int chain_depth = previous_executor->vm_data.chain_depth + 1;
- _PyJIT_InitializeTracing(tstate, frame, target, STACK_LEVEL(), chain_depth, exit);
+ _PyJIT_InitializeTracing(tstate, frame, target, target, STACK_LEVEL(), chain_depth, exit);
exit->temperature = initial_temperature_backoff_counter();
GOTO_TIER_ONE(target, 1);
}
_PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit);
assert(tstate->current_executor == (PyObject *)previous_executor);
int chain_depth = previous_executor->vm_data.chain_depth + 1;
- _PyJIT_InitializeTracing(tstate, frame, target, STACK_LEVEL(), chain_depth, exit);
+ _PyJIT_InitializeTracing(tstate, frame, target, target, STACK_LEVEL(), chain_depth, exit);
exit->temperature = initial_temperature_backoff_counter();
GOTO_TIER_ONE(target, 1);
}
}
int _is_sys_tracing = (tstate->c_tracefunc != NULL) || (tstate->c_profilefunc != NULL);
if (!_is_sys_tracing) {
- _PyJIT_InitializeTracing(tstate, frame, this_instr, STACK_LEVEL(), 0, NULL);
+ _PyJIT_InitializeTracing(tstate, frame, this_instr, next_instr, STACK_LEVEL(), 0, NULL);
ENTER_TRACING();
}
int _jump_taken = false;
}
int _is_sys_tracing = (tstate->c_tracefunc != NULL) || (tstate->c_profilefunc != NULL);
if (!_is_sys_tracing) {
- _PyJIT_InitializeTracing(tstate, frame, this_instr, STACK_LEVEL(), 0, NULL);
+ _PyJIT_InitializeTracing(tstate, frame, this_instr, next_instr, STACK_LEVEL(), 0, NULL);
ENTER_TRACING();
}
int _jump_taken = false;
chain_depth %= MAX_CHAIN_DEPTH;
bool progress_needed = chain_depth == 0;
PyCodeObject *code = (PyCodeObject *)tstate->interp->jit_state.jit_tracer_initial_code;
- _Py_CODEUNIT *start = tstate->interp->jit_state.jit_tracer_initial_instr;
+ _Py_CODEUNIT *start = tstate->interp->jit_state.jit_tracer_insert_exec_instr;
// A recursive trace might've cleared the values. In that case, bail.
if (code == NULL) {
interp->compiling = false;
int jump_taken)
{
- int is_first_instr = tstate->interp->jit_state.jit_tracer_initial_instr == this_instr;
+ int is_first_instr = tstate->interp->jit_state.jit_tracer_close_loop_instr == this_instr;
bool progress_needed = (tstate->interp->jit_state.jit_tracer_initial_chain_depth % MAX_CHAIN_DEPTH) == 0;;
_PyBloomFilter *dependencies = &tstate->interp->jit_state.jit_tracer_dependencies;
_Py_BloomFilter_Add(dependencies, old_code);
}
// Loop back to the start
- if (is_first_instr && tstate->interp->jit_state.jit_tracer_code_curr_size > 2) {
+ if (is_first_instr && tstate->interp->jit_state.jit_tracer_code_curr_size > 5) {
ADD_TO_TRACE(_JUMP_TO_TOP, 0, 0, 0);
goto done;
}
}
void
-_PyJIT_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *next_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit)
+_PyJIT_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *insert_exec_instr, _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit)
{
PyCodeObject *code = _PyFrame_GetCode(frame);
#ifdef Py_DEBUG
PyUnicode_AsUTF8(code->co_qualname),
PyUnicode_AsUTF8(code->co_filename),
code->co_firstlineno,
- 2 * INSTR_IP(next_instr, code),
+ 2 * INSTR_IP(close_loop_instr, code),
chain_depth);
#endif
- add_to_trace(tstate->interp->jit_state.jit_tracer_code_buffer, 0, _START_EXECUTOR, 0, (uintptr_t)next_instr, INSTR_IP(next_instr, code));
+ add_to_trace(tstate->interp->jit_state.jit_tracer_code_buffer, 0, _START_EXECUTOR, 0, (uintptr_t)insert_exec_instr, INSTR_IP(insert_exec_instr, code));
add_to_trace(tstate->interp->jit_state.jit_tracer_code_buffer, 1, _MAKE_WARM, 0, 0, 0);
tstate->interp->jit_state.jit_tracer_code_curr_size = 2;
tstate->interp->jit_state.jit_tracer_code_max_size = UOP_MAX_TRACE_LENGTH;
- tstate->interp->jit_state.jit_tracer_initial_instr = next_instr;
+ tstate->interp->jit_state.jit_tracer_insert_exec_instr = insert_exec_instr;
+ tstate->interp->jit_state.jit_tracer_close_loop_instr = close_loop_instr;
tstate->interp->jit_state.jit_tracer_initial_code = (PyCodeObject *)Py_NewRef(code);
tstate->interp->jit_state.jit_tracer_initial_func = (PyFunctionObject *)Py_NewRef(_PyFrame_GetFunction(frame));
tstate->interp->jit_state.jit_tracer_previous_exit = exit;
#ifdef _Py_TIER2
interp->jit_state.jit_tracer_code_buffer = NULL;
- interp->jit_state.jit_tracer_initial_instr = NULL;
interp->jit_state.jit_tracer_initial_stack_depth = -1;
interp->jit_state.jit_tracer_initial_chain_depth = -1;
interp->jit_state.jit_tracer_initial_code = NULL;