https://github.com/python/cpython/commit/fc2f0fea6bdcaa8940adee52ff10aab71036b985
commit: fc2f0fea6bdcaa8940adee52ff10aab71036b985
branch: main
author: Diego Russo <[email protected]>
committer: diegorusso <[email protected]>
date: 2025-12-24T09:44:16Z
summary:
JIT: Move executor to a register (#143072)
files:
M Include/internal/pycore_jit.h
M Python/bytecodes.c
M Python/executor_cases.c.h
M Tools/jit/_stencils.py
M Tools/jit/jit.h
M Tools/jit/shim.c
M Tools/jit/template.c
diff --git a/Include/internal/pycore_jit.h b/Include/internal/pycore_jit.h
index b96ac879289673..89d5bb53643930 100644
--- a/Include/internal/pycore_jit.h
+++ b/Include/internal/pycore_jit.h
@@ -19,7 +19,7 @@ extern "C" {
#ifdef _Py_JIT
typedef _Py_CODEUNIT *(*jit_func)(
- _PyInterpreterFrame *frame, _PyStackRef *stack_pointer, PyThreadState
*tstate,
+ _PyExecutorObject *executor, _PyInterpreterFrame *frame, _PyStackRef
*stack_pointer, PyThreadState *tstate,
_PyStackRef _tos_cache0, _PyStackRef _tos_cache1, _PyStackRef _tos_cache2
);
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 950b9f08f2ead1..9232a16551d8a2 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -5296,7 +5296,7 @@ dummy_func(
assert(current_executor == (_PyExecutorObject*)executor);
#endif
assert(tstate->jit_exit == NULL || tstate->jit_exit->executor ==
current_executor);
- tstate->current_executor = (PyObject *)executor;
+ tstate->current_executor = (PyObject *)current_executor;
if (!current_executor->vm_data.valid) {
assert(tstate->jit_exit->executor == current_executor);
assert(tstate->current_executor == executor);
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index dc21a4aa90cf46..aa98d4019dbdff 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -16992,7 +16992,7 @@
assert(current_executor == (_PyExecutorObject*)executor);
#endif
assert(tstate->jit_exit == NULL || tstate->jit_exit->executor ==
current_executor);
- tstate->current_executor = (PyObject *)executor;
+ tstate->current_executor = (PyObject *)current_executor;
if (!current_executor->vm_data.valid) {
assert(tstate->jit_exit->executor == current_executor);
assert(tstate->current_executor == executor);
diff --git a/Tools/jit/_stencils.py b/Tools/jit/_stencils.py
index 2b78d8013af5db..258de8ab3136a4 100644
--- a/Tools/jit/_stencils.py
+++ b/Tools/jit/_stencils.py
@@ -19,8 +19,6 @@ class HoleValue(enum.Enum):
CODE = enum.auto()
# The base address of the read-only data for this uop:
DATA = enum.auto()
- # The address of the current executor (exposed as _JIT_EXECUTOR):
- EXECUTOR = enum.auto()
# The base address of the "global" offset table located in the read-only
data.
# Shouldn't be present in the final stencils, since these are all replaced
with
# equivalent DATA values:
@@ -108,7 +106,6 @@ class HoleValue(enum.Enum):
_HOLE_EXPRS = {
HoleValue.CODE: "(uintptr_t)code",
HoleValue.DATA: "(uintptr_t)data",
- HoleValue.EXECUTOR: "(uintptr_t)executor",
HoleValue.GOT: "",
# These should all have been turned into DATA values by
process_relocations:
HoleValue.OPARG: "instruction->oparg",
diff --git a/Tools/jit/jit.h b/Tools/jit/jit.h
index d5cf288c660f00..05e73ac6b39e8b 100644
--- a/Tools/jit/jit.h
+++ b/Tools/jit/jit.h
@@ -9,5 +9,5 @@ typedef jit_func __attribute__((preserve_none))
jit_func_preserve_none;
#define DECLARE_TARGET(NAME) \
_Py_CODEUNIT *__attribute__((preserve_none, visibility("hidden"))) \
- NAME(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer, PyThreadState
*tstate, \
+ NAME(_PyExecutorObject *executor, _PyInterpreterFrame *frame, _PyStackRef
*stack_pointer, PyThreadState *tstate, \
_PyStackRef _tos_cache0, _PyStackRef _tos_cache1, _PyStackRef _tos_cache2);
diff --git a/Tools/jit/shim.c b/Tools/jit/shim.c
index 698e491aeb349b..8ec4885a48354f 100644
--- a/Tools/jit/shim.c
+++ b/Tools/jit/shim.c
@@ -12,5 +12,6 @@ _JIT_ENTRY(
) {
// Note that this is *not* a tail call
jit_func_preserve_none jitted = (jit_func_preserve_none)exec->jit_code;
- return jitted(frame, stack_pointer, tstate, PyStackRef_ZERO_BITS,
PyStackRef_ZERO_BITS, PyStackRef_ZERO_BITS);
+ return jitted(exec, frame, stack_pointer, tstate,
+ PyStackRef_ZERO_BITS, PyStackRef_ZERO_BITS,
PyStackRef_ZERO_BITS);
}
diff --git a/Tools/jit/template.c b/Tools/jit/template.c
index 064b401bc3aca4..3537c74a820365 100644
--- a/Tools/jit/template.c
+++ b/Tools/jit/template.c
@@ -76,7 +76,7 @@ do {
\
OPT_STAT_INC(traces_executed); \
_PyExecutorObject *_executor = (EXECUTOR); \
jit_func_preserve_none jitted = _executor->jit_code; \
- __attribute__((musttail)) return jitted(frame, stack_pointer, tstate, \
+ __attribute__((musttail)) return jitted(_executor, frame, stack_pointer,
tstate, \
_tos_cache0, _tos_cache1, _tos_cache2); \
} while (0)
@@ -100,7 +100,7 @@ do {
\
#define PATCH_JUMP(ALIAS) \
do { \
DECLARE_TARGET(ALIAS); \
- __attribute__((musttail)) return ALIAS(frame, stack_pointer, tstate, \
+ __attribute__((musttail)) return ALIAS(current_executor, frame,
stack_pointer, tstate, \
_tos_cache0, _tos_cache1, _tos_cache2); \
} while (0)
@@ -120,11 +120,11 @@ do {
\
__attribute__((preserve_none)) _Py_CODEUNIT *
_JIT_ENTRY(
- _PyInterpreterFrame *frame, _PyStackRef *stack_pointer, PyThreadState
*tstate,
- _PyStackRef _tos_cache0, _PyStackRef _tos_cache1, _PyStackRef _tos_cache2
+ _PyExecutorObject *executor, _PyInterpreterFrame *frame, _PyStackRef
*stack_pointer, PyThreadState *tstate,
+ _PyStackRef _tos_cache0, _PyStackRef _tos_cache1, _PyStackRef _tos_cache2
) {
// Locals that the instruction implementations expect to exist:
- PATCH_VALUE(_PyExecutorObject *, current_executor, _JIT_EXECUTOR)
+ _PyExecutorObject *current_executor = executor;
int oparg;
int uopcode = _JIT_OPCODE;
_Py_CODEUNIT *next_instr;
_______________________________________________
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]