Skip to content

Commit bfb7d47

Browse files
fix bugs and use opt config
1 parent 1e793f9 commit bfb7d47

10 files changed

Lines changed: 35 additions & 17 deletions

File tree

Include/internal/pycore_backoff.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,11 @@ initial_jump_backoff_counter(_PyOptimizationConfig *opt_config)
142142
#define RESUME_INITIAL_VALUE 8190
143143
#define RESUME_INITIAL_BACKOFF 6
144144
static inline _Py_BackoffCounter
145-
initial_resume_backoff_counter(void)
145+
initial_resume_backoff_counter(_PyOptimizationConfig *opt_config)
146146
{
147-
return make_backoff_counter(RESUME_INITIAL_VALUE,
148-
RESUME_INITIAL_BACKOFF);
147+
return make_backoff_counter(
148+
opt_config->resume_initial_value,
149+
opt_config->resume_initial_backoff);
149150
}
150151

151152
/* Initial exit temperature.

Include/internal/pycore_interp_structs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,9 @@ typedef struct _PyOptimizationConfig {
413413
uint16_t jump_backward_initial_value;
414414
uint16_t jump_backward_initial_backoff;
415415

416+
uint16_t resume_initial_value;
417+
uint16_t resume_initial_backoff;
418+
416419
// JIT optimization thresholds
417420
uint16_t side_exit_initial_value;
418421
uint16_t side_exit_initial_backoff;

Include/internal/pycore_magic_number.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ Known values:
294294
Python 3.15a4 3661 (Lazy imports IMPORT_NAME opcode changes)
295295
Python 3.15a6 3662 (Add counter to RESUME)
296296
297+
297298
Python 3.16 will start with 3700
298299
299300
Please don't copy-paste the same pre-release tag for new entries above!!!
@@ -305,7 +306,7 @@ PC/launcher.c must also be updated.
305306
306307
*/
307308

308-
#define PYC_MAGIC_NUMBER 3663
309+
#define PYC_MAGIC_NUMBER 3662
309310
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
310311
(little-endian) and then appending b'\r\n'. */
311312
#define PYC_MAGIC_NUMBER_TOKEN \

Modules/_testinternalcapi/test_cases.c.h

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

Python/bytecodes.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ dummy_func(
173173
}
174174

175175
specializing op(_SPECIALIZE_RESUME, (counter/1 --)) {
176-
_Py_Specialize_Resume(next_instr, tstate);
176+
_Py_Specialize_Resume(this_instr, tstate);
177177
}
178178

