https://github.com/python/cpython/commit/1753ccb43223b0a1054aaca31353e3778d2b12a1
commit: 1753ccb43223b0a1054aaca31353e3778d2b12a1
branch: main
author: alm <[email protected]>
committer: markshannon <[email protected]>
date: 2025-10-27T16:37:37Z
summary:
gh-138050: [WIP] JIT - Streamline MAKE_WARM - move coldness check to executor
creation (GH-138240)
files:
M Include/internal/pycore_interp_structs.h
M Include/internal/pycore_optimizer.h
M Python/bytecodes.c
M Python/ceval_gil.c
M Python/executor_cases.c.h
M Python/optimizer.c
M Python/pystate.c
diff --git a/Include/internal/pycore_interp_structs.h
b/Include/internal/pycore_interp_structs.h
index badc97808c6132..9cdaa950e3479a 100644
--- a/Include/internal/pycore_interp_structs.h
+++ b/Include/internal/pycore_interp_structs.h
@@ -939,7 +939,7 @@ struct _is {
struct _PyExecutorObject *executor_deletion_list_head;
struct _PyExecutorObject *cold_executor;
int executor_deletion_list_remaining_capacity;
- size_t trace_run_counter;
+ size_t executor_creation_counter;
_rare_events rare_events;
PyDict_WatchCallback builtins_dict_watcher;
diff --git a/Include/internal/pycore_optimizer.h
b/Include/internal/pycore_optimizer.h
index 685c39dcd65fb9..8ed5436eb6838c 100644
--- a/Include/internal/pycore_optimizer.h
+++ b/Include/internal/pycore_optimizer.h
@@ -90,8 +90,9 @@ PyAPI_FUNC(void)
_Py_Executors_InvalidateCold(PyInterpreterState *interp);
#endif
// Used as the threshold to trigger executor invalidation when
-// trace_run_counter is greater than this value.
-#define JIT_CLEANUP_THRESHOLD 100000
+// executor_creation_counter is greater than this value.
+// This value is arbitrary and was not optimized.
+#define JIT_CLEANUP_THRESHOLD 1000
#define TRACE_STACK_SIZE 5
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index f9f14322df0a5e..6ebd9ebdfce1bb 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -11,7 +11,6 @@
#include "pycore_audit.h" // _PySys_Audit()
#include "pycore_backoff.h"
#include "pycore_cell.h" // PyCell_GetRef()
-#include "pycore_ceval.h"
#include "pycore_code.h"
#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS
#include "pycore_function.h"
@@ -5362,10 +5361,6 @@ dummy_func(
tier2 op(_MAKE_WARM, (--)) {
current_executor->vm_data.warm = true;
- // It's okay if this ends up going negative.
- if (--tstate->interp->trace_run_counter == 0) {
- _Py_set_eval_breaker_bit(tstate,
_PY_EVAL_JIT_INVALIDATE_COLD_BIT);
- }
}
tier2 op(_FATAL_ERROR, (--)) {
diff --git a/Python/ceval_gil.c b/Python/ceval_gil.c
index 6bf64868cbb2d3..9b6506ac3326b3 100644
--- a/Python/ceval_gil.c
+++ b/Python/ceval_gil.c
@@ -1398,7 +1398,7 @@ _Py_HandlePending(PyThreadState *tstate)
if ((breaker & _PY_EVAL_JIT_INVALIDATE_COLD_BIT) != 0) {
_Py_unset_eval_breaker_bit(tstate, _PY_EVAL_JIT_INVALIDATE_COLD_BIT);
_Py_Executors_InvalidateCold(tstate->interp);
- tstate->interp->trace_run_counter = JIT_CLEANUP_THRESHOLD;
+ tstate->interp->executor_creation_counter = JIT_CLEANUP_THRESHOLD;
}
/* GIL drop request */
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 0e4d86463761a0..9ce0a9f8a4d87b 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -7409,9 +7409,6 @@
case _MAKE_WARM: {
current_executor->vm_data.warm = true;
- if (--tstate->interp->trace_run_counter == 0) {
- _Py_set_eval_breaker_bit(tstate,
_PY_EVAL_JIT_INVALIDATE_COLD_BIT);
- }
break;
}
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 6ad9124744859a..f44f8a9614b846 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -6,6 +6,7 @@
#include "pycore_interp.h"
#include "pycore_backoff.h"
#include "pycore_bitutils.h" // _Py_popcount32()
+#include "pycore_ceval.h" // _Py_set_eval_breaker_bit
#include "pycore_code.h" // _Py_GetBaseCodeUnit
#include "pycore_function.h" // _PyFunction_LookupByVersion()
#include "pycore_interpframe.h"
@@ -1343,6 +1344,14 @@ uop_optimize(
return -1;
}
assert(length <= UOP_MAX_TRACE_LENGTH);
+
+ // Check executor coldness
+ PyThreadState *tstate = PyThreadState_Get();
+ // It's okay if this ends up going negative.
+ if (--tstate->interp->executor_creation_counter == 0) {
+ _Py_set_eval_breaker_bit(tstate, _PY_EVAL_JIT_INVALIDATE_COLD_BIT);
+ }
+
*exec_ptr = executor;
return 1;
}
diff --git a/Python/pystate.c b/Python/pystate.c
index 5d0927c6c08196..2141e842a37d2f 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -571,7 +571,7 @@ init_interpreter(PyInterpreterState *interp,
interp->executor_list_head = NULL;
interp->executor_deletion_list_head = NULL;
interp->executor_deletion_list_remaining_capacity = 0;
- interp->trace_run_counter = JIT_CLEANUP_THRESHOLD;
+ interp->executor_creation_counter = JIT_CLEANUP_THRESHOLD;
if (interp != &runtime->_main_interpreter) {
/* Fix the self-referential, statically initialized fields. */
interp->dtoa = (struct _dtoa_state)_dtoa_state_INIT(interp);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]