Skip to content

Commit 1f8c3df

Browse files
Differentiate the two dependencies
1 parent 425fd51 commit 1f8c3df

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

Python/optimizer.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,7 @@ _PyJit_translate_single_bytecode_to_trace(
860860
if (uop == _PUSH_FRAME || uop == _RETURN_VALUE || uop == _RETURN_GENERATOR || uop == _YIELD_VALUE) {
861861
PyCodeObject *new_code = (PyCodeObject *)PyStackRef_AsPyObjectBorrow(frame->f_executable);
862862
PyFunctionObject *new_func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
863+
863864
if (new_func != NULL) {
864865
operand = (uintptr_t)new_func;
865866
DPRINTF(2, "Adding %p func to op\n", (void *)operand);
@@ -1277,7 +1278,17 @@ uop_optimize(
12771278
_PyExecutorObject **exec_ptr,
12781279
bool progress_needed)
12791280
{
1280-
_PyBloomFilter *dependencies = &tstate->interp->jit_state.dependencies;
1281+
// Note: the executor has a slightly different set of dependencies than the tracer.
1282+
// For example: the tracer depends on function and code objects.
1283+
// The executor may only depend on the code object.
1284+
// Furthermore, it may decide to cut the trace early, meaning it does not depend on the rest
1285+
// of the code objects in the trace.
1286+
// It is crucial we differentiate them for performance reasons.
1287+
// This prevents endless re-tracing for nested functions.
1288+
// It is the optimizer's responsibility to add the dependencies it requires on its own.
1289+
_PyBloomFilter new_dependencies;
1290+
_Py_BloomFilter_Init(&new_dependencies);
1291+
_Py_BloomFilter_Add(&new_dependencies, tstate->interp->jit_state.initial_code);
12811292
PyInterpreterState *interp = _PyInterpreterState_GET();
12821293
_PyUOpInstruction *buffer = interp->jit_state.code_buffer;
12831294
OPT_STAT_INC(attempts);
@@ -1298,7 +1309,7 @@ uop_optimize(
12981309
if (!is_noopt) {
12991310
length = _Py_uop_analyze_and_optimize(tstate->interp->jit_state.initial_func, buffer,
13001311
length,
1301-
curr_stackentries, dependencies);
1312+
curr_stackentries, &new_dependencies);
13021313
if (length <= 0) {
13031314
return length;
13041315
}
@@ -1321,7 +1332,7 @@ uop_optimize(
13211332
OPT_HIST(effective_trace_length(buffer, length), optimized_trace_length_hist);
13221333
length = prepare_for_execution(buffer, length);
13231334
assert(length <= UOP_MAX_TRACE_LENGTH);
1324-
_PyExecutorObject *executor = make_executor_from_uops(buffer, length, dependencies, tstate->interp->jit_state.initial_chain_depth);
1335+
_PyExecutorObject *executor = make_executor_from_uops(buffer, length, &new_dependencies, tstate->interp->jit_state.initial_chain_depth);
13251336
if (executor == NULL) {
13261337
return -1;
13271338
}

Python/optimizer_bytecodes.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ dummy_func(void) {
779779
ctx->done = true;
780780
break;
781781
}
782+
_Py_BloomFilter_Add(dependencies, returning_code);
782783
int returning_stacklevel = this_instr->operand1;
783784
if (frame_pop(ctx, returning_code, returning_stacklevel)) {
784785
break;
@@ -797,6 +798,7 @@ dummy_func(void) {
797798
ctx->done = true;
798799
break;
799800
}
801+
_Py_BloomFilter_Add(dependencies, returning_code);
800802
int returning_stacklevel = this_instr->operand1;
801803
if (frame_pop(ctx, returning_code, returning_stacklevel)) {
802804
break;
@@ -815,6 +817,7 @@ dummy_func(void) {
815817
ctx->done = true;
816818
break;
817819
}
820+
_Py_BloomFilter_Add(dependencies, returning_code);
818821
int returning_stacklevel = this_instr->operand1;
819822
if (frame_pop(ctx, returning_code, returning_stacklevel)) {
820823
break;
@@ -871,6 +874,7 @@ dummy_func(void) {
871874
}
872875
PyFunctionObject *func = (PyFunctionObject *)operand;
873876
PyCodeObject *co = (PyCodeObject *)func->func_code;
877+
_Py_BloomFilter_Add(dependencies, co);
874878
assert(PyFunction_Check(func));
875879
ctx->frame->func = func;
876880
}

Python/optimizer_cases.c.h

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)