179179
tier1 op(_MAYBE_INSTRUMENT, (--)) {
@@ -3116,7 +3116,7 @@ dummy_func(
31163116

31173117
tier1 op(_JIT, (--)) {
31183118
#ifdef _Py_TIER2
3119-
bool is_resume = this_instr->op.code == RESUME_CHECK;
3119+
bool is_resume = this_instr->op.code == RESUME_CHECK_JIT;
31203120
_Py_BackoffCounter counter = this_instr[1].counter;
31213121
if (!IS_JIT_TRACING() &&
31223122
(backoff_counter_triggers(counter) &&

Python/generated_cases.c.h

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

Python/optimizer.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,7 @@ _PyJit_TryInitializeTracing(
10391039
_Py_RecordFuncPtr record_func = _PyOpcode_RecordFunctions[record_func_index];
10401040
record_func(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value);
10411041
}
1042-
assert(curr_instr->op.code == JUMP_BACKWARD_JIT || (exit != NULL));
1042+
assert(curr_instr->op.code == JUMP_BACKWARD_JIT || curr_instr->op.code == RESUME_CHECK_JIT || (exit != NULL));
10431043
tracer->initial_state.jump_backward_instr = curr_instr;
10441044

10451045
if (_PyOpcode_Caches[_PyOpcode_Deopt[close_loop_instr->op.code]]) {
@@ -1064,7 +1064,12 @@ _PyJit_FinalizeTracing(PyThreadState *tstate, int err)
10641064
tracer->initial_state.jump_backward_instr[1].counter = restart_backoff_counter(counter);
10651065
}
10661066
else {
1067-
tracer->initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(&tstate->interp->opt_config);
1067+
if (tracer->initial_state.jump_backward_instr[0].op.code == JUMP_BACKWARD_JIT) {
1068+
tracer->initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(&tstate->interp->opt_config);
1069+
}
1070+
else {
1071+
tracer->initial_state.jump_backward_instr[1].counter = initial_resume_backoff_counter(&tstate->interp->opt_config);
1072+
}
10681073
}
10691074
}
10701075
else if (tracer->initial_state.executor->vm_data.valid) {

Python/pylifecycle.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,7 +1366,7 @@ init_interp_main(PyThreadState *tstate)
13661366
// This is also needed when the JIT is enabled
13671367
#ifdef _Py_TIER2
13681368
if (is_main_interp) {
1369-
int enabled = 0;
1369+
int enabled = 1;
13701370
#if _Py_TIER2 & 2
13711371
enabled = 0;
13721372
#endif

Python/pystate.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,11 +604,13 @@ init_interpreter(PyInterpreterState *interp,
604604
// Initialize optimization configuration from environment variables
605605
// PYTHON_JIT_STRESS sets aggressive defaults for testing, but can be overridden
606606
uint16_t jump_default = JUMP_BACKWARD_INITIAL_VALUE;
607+
uint16_t resume_default = RESUME_INITIAL_VALUE;
607608
uint16_t side_exit_default = SIDE_EXIT_INITIAL_VALUE;
608609

609610
if (is_env_enabled("PYTHON_JIT_STRESS")) {
610611
jump_default = 63;
611612
side_exit_default = 63;
613+
resume_default = 127;
612614
}
613615

614616
init_policy(&interp->opt_config.jump_backward_initial_value,
@@ -617,6 +619,12 @@ init_interpreter(PyInterpreterState *interp,
617619
init_policy(&interp->opt_config.jump_backward_initial_backoff,
618620
"PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF",
619621
JUMP_BACKWARD_INITIAL_BACKOFF, 0, MAX_BACKOFF);
622+
init_policy(&interp->opt_config.resume_initial_value,
623+
"PYTHON_JIT_RESUME_INITIAL_VALUE",
624+
resume_default, 1, MAX_VALUE);
625+
init_policy(&interp->opt_config.resume_initial_backoff,
626+
"PYTHON_JIT_RESUME_INITIAL_BACKOFF",
627+
RESUME_INITIAL_BACKOFF, 0, MAX_BACKOFF);
620628
init_policy(&interp->opt_config.side_exit_initial_value,
621629
"PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE",
622630
side_exit_default, 1, MAX_VALUE);

Python/specialize.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters
5252
PyInterpreterState *interp = tstate->interp;
5353
jump_counter = initial_jump_backoff_counter(&interp->opt_config);
5454
adaptive_counter = adaptive_counter_warmup();
55-
resume_counter = initial_resume_backoff_counter();
55+
resume_counter = initial_resume_backoff_counter(&interp->opt_config);
5656
}
5757
else {
5858
jump_counter = initial_unreachable_backoff_counter();
@@ -2796,7 +2796,7 @@ _Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate)
27962796
if (tstate->tracing == 0 && instr->op.code == RESUME) {
27972797
if (tstate->interp->jit) {
27982798
specialize(instr, RESUME_CHECK_JIT);
2799-
set_counter((_Py_BackoffCounter *)instr + 1, initial_resume_backoff_counter());
2799+
set_counter((_Py_BackoffCounter *)instr + 1, initial_resume_backoff_counter(&tstate->interp->opt_config));
28002800
return;
28012801
}
28022802
specialize(instr, RESUME_CHECK);

0 commit comments

Comments
 (0)