Skip to content

Commit e350669

Browse files
committed
Cache TOS across side exits: Work in progress
1 parent 0b1ed44 commit e350669

14 files changed

+1197
-749
lines changed

Include/internal/pycore_interp_structs.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ extern "C" {
1515
#include "pycore_tstate.h" // _PyThreadStateImpl
1616
#include "pycore_typedefs.h" // _PyRuntimeState
1717

18-
1918
#define CODE_MAX_WATCHERS 8
2019
#define CONTEXT_MAX_WATCHERS 8
2120
#define FUNC_MAX_WATCHERS 8
@@ -951,7 +950,7 @@ struct _is {
951950
bool jit;
952951
struct _PyExecutorObject *executor_list_head;
953952
struct _PyExecutorObject *executor_deletion_list_head;
954-
struct _PyExecutorObject *cold_executor;
953+
struct _PyExecutorObject **cold_executors;
955954
int executor_deletion_list_remaining_capacity;
956955
size_t trace_run_counter;
957956
_rare_events rare_events;

Include/internal/pycore_optimizer.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ typedef struct {
6969

7070
typedef struct _PyExitData {
7171
uint32_t target;
72-
uint16_t index;
72+
uint16_t index:12;
73+
uint16_t tos_cache:4;
7374
_Py_BackoffCounter temperature;
7475
struct _PyExecutorObject *executor;
7576
} _PyExitData;
@@ -352,15 +353,15 @@ extern int _Py_uop_frame_pop(JitOptContext *ctx);
352353

353354
PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored);
354355

355-
PyAPI_FUNC(int) _PyOptimizer_Optimize(_PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyExecutorObject **exec_ptr, int chain_depth);
356+
PyAPI_FUNC(int) _PyOptimizer_Optimize(_PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyExecutorObject **exec_ptr, int chain_depth, int tos_cache);
356357

357358
static inline _PyExecutorObject *_PyExecutor_FromExit(_PyExitData *exit)
358359
{
359360
_PyExitData *exit0 = exit - exit->index;
360361
return (_PyExecutorObject *)(((char *)exit0) - offsetof(_PyExecutorObject, exits));
361362
}
362363

363-
extern _PyExecutorObject *_PyExecutor_GetColdExecutor(void);
364+
extern _PyExecutorObject **_PyExecutor_GetColdExecutors(void);
364365

365366
PyAPI_FUNC(void) _PyExecutor_ClearExit(_PyExitData *exit);
366367

@@ -373,7 +374,7 @@ static inline int is_terminator(const _PyUOpInstruction *uop)
373374
);
374375
}
375376

376-
extern void _PyExecutor_Free(_PyExecutorObject *self);
377+
extern void _PyExecutor_FreeColdExecutors(_PyExecutorObject **cold);
377378

378379
PyAPI_FUNC(int) _PyDumpExecutors(FILE *out);
379380
#ifdef _Py_TIER2

0 commit comments

Comments
 (0)