From 6c97cb6f9999092e2a9c94404ab0e77d978253cf Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Mon, 29 Dec 2025 16:03:24 +0000 Subject: [PATCH 01/43] Add counter to RESUME --- Include/internal/pycore_backoff.h | 10 ++++++++++ Include/internal/pycore_magic_number.h | 3 ++- Include/internal/pycore_opcode_metadata.h | 7 ++++--- Lib/opcode.py | 3 +++ Python/bytecodes.c | 5 +++-- Python/generated_cases.c.h | 10 ++++++---- Python/specialize.c | 7 ++++++- 7 files changed, 34 insertions(+), 11 deletions(-) diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h index 23ca7299e0d2bd..a5aa7892c7a63c 100644 --- a/Include/internal/pycore_backoff.h +++ b/Include/internal/pycore_backoff.h @@ -133,6 +133,16 @@ initial_jump_backoff_counter(void) JUMP_BACKWARD_INITIAL_BACKOFF); } +// Set this to slightly higher than JUMP_BACKWARD_INITIAL_VALUE +#define RESUME_INITIAL_VALUE 5002 +#define RESUME_INITIAL_BACKOFF 6 +static inline _Py_BackoffCounter +initial_resume_backoff_counter(void) +{ + return make_backoff_counter(RESUME_INITIAL_VALUE, + RESUME_INITIAL_BACKOFF); +} + /* Initial exit temperature. * Must be larger than ADAPTIVE_COOLDOWN_VALUE, * otherwise when a side exit warms up we may construct diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h index 2fb46a6df50bb3..a0d9e0e152a2ec 100644 --- a/Include/internal/pycore_magic_number.h +++ b/Include/internal/pycore_magic_number.h @@ -287,6 +287,7 @@ Known values: Python 3.15a1 3654 (Fix missing exception handlers in logical expression) Python 3.15a1 3655 (Fix miscompilation of some module-level annotations) Python 3.15a1 3656 (Add TRACE_RECORD instruction, for platforms with switch based interpreter) + Python 3.15a2 3657 (Add counter to RESUME) Python 3.16 will start with 3700 @@ -300,7 +301,7 @@ PC/launcher.c must also be updated. */ -#define PYC_MAGIC_NUMBER 3656 +#define PYC_MAGIC_NUMBER 3657 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes (little-endian) and then appending b'\r\n'. */ #define PYC_MAGIC_NUMBER_TOKEN \ diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 424ec337eb8afd..571b1f00392520 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1261,8 +1261,8 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RAISE_VARARGS] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG }, [RERAISE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [RESERVED] = { true, INSTR_FMT_IX, 0 }, - [RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, - [RESUME_CHECK] = { true, INSTR_FMT_IX, HAS_DEOPT_FLAG }, + [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, @@ -1473,7 +1473,7 @@ _PyOpcode_macro_expansion[256] = { [POP_TOP] = { .nuops = 1, .uops = { { _POP_TOP, OPARG_SIMPLE, 0 } } }, [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { _PUSH_EXC_INFO, OPARG_SIMPLE, 0 } } }, [PUSH_NULL] = { .nuops = 1, .uops = { { _PUSH_NULL, OPARG_SIMPLE, 0 } } }, - [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 0 } } }, + [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 1 } } }, [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } }, [RETURN_VALUE] = { .nuops = 1, .uops = { { _RETURN_VALUE, OPARG_SIMPLE, 0 } } }, [SEND_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _SEND_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } }, @@ -1762,6 +1762,7 @@ const char *_PyOpcode_OpName[267] = { extern const uint8_t _PyOpcode_Caches[256]; #ifdef NEED_OPCODE_METADATA const uint8_t _PyOpcode_Caches[256] = { + [RESUME] = 1, [TO_BOOL] = 3, [STORE_SUBSCR] = 1, [SEND] = 1, diff --git a/Lib/opcode.py b/Lib/opcode.py index 0e9520b6832499..400c1887bc9942 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -96,6 +96,9 @@ "SEND": { "counter": 1, }, + "RESUME": { + "counter": 1, + }, "JUMP_BACKWARD": { "counter": 1, }, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index ea09c0645aa39c..151fab29e3cfe0 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -145,7 +145,7 @@ dummy_func( pure inst(NOP, (--)) { } - family(RESUME, 0) = { + family(RESUME, 1) = { RESUME_CHECK, }; @@ -218,12 +218,13 @@ dummy_func( } macro(RESUME) = + unused/1 + _LOAD_BYTECODE + _MAYBE_INSTRUMENT + _QUICKEN_RESUME + _CHECK_PERIODIC_IF_NOT_YIELD_FROM; - inst(RESUME_CHECK, (--)) { + inst(RESUME_CHECK, (unused/1 --)) { #if defined(__EMSCRIPTEN__) DEOPT_IF(_Py_emscripten_signal_clock == 0); _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index e63852aee1134c..b2eab7ac85e98e 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -9905,11 +9905,12 @@ (void)(opcode); #endif frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME); PREDICTED_RESUME:; - _Py_CODEUNIT* const this_instr = next_instr - 1; + _Py_CODEUNIT* const this_instr = next_instr - 2; (void)this_instr; + /* Skip 1 cache entry */ // _LOAD_BYTECODE { #ifdef Py_GIL_DISABLED @@ -9983,9 +9984,10 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK); - static_assert(0 == 0, "incorrect cache size"); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ #if defined(__EMSCRIPTEN__) if (_Py_emscripten_signal_clock == 0) { UPDATE_MISS_STATS(RESUME); diff --git a/Python/specialize.c b/Python/specialize.c index e67078afdd9df3..55600af2efc2ab 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -45,14 +45,16 @@ void _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters) { #if ENABLE_SPECIALIZATION_FT - _Py_BackoffCounter jump_counter, adaptive_counter; + _Py_BackoffCounter jump_counter, adaptive_counter, resume_counter; if (enable_counters) { jump_counter = initial_jump_backoff_counter(); adaptive_counter = adaptive_counter_warmup(); + resume_counter = initial_resume_backoff_counter(); } else { jump_counter = initial_unreachable_backoff_counter(); adaptive_counter = initial_unreachable_backoff_counter(); + resume_counter = initial_unreachable_backoff_counter(); } int opcode = 0; int oparg = 0; @@ -67,6 +69,9 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters case JUMP_BACKWARD: instructions[i + 1].counter = jump_counter; break; + case RESUME: + instructions[i + 1].counter = resume_counter; + break; case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: case POP_JUMP_IF_NONE: From 5ce4d2062b80e8da43d3bdb21e54db5d20382124 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Mon, 29 Dec 2025 18:38:05 +0000 Subject: [PATCH 02/43] Fix dis, implement jit, broken for async for loops --- Include/internal/pycore_backoff.h | 2 +- Include/internal/pycore_opcode_metadata.h | 11 +- Include/internal/pycore_optimizer.h | 2 +- Include/internal/pycore_tstate.h | 5 +- Include/internal/pycore_uop_ids.h | 1590 ++++++++++----------- Include/opcode_ids.h | 31 +- Lib/_opcode_metadata.py | 32 +- Lib/test/test_capi/test_opt.py | 14 +- Lib/test/test_compile.py | 4 +- Lib/test/test_dis.py | 434 +++--- Modules/_testinternalcapi.c | 6 + Objects/object.c | 2 +- Programs/test_frozenmain.h | 70 +- Python/bytecodes.c | 25 +- Python/ceval.c | 14 +- Python/executor_cases.c.h | 3 +- Python/generated_cases.c.h | 83 +- Python/opcode_targets.h | 9 +- Python/optimizer.c | 17 +- Python/specialize.c | 1 + 20 files changed, 1248 insertions(+), 1107 deletions(-) diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h index a5aa7892c7a63c..049e238b42e5ab 100644 --- a/Include/internal/pycore_backoff.h +++ b/Include/internal/pycore_backoff.h @@ -133,7 +133,7 @@ initial_jump_backoff_counter(void) JUMP_BACKWARD_INITIAL_BACKOFF); } -// Set this to slightly higher than JUMP_BACKWARD_INITIAL_VALUE +// Set this to slightly (~25%) higher than JUMP_BACKWARD_INITIAL_VALUE #define RESUME_INITIAL_VALUE 5002 #define RESUME_INITIAL_BACKOFF 6 static inline _Py_BackoffCounter diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 571b1f00392520..e27c261cf2653d 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -420,6 +420,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) { return 0; case RESUME_CHECK: return 0; + case RESUME_CHECK_JIT: + return 0; case RETURN_GENERATOR: return 0; case RETURN_VALUE: @@ -905,6 +907,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) { return 0; case RESUME_CHECK: return 0; + case RESUME_CHECK_JIT: + return 0; case RETURN_GENERATOR: return 1; case RETURN_VALUE: @@ -1192,7 +1196,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [INSTRUMENTED_POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_POP_JUMP_IF_TRUE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG }, - [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, + [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [INSTRUMENTED_YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, @@ -1263,6 +1267,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RESERVED] = { true, INSTR_FMT_IX, 0 }, [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, @@ -1711,6 +1716,7 @@ const char *_PyOpcode_OpName[267] = { [RESERVED] = "RESERVED", [RESUME] = "RESUME", [RESUME_CHECK] = "RESUME_CHECK", + [RESUME_CHECK_JIT] = "RESUME_CHECK_JIT", [RETURN_GENERATOR] = "RETURN_GENERATOR", [RETURN_VALUE] = "RETURN_VALUE", [SEND] = "SEND", @@ -1795,7 +1801,6 @@ const uint8_t _PyOpcode_Deopt[256] = { [125] = 125, [126] = 126, [127] = 127, - [210] = 210, [211] = 211, [212] = 212, [213] = 213, @@ -2003,6 +2008,7 @@ const uint8_t _PyOpcode_Deopt[256] = { [RESERVED] = RESERVED, [RESUME] = RESUME, [RESUME_CHECK] = RESUME, + [RESUME_CHECK_JIT] = RESUME, [RETURN_GENERATOR] = RETURN_GENERATOR, [RETURN_VALUE] = RETURN_VALUE, [SEND] = SEND, @@ -2056,7 +2062,6 @@ const uint8_t _PyOpcode_Deopt[256] = { case 125: \ case 126: \ case 127: \ - case 210: \ case 211: \ case 212: \ case 213: \ diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index 6a0fc1a59e7965..eb88f3fa6624eb 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -352,7 +352,7 @@ PyAPI_FUNC(int) _PyJit_TryInitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *curr_instr, _Py_CODEUNIT *start_instr, _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, _PyExitData *exit, - int oparg); + int opcode, int oparg); void _PyJit_FinalizeTracing(PyThreadState *tstate); diff --git a/Include/internal/pycore_tstate.h b/Include/internal/pycore_tstate.h index 1a7ebb01403208..3cce68e366e4c7 100644 --- a/Include/internal/pycore_tstate.h +++ b/Include/internal/pycore_tstate.h @@ -27,12 +27,15 @@ struct _gc_thread_state { typedef struct _PyJitTracerInitialState { int stack_depth; int chain_depth; + // This is different from start_instr, which may + // point to EXTENDED_ARG. + int trace_origin_opcode; struct _PyExitData *exit; PyCodeObject *code; // Strong PyFunctionObject *func; // Strong _Py_CODEUNIT *start_instr; _Py_CODEUNIT *close_loop_instr; - _Py_CODEUNIT *jump_backward_instr; + _Py_CODEUNIT *trace_enter_instr; } _PyJitTracerInitialState; typedef struct _PyJitTracerPreviousState { diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index ebeec6387a741a..6f0197e03a5fea 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -305,820 +305,820 @@ extern "C" { #define _PY_FRAME_KW 520 #define _QUICKEN_RESUME 521 #define _REPLACE_WITH_TRUE 522 -#define _RESUME_CHECK RESUME_CHECK +#define _RESUME_CHECK 523 #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 523 -#define _SEND 524 -#define _SEND_GEN_FRAME 525 +#define _SAVE_RETURN_OFFSET 524 +#define _SEND 525 +#define _SEND_GEN_FRAME 526 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 526 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 527 -#define _SPILL_OR_RELOAD 528 -#define _START_EXECUTOR 529 -#define _STORE_ATTR 530 -#define _STORE_ATTR_INSTANCE_VALUE 531 -#define _STORE_ATTR_SLOT 532 -#define _STORE_ATTR_WITH_HINT 533 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 527 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 528 +#define _SPILL_OR_RELOAD 529 +#define _START_EXECUTOR 530 +#define _STORE_ATTR 531 +#define _STORE_ATTR_INSTANCE_VALUE 532 +#define _STORE_ATTR_SLOT 533 +#define _STORE_ATTR_WITH_HINT 534 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 534 -#define _STORE_FAST_0 535 -#define _STORE_FAST_1 536 -#define _STORE_FAST_2 537 -#define _STORE_FAST_3 538 -#define _STORE_FAST_4 539 -#define _STORE_FAST_5 540 -#define _STORE_FAST_6 541 -#define _STORE_FAST_7 542 +#define _STORE_FAST 535 +#define _STORE_FAST_0 536 +#define _STORE_FAST_1 537 +#define _STORE_FAST_2 538 +#define _STORE_FAST_3 539 +#define _STORE_FAST_4 540 +#define _STORE_FAST_5 541 +#define _STORE_FAST_6 542 +#define _STORE_FAST_7 543 #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 543 -#define _STORE_SUBSCR 544 -#define _STORE_SUBSCR_DICT 545 -#define _STORE_SUBSCR_LIST_INT 546 -#define _SWAP 547 -#define _SWAP_2 548 -#define _SWAP_3 549 -#define _TIER2_RESUME_CHECK 550 -#define _TO_BOOL 551 +#define _STORE_SLICE 544 +#define _STORE_SUBSCR 545 +#define _STORE_SUBSCR_DICT 546 +#define _STORE_SUBSCR_LIST_INT 547 +#define _SWAP 548 +#define _SWAP_2 549 +#define _SWAP_3 550 +#define _TIER2_RESUME_CHECK 551 +#define _TO_BOOL 552 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 552 +#define _TO_BOOL_LIST 553 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 553 +#define _TO_BOOL_STR 554 #define _TRACE_RECORD TRACE_RECORD #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 554 -#define _UNPACK_SEQUENCE_LIST 555 -#define _UNPACK_SEQUENCE_TUPLE 556 -#define _UNPACK_SEQUENCE_TWO_TUPLE 557 +#define _UNPACK_SEQUENCE 555 +#define _UNPACK_SEQUENCE_LIST 556 +#define _UNPACK_SEQUENCE_TUPLE 557 +#define _UNPACK_SEQUENCE_TWO_TUPLE 558 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 557 -#define _BINARY_OP_r21 558 -#define _BINARY_OP_ADD_FLOAT_r03 559 -#define _BINARY_OP_ADD_FLOAT_r13 560 -#define _BINARY_OP_ADD_FLOAT_r23 561 -#define _BINARY_OP_ADD_INT_r03 562 -#define _BINARY_OP_ADD_INT_r13 563 -#define _BINARY_OP_ADD_INT_r23 564 -#define _BINARY_OP_ADD_UNICODE_r03 565 -#define _BINARY_OP_ADD_UNICODE_r13 566 -#define _BINARY_OP_ADD_UNICODE_r23 567 -#define _BINARY_OP_EXTEND_r21 568 -#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 569 -#define _BINARY_OP_MULTIPLY_FLOAT_r03 570 -#define _BINARY_OP_MULTIPLY_FLOAT_r13 571 -#define _BINARY_OP_MULTIPLY_FLOAT_r23 572 -#define _BINARY_OP_MULTIPLY_INT_r03 573 -#define _BINARY_OP_MULTIPLY_INT_r13 574 -#define _BINARY_OP_MULTIPLY_INT_r23 575 -#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 576 -#define _BINARY_OP_SUBSCR_DICT_r21 577 -#define _BINARY_OP_SUBSCR_INIT_CALL_r01 578 -#define _BINARY_OP_SUBSCR_INIT_CALL_r11 579 -#define _BINARY_OP_SUBSCR_INIT_CALL_r21 580 -#define _BINARY_OP_SUBSCR_INIT_CALL_r31 581 -#define _BINARY_OP_SUBSCR_LIST_INT_r23 582 -#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 583 -#define _BINARY_OP_SUBSCR_STR_INT_r23 584 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 585 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 586 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 587 -#define _BINARY_OP_SUBTRACT_FLOAT_r03 588 -#define _BINARY_OP_SUBTRACT_FLOAT_r13 589 -#define _BINARY_OP_SUBTRACT_FLOAT_r23 590 -#define _BINARY_OP_SUBTRACT_INT_r03 591 -#define _BINARY_OP_SUBTRACT_INT_r13 592 -#define _BINARY_OP_SUBTRACT_INT_r23 593 -#define _BINARY_SLICE_r31 594 -#define _BUILD_INTERPOLATION_r01 595 -#define _BUILD_LIST_r01 596 -#define _BUILD_MAP_r01 597 -#define _BUILD_SET_r01 598 -#define _BUILD_SLICE_r01 599 -#define _BUILD_STRING_r01 600 -#define _BUILD_TEMPLATE_r21 601 -#define _BUILD_TUPLE_r01 602 -#define _CALL_BUILTIN_CLASS_r01 603 -#define _CALL_BUILTIN_FAST_r01 604 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 605 -#define _CALL_BUILTIN_O_r03 606 -#define _CALL_INTRINSIC_1_r11 607 -#define _CALL_INTRINSIC_2_r21 608 -#define _CALL_ISINSTANCE_r31 609 -#define _CALL_KW_NON_PY_r11 610 -#define _CALL_LEN_r33 611 -#define _CALL_LIST_APPEND_r03 612 -#define _CALL_LIST_APPEND_r13 613 -#define _CALL_LIST_APPEND_r23 614 -#define _CALL_LIST_APPEND_r33 615 -#define _CALL_METHOD_DESCRIPTOR_FAST_r01 616 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 617 -#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 618 -#define _CALL_METHOD_DESCRIPTOR_O_r01 619 -#define _CALL_NON_PY_GENERAL_r01 620 -#define _CALL_STR_1_r32 621 -#define _CALL_TUPLE_1_r32 622 -#define _CALL_TYPE_1_r02 623 -#define _CALL_TYPE_1_r12 624 -#define _CALL_TYPE_1_r22 625 -#define _CALL_TYPE_1_r32 626 -#define _CHECK_AND_ALLOCATE_OBJECT_r00 627 -#define _CHECK_ATTR_CLASS_r01 628 -#define _CHECK_ATTR_CLASS_r11 629 -#define _CHECK_ATTR_CLASS_r22 630 -#define _CHECK_ATTR_CLASS_r33 631 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 632 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 633 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 634 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 635 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 636 -#define _CHECK_EG_MATCH_r22 637 -#define _CHECK_EXC_MATCH_r22 638 -#define _CHECK_FUNCTION_EXACT_ARGS_r00 639 -#define _CHECK_FUNCTION_VERSION_r00 640 -#define _CHECK_FUNCTION_VERSION_INLINE_r00 641 -#define _CHECK_FUNCTION_VERSION_INLINE_r11 642 -#define _CHECK_FUNCTION_VERSION_INLINE_r22 643 -#define _CHECK_FUNCTION_VERSION_INLINE_r33 644 -#define _CHECK_FUNCTION_VERSION_KW_r11 645 -#define _CHECK_IS_NOT_PY_CALLABLE_r00 646 -#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 647 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 648 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 649 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 650 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 651 -#define _CHECK_METHOD_VERSION_r00 652 -#define _CHECK_METHOD_VERSION_KW_r11 653 -#define _CHECK_PEP_523_r00 654 -#define _CHECK_PEP_523_r11 655 -#define _CHECK_PEP_523_r22 656 -#define _CHECK_PEP_523_r33 657 -#define _CHECK_PERIODIC_r00 658 -#define _CHECK_PERIODIC_AT_END_r00 659 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 660 -#define _CHECK_RECURSION_REMAINING_r00 661 -#define _CHECK_RECURSION_REMAINING_r11 662 -#define _CHECK_RECURSION_REMAINING_r22 663 -#define _CHECK_RECURSION_REMAINING_r33 664 -#define _CHECK_STACK_SPACE_r00 665 -#define _CHECK_STACK_SPACE_OPERAND_r00 666 -#define _CHECK_STACK_SPACE_OPERAND_r11 667 -#define _CHECK_STACK_SPACE_OPERAND_r22 668 -#define _CHECK_STACK_SPACE_OPERAND_r33 669 -#define _CHECK_VALIDITY_r00 670 -#define _CHECK_VALIDITY_r11 671 -#define _CHECK_VALIDITY_r22 672 -#define _CHECK_VALIDITY_r33 673 -#define _COLD_DYNAMIC_EXIT_r00 674 -#define _COLD_EXIT_r00 675 -#define _COMPARE_OP_r21 676 -#define _COMPARE_OP_FLOAT_r03 677 -#define _COMPARE_OP_FLOAT_r13 678 -#define _COMPARE_OP_FLOAT_r23 679 -#define _COMPARE_OP_INT_r23 680 -#define _COMPARE_OP_STR_r23 681 -#define _CONTAINS_OP_r21 682 -#define _CONTAINS_OP_DICT_r21 683 -#define _CONTAINS_OP_SET_r21 684 -#define _CONVERT_VALUE_r11 685 -#define _COPY_r01 686 -#define _COPY_1_r02 687 -#define _COPY_1_r12 688 -#define _COPY_1_r23 689 -#define _COPY_2_r03 690 -#define _COPY_2_r13 691 -#define _COPY_2_r23 692 -#define _COPY_3_r03 693 -#define _COPY_3_r13 694 -#define _COPY_3_r23 695 -#define _COPY_3_r33 696 -#define _COPY_FREE_VARS_r00 697 -#define _COPY_FREE_VARS_r11 698 -#define _COPY_FREE_VARS_r22 699 -#define _COPY_FREE_VARS_r33 700 -#define _CREATE_INIT_FRAME_r01 701 -#define _DELETE_ATTR_r10 702 -#define _DELETE_DEREF_r00 703 -#define _DELETE_FAST_r00 704 -#define _DELETE_GLOBAL_r00 705 -#define _DELETE_NAME_r00 706 -#define _DELETE_SUBSCR_r20 707 -#define _DEOPT_r00 708 -#define _DEOPT_r10 709 -#define _DEOPT_r20 710 -#define _DEOPT_r30 711 -#define _DICT_MERGE_r10 712 -#define _DICT_UPDATE_r10 713 -#define _DO_CALL_r01 714 -#define _DO_CALL_FUNCTION_EX_r31 715 -#define _DO_CALL_KW_r11 716 -#define _DYNAMIC_EXIT_r00 717 -#define _DYNAMIC_EXIT_r10 718 -#define _DYNAMIC_EXIT_r20 719 -#define _DYNAMIC_EXIT_r30 720 -#define _END_FOR_r10 721 -#define _END_SEND_r21 722 -#define _ERROR_POP_N_r00 723 -#define _EXIT_INIT_CHECK_r10 724 -#define _EXIT_TRACE_r00 725 -#define _EXIT_TRACE_r10 726 -#define _EXIT_TRACE_r20 727 -#define _EXIT_TRACE_r30 728 -#define _EXPAND_METHOD_r00 729 -#define _EXPAND_METHOD_KW_r11 730 -#define _FATAL_ERROR_r00 731 -#define _FATAL_ERROR_r11 732 -#define _FATAL_ERROR_r22 733 -#define _FATAL_ERROR_r33 734 -#define _FORMAT_SIMPLE_r11 735 -#define _FORMAT_WITH_SPEC_r21 736 -#define _FOR_ITER_r23 737 -#define _FOR_ITER_GEN_FRAME_r03 738 -#define _FOR_ITER_GEN_FRAME_r13 739 -#define _FOR_ITER_GEN_FRAME_r23 740 -#define _FOR_ITER_TIER_TWO_r23 741 -#define _GET_AITER_r11 742 -#define _GET_ANEXT_r12 743 -#define _GET_AWAITABLE_r11 744 -#define _GET_ITER_r12 745 -#define _GET_LEN_r12 746 -#define _GET_YIELD_FROM_ITER_r11 747 -#define _GUARD_BINARY_OP_EXTEND_r22 748 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 749 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 750 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 751 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 752 -#define _GUARD_CALLABLE_ISINSTANCE_r03 753 -#define _GUARD_CALLABLE_ISINSTANCE_r13 754 -#define _GUARD_CALLABLE_ISINSTANCE_r23 755 -#define _GUARD_CALLABLE_ISINSTANCE_r33 756 -#define _GUARD_CALLABLE_LEN_r03 757 -#define _GUARD_CALLABLE_LEN_r13 758 -#define _GUARD_CALLABLE_LEN_r23 759 -#define _GUARD_CALLABLE_LEN_r33 760 -#define _GUARD_CALLABLE_LIST_APPEND_r03 761 -#define _GUARD_CALLABLE_LIST_APPEND_r13 762 -#define _GUARD_CALLABLE_LIST_APPEND_r23 763 -#define _GUARD_CALLABLE_LIST_APPEND_r33 764 -#define _GUARD_CALLABLE_STR_1_r03 765 -#define _GUARD_CALLABLE_STR_1_r13 766 -#define _GUARD_CALLABLE_STR_1_r23 767 -#define _GUARD_CALLABLE_STR_1_r33 768 -#define _GUARD_CALLABLE_TUPLE_1_r03 769 -#define _GUARD_CALLABLE_TUPLE_1_r13 770 -#define _GUARD_CALLABLE_TUPLE_1_r23 771 -#define _GUARD_CALLABLE_TUPLE_1_r33 772 -#define _GUARD_CALLABLE_TYPE_1_r03 773 -#define _GUARD_CALLABLE_TYPE_1_r13 774 -#define _GUARD_CALLABLE_TYPE_1_r23 775 -#define _GUARD_CALLABLE_TYPE_1_r33 776 -#define _GUARD_DORV_NO_DICT_r01 777 -#define _GUARD_DORV_NO_DICT_r11 778 -#define _GUARD_DORV_NO_DICT_r22 779 -#define _GUARD_DORV_NO_DICT_r33 780 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 781 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 782 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 783 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 784 -#define _GUARD_GLOBALS_VERSION_r00 785 -#define _GUARD_GLOBALS_VERSION_r11 786 -#define _GUARD_GLOBALS_VERSION_r22 787 -#define _GUARD_GLOBALS_VERSION_r33 788 -#define _GUARD_IP_RETURN_GENERATOR_r00 789 -#define _GUARD_IP_RETURN_GENERATOR_r11 790 -#define _GUARD_IP_RETURN_GENERATOR_r22 791 -#define _GUARD_IP_RETURN_GENERATOR_r33 792 -#define _GUARD_IP_RETURN_VALUE_r00 793 -#define _GUARD_IP_RETURN_VALUE_r11 794 -#define _GUARD_IP_RETURN_VALUE_r22 795 -#define _GUARD_IP_RETURN_VALUE_r33 796 -#define _GUARD_IP_YIELD_VALUE_r00 797 -#define _GUARD_IP_YIELD_VALUE_r11 798 -#define _GUARD_IP_YIELD_VALUE_r22 799 -#define _GUARD_IP_YIELD_VALUE_r33 800 -#define _GUARD_IP__PUSH_FRAME_r00 801 -#define _GUARD_IP__PUSH_FRAME_r11 802 -#define _GUARD_IP__PUSH_FRAME_r22 803 -#define _GUARD_IP__PUSH_FRAME_r33 804 -#define _GUARD_IS_FALSE_POP_r00 805 -#define _GUARD_IS_FALSE_POP_r10 806 -#define _GUARD_IS_FALSE_POP_r21 807 -#define _GUARD_IS_FALSE_POP_r32 808 -#define _GUARD_IS_NONE_POP_r00 809 -#define _GUARD_IS_NONE_POP_r10 810 -#define _GUARD_IS_NONE_POP_r21 811 -#define _GUARD_IS_NONE_POP_r32 812 -#define _GUARD_IS_NOT_NONE_POP_r10 813 -#define _GUARD_IS_TRUE_POP_r00 814 -#define _GUARD_IS_TRUE_POP_r10 815 -#define _GUARD_IS_TRUE_POP_r21 816 -#define _GUARD_IS_TRUE_POP_r32 817 -#define _GUARD_KEYS_VERSION_r01 818 -#define _GUARD_KEYS_VERSION_r11 819 -#define _GUARD_KEYS_VERSION_r22 820 -#define _GUARD_KEYS_VERSION_r33 821 -#define _GUARD_NOS_DICT_r02 822 -#define _GUARD_NOS_DICT_r12 823 -#define _GUARD_NOS_DICT_r22 824 -#define _GUARD_NOS_DICT_r33 825 -#define _GUARD_NOS_FLOAT_r02 826 -#define _GUARD_NOS_FLOAT_r12 827 -#define _GUARD_NOS_FLOAT_r22 828 -#define _GUARD_NOS_FLOAT_r33 829 -#define _GUARD_NOS_INT_r02 830 -#define _GUARD_NOS_INT_r12 831 -#define _GUARD_NOS_INT_r22 832 -#define _GUARD_NOS_INT_r33 833 -#define _GUARD_NOS_LIST_r02 834 -#define _GUARD_NOS_LIST_r12 835 -#define _GUARD_NOS_LIST_r22 836 -#define _GUARD_NOS_LIST_r33 837 -#define _GUARD_NOS_NOT_NULL_r02 838 -#define _GUARD_NOS_NOT_NULL_r12 839 -#define _GUARD_NOS_NOT_NULL_r22 840 -#define _GUARD_NOS_NOT_NULL_r33 841 -#define _GUARD_NOS_NULL_r02 842 -#define _GUARD_NOS_NULL_r12 843 -#define _GUARD_NOS_NULL_r22 844 -#define _GUARD_NOS_NULL_r33 845 -#define _GUARD_NOS_OVERFLOWED_r02 846 -#define _GUARD_NOS_OVERFLOWED_r12 847 -#define _GUARD_NOS_OVERFLOWED_r22 848 -#define _GUARD_NOS_OVERFLOWED_r33 849 -#define _GUARD_NOS_TUPLE_r02 850 -#define _GUARD_NOS_TUPLE_r12 851 -#define _GUARD_NOS_TUPLE_r22 852 -#define _GUARD_NOS_TUPLE_r33 853 -#define _GUARD_NOS_UNICODE_r02 854 -#define _GUARD_NOS_UNICODE_r12 855 -#define _GUARD_NOS_UNICODE_r22 856 -#define _GUARD_NOS_UNICODE_r33 857 -#define _GUARD_NOT_EXHAUSTED_LIST_r02 858 -#define _GUARD_NOT_EXHAUSTED_LIST_r12 859 -#define _GUARD_NOT_EXHAUSTED_LIST_r22 860 -#define _GUARD_NOT_EXHAUSTED_LIST_r33 861 -#define _GUARD_NOT_EXHAUSTED_RANGE_r02 862 -#define _GUARD_NOT_EXHAUSTED_RANGE_r12 863 -#define _GUARD_NOT_EXHAUSTED_RANGE_r22 864 -#define _GUARD_NOT_EXHAUSTED_RANGE_r33 865 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 866 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 867 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 868 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 869 -#define _GUARD_THIRD_NULL_r03 870 -#define _GUARD_THIRD_NULL_r13 871 -#define _GUARD_THIRD_NULL_r23 872 -#define _GUARD_THIRD_NULL_r33 873 -#define _GUARD_TOS_ANY_SET_r01 874 -#define _GUARD_TOS_ANY_SET_r11 875 -#define _GUARD_TOS_ANY_SET_r22 876 -#define _GUARD_TOS_ANY_SET_r33 877 -#define _GUARD_TOS_DICT_r01 878 -#define _GUARD_TOS_DICT_r11 879 -#define _GUARD_TOS_DICT_r22 880 -#define _GUARD_TOS_DICT_r33 881 -#define _GUARD_TOS_FLOAT_r01 882 -#define _GUARD_TOS_FLOAT_r11 883 -#define _GUARD_TOS_FLOAT_r22 884 -#define _GUARD_TOS_FLOAT_r33 885 -#define _GUARD_TOS_INT_r01 886 -#define _GUARD_TOS_INT_r11 887 -#define _GUARD_TOS_INT_r22 888 -#define _GUARD_TOS_INT_r33 889 -#define _GUARD_TOS_LIST_r01 890 -#define _GUARD_TOS_LIST_r11 891 -#define _GUARD_TOS_LIST_r22 892 -#define _GUARD_TOS_LIST_r33 893 -#define _GUARD_TOS_OVERFLOWED_r01 894 -#define _GUARD_TOS_OVERFLOWED_r11 895 -#define _GUARD_TOS_OVERFLOWED_r22 896 -#define _GUARD_TOS_OVERFLOWED_r33 897 -#define _GUARD_TOS_SLICE_r01 898 -#define _GUARD_TOS_SLICE_r11 899 -#define _GUARD_TOS_SLICE_r22 900 -#define _GUARD_TOS_SLICE_r33 901 -#define _GUARD_TOS_TUPLE_r01 902 -#define _GUARD_TOS_TUPLE_r11 903 -#define _GUARD_TOS_TUPLE_r22 904 -#define _GUARD_TOS_TUPLE_r33 905 -#define _GUARD_TOS_UNICODE_r01 906 -#define _GUARD_TOS_UNICODE_r11 907 -#define _GUARD_TOS_UNICODE_r22 908 -#define _GUARD_TOS_UNICODE_r33 909 -#define _GUARD_TYPE_VERSION_r01 910 -#define _GUARD_TYPE_VERSION_r11 911 -#define _GUARD_TYPE_VERSION_r22 912 -#define _GUARD_TYPE_VERSION_r33 913 -#define _GUARD_TYPE_VERSION_AND_LOCK_r01 914 -#define _GUARD_TYPE_VERSION_AND_LOCK_r11 915 -#define _GUARD_TYPE_VERSION_AND_LOCK_r22 916 -#define _GUARD_TYPE_VERSION_AND_LOCK_r33 917 -#define _HANDLE_PENDING_AND_DEOPT_r00 918 -#define _HANDLE_PENDING_AND_DEOPT_r10 919 -#define _HANDLE_PENDING_AND_DEOPT_r20 920 -#define _HANDLE_PENDING_AND_DEOPT_r30 921 -#define _IMPORT_FROM_r12 922 -#define _IMPORT_NAME_r21 923 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 924 -#define _INIT_CALL_PY_EXACT_ARGS_r01 925 -#define _INIT_CALL_PY_EXACT_ARGS_0_r01 926 -#define _INIT_CALL_PY_EXACT_ARGS_1_r01 927 -#define _INIT_CALL_PY_EXACT_ARGS_2_r01 928 -#define _INIT_CALL_PY_EXACT_ARGS_3_r01 929 -#define _INIT_CALL_PY_EXACT_ARGS_4_r01 930 -#define _INSERT_NULL_r10 931 -#define _INSTRUMENTED_FOR_ITER_r23 932 -#define _INSTRUMENTED_INSTRUCTION_r00 933 -#define _INSTRUMENTED_JUMP_FORWARD_r00 934 -#define _INSTRUMENTED_JUMP_FORWARD_r11 935 -#define _INSTRUMENTED_JUMP_FORWARD_r22 936 -#define _INSTRUMENTED_JUMP_FORWARD_r33 937 -#define _INSTRUMENTED_LINE_r00 938 -#define _INSTRUMENTED_NOT_TAKEN_r00 939 -#define _INSTRUMENTED_NOT_TAKEN_r11 940 -#define _INSTRUMENTED_NOT_TAKEN_r22 941 -#define _INSTRUMENTED_NOT_TAKEN_r33 942 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 943 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 944 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 945 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 946 -#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 947 -#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 948 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 949 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 950 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 951 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 952 -#define _IS_NONE_r11 953 -#define _IS_OP_r03 954 -#define _IS_OP_r13 955 -#define _IS_OP_r23 956 -#define _ITER_CHECK_LIST_r02 957 -#define _ITER_CHECK_LIST_r12 958 -#define _ITER_CHECK_LIST_r22 959 -#define _ITER_CHECK_LIST_r33 960 -#define _ITER_CHECK_RANGE_r02 961 -#define _ITER_CHECK_RANGE_r12 962 -#define _ITER_CHECK_RANGE_r22 963 -#define _ITER_CHECK_RANGE_r33 964 -#define _ITER_CHECK_TUPLE_r02 965 -#define _ITER_CHECK_TUPLE_r12 966 -#define _ITER_CHECK_TUPLE_r22 967 -#define _ITER_CHECK_TUPLE_r33 968 -#define _ITER_JUMP_LIST_r02 969 -#define _ITER_JUMP_LIST_r12 970 -#define _ITER_JUMP_LIST_r22 971 -#define _ITER_JUMP_LIST_r33 972 -#define _ITER_JUMP_RANGE_r02 973 -#define _ITER_JUMP_RANGE_r12 974 -#define _ITER_JUMP_RANGE_r22 975 -#define _ITER_JUMP_RANGE_r33 976 -#define _ITER_JUMP_TUPLE_r02 977 -#define _ITER_JUMP_TUPLE_r12 978 -#define _ITER_JUMP_TUPLE_r22 979 -#define _ITER_JUMP_TUPLE_r33 980 -#define _ITER_NEXT_LIST_r23 981 -#define _ITER_NEXT_LIST_TIER_TWO_r23 982 -#define _ITER_NEXT_RANGE_r03 983 -#define _ITER_NEXT_RANGE_r13 984 -#define _ITER_NEXT_RANGE_r23 985 -#define _ITER_NEXT_TUPLE_r03 986 -#define _ITER_NEXT_TUPLE_r13 987 -#define _ITER_NEXT_TUPLE_r23 988 -#define _JUMP_BACKWARD_NO_INTERRUPT_r00 989 -#define _JUMP_BACKWARD_NO_INTERRUPT_r11 990 -#define _JUMP_BACKWARD_NO_INTERRUPT_r22 991 -#define _JUMP_BACKWARD_NO_INTERRUPT_r33 992 -#define _JUMP_TO_TOP_r00 993 -#define _LIST_APPEND_r10 994 -#define _LIST_EXTEND_r10 995 -#define _LOAD_ATTR_r10 996 -#define _LOAD_ATTR_CLASS_r11 997 -#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 998 -#define _LOAD_ATTR_INSTANCE_VALUE_r02 999 -#define _LOAD_ATTR_INSTANCE_VALUE_r12 1000 -#define _LOAD_ATTR_INSTANCE_VALUE_r23 1001 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1002 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1003 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1004 -#define _LOAD_ATTR_METHOD_NO_DICT_r02 1005 -#define _LOAD_ATTR_METHOD_NO_DICT_r12 1006 -#define _LOAD_ATTR_METHOD_NO_DICT_r23 1007 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1008 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1009 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1010 -#define _LOAD_ATTR_MODULE_r11 1011 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1012 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1013 -#define _LOAD_ATTR_PROPERTY_FRAME_r11 1014 -#define _LOAD_ATTR_SLOT_r11 1015 -#define _LOAD_ATTR_WITH_HINT_r12 1016 -#define _LOAD_BUILD_CLASS_r01 1017 -#define _LOAD_BYTECODE_r00 1018 -#define _LOAD_COMMON_CONSTANT_r01 1019 -#define _LOAD_COMMON_CONSTANT_r12 1020 -#define _LOAD_COMMON_CONSTANT_r23 1021 -#define _LOAD_CONST_r01 1022 -#define _LOAD_CONST_r12 1023 -#define _LOAD_CONST_r23 1024 -#define _LOAD_CONST_INLINE_r01 1025 -#define _LOAD_CONST_INLINE_r12 1026 -#define _LOAD_CONST_INLINE_r23 1027 -#define _LOAD_CONST_INLINE_BORROW_r01 1028 -#define _LOAD_CONST_INLINE_BORROW_r12 1029 -#define _LOAD_CONST_INLINE_BORROW_r23 1030 -#define _LOAD_CONST_UNDER_INLINE_r02 1031 -#define _LOAD_CONST_UNDER_INLINE_r12 1032 -#define _LOAD_CONST_UNDER_INLINE_r23 1033 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1034 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1035 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1036 -#define _LOAD_DEREF_r01 1037 -#define _LOAD_FAST_r01 1038 -#define _LOAD_FAST_r12 1039 -#define _LOAD_FAST_r23 1040 -#define _LOAD_FAST_0_r01 1041 -#define _LOAD_FAST_0_r12 1042 -#define _LOAD_FAST_0_r23 1043 -#define _LOAD_FAST_1_r01 1044 -#define _LOAD_FAST_1_r12 1045 -#define _LOAD_FAST_1_r23 1046 -#define _LOAD_FAST_2_r01 1047 -#define _LOAD_FAST_2_r12 1048 -#define _LOAD_FAST_2_r23 1049 -#define _LOAD_FAST_3_r01 1050 -#define _LOAD_FAST_3_r12 1051 -#define _LOAD_FAST_3_r23 1052 -#define _LOAD_FAST_4_r01 1053 -#define _LOAD_FAST_4_r12 1054 -#define _LOAD_FAST_4_r23 1055 -#define _LOAD_FAST_5_r01 1056 -#define _LOAD_FAST_5_r12 1057 -#define _LOAD_FAST_5_r23 1058 -#define _LOAD_FAST_6_r01 1059 -#define _LOAD_FAST_6_r12 1060 -#define _LOAD_FAST_6_r23 1061 -#define _LOAD_FAST_7_r01 1062 -#define _LOAD_FAST_7_r12 1063 -#define _LOAD_FAST_7_r23 1064 -#define _LOAD_FAST_AND_CLEAR_r01 1065 -#define _LOAD_FAST_AND_CLEAR_r12 1066 -#define _LOAD_FAST_AND_CLEAR_r23 1067 -#define _LOAD_FAST_BORROW_r01 1068 -#define _LOAD_FAST_BORROW_r12 1069 -#define _LOAD_FAST_BORROW_r23 1070 -#define _LOAD_FAST_BORROW_0_r01 1071 -#define _LOAD_FAST_BORROW_0_r12 1072 -#define _LOAD_FAST_BORROW_0_r23 1073 -#define _LOAD_FAST_BORROW_1_r01 1074 -#define _LOAD_FAST_BORROW_1_r12 1075 -#define _LOAD_FAST_BORROW_1_r23 1076 -#define _LOAD_FAST_BORROW_2_r01 1077 -#define _LOAD_FAST_BORROW_2_r12 1078 -#define _LOAD_FAST_BORROW_2_r23 1079 -#define _LOAD_FAST_BORROW_3_r01 1080 -#define _LOAD_FAST_BORROW_3_r12 1081 -#define _LOAD_FAST_BORROW_3_r23 1082 -#define _LOAD_FAST_BORROW_4_r01 1083 -#define _LOAD_FAST_BORROW_4_r12 1084 -#define _LOAD_FAST_BORROW_4_r23 1085 -#define _LOAD_FAST_BORROW_5_r01 1086 -#define _LOAD_FAST_BORROW_5_r12 1087 -#define _LOAD_FAST_BORROW_5_r23 1088 -#define _LOAD_FAST_BORROW_6_r01 1089 -#define _LOAD_FAST_BORROW_6_r12 1090 -#define _LOAD_FAST_BORROW_6_r23 1091 -#define _LOAD_FAST_BORROW_7_r01 1092 -#define _LOAD_FAST_BORROW_7_r12 1093 -#define _LOAD_FAST_BORROW_7_r23 1094 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1095 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1096 -#define _LOAD_FAST_CHECK_r01 1097 -#define _LOAD_FAST_CHECK_r12 1098 -#define _LOAD_FAST_CHECK_r23 1099 -#define _LOAD_FAST_LOAD_FAST_r02 1100 -#define _LOAD_FAST_LOAD_FAST_r13 1101 -#define _LOAD_FROM_DICT_OR_DEREF_r11 1102 -#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1103 -#define _LOAD_GLOBAL_r00 1104 -#define _LOAD_GLOBAL_BUILTINS_r01 1105 -#define _LOAD_GLOBAL_MODULE_r01 1106 -#define _LOAD_LOCALS_r01 1107 -#define _LOAD_LOCALS_r12 1108 -#define _LOAD_LOCALS_r23 1109 -#define _LOAD_NAME_r01 1110 -#define _LOAD_SMALL_INT_r01 1111 -#define _LOAD_SMALL_INT_r12 1112 -#define _LOAD_SMALL_INT_r23 1113 -#define _LOAD_SMALL_INT_0_r01 1114 -#define _LOAD_SMALL_INT_0_r12 1115 -#define _LOAD_SMALL_INT_0_r23 1116 -#define _LOAD_SMALL_INT_1_r01 1117 -#define _LOAD_SMALL_INT_1_r12 1118 -#define _LOAD_SMALL_INT_1_r23 1119 -#define _LOAD_SMALL_INT_2_r01 1120 -#define _LOAD_SMALL_INT_2_r12 1121 -#define _LOAD_SMALL_INT_2_r23 1122 -#define _LOAD_SMALL_INT_3_r01 1123 -#define _LOAD_SMALL_INT_3_r12 1124 -#define _LOAD_SMALL_INT_3_r23 1125 -#define _LOAD_SPECIAL_r00 1126 -#define _LOAD_SUPER_ATTR_ATTR_r31 1127 -#define _LOAD_SUPER_ATTR_METHOD_r32 1128 -#define _MAKE_CALLARGS_A_TUPLE_r33 1129 -#define _MAKE_CELL_r00 1130 -#define _MAKE_FUNCTION_r11 1131 -#define _MAKE_WARM_r00 1132 -#define _MAKE_WARM_r11 1133 -#define _MAKE_WARM_r22 1134 -#define _MAKE_WARM_r33 1135 -#define _MAP_ADD_r20 1136 -#define _MATCH_CLASS_r31 1137 -#define _MATCH_KEYS_r23 1138 -#define _MATCH_MAPPING_r02 1139 -#define _MATCH_MAPPING_r12 1140 -#define _MATCH_MAPPING_r23 1141 -#define _MATCH_SEQUENCE_r02 1142 -#define _MATCH_SEQUENCE_r12 1143 -#define _MATCH_SEQUENCE_r23 1144 -#define _MAYBE_EXPAND_METHOD_r00 1145 -#define _MAYBE_EXPAND_METHOD_KW_r11 1146 -#define _MONITOR_CALL_r00 1147 -#define _MONITOR_CALL_KW_r11 1148 -#define _MONITOR_JUMP_BACKWARD_r00 1149 -#define _MONITOR_JUMP_BACKWARD_r11 1150 -#define _MONITOR_JUMP_BACKWARD_r22 1151 -#define _MONITOR_JUMP_BACKWARD_r33 1152 -#define _MONITOR_RESUME_r00 1153 -#define _NOP_r00 1154 -#define _NOP_r11 1155 -#define _NOP_r22 1156 -#define _NOP_r33 1157 -#define _POP_CALL_r20 1158 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1159 -#define _POP_CALL_ONE_r30 1160 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1161 -#define _POP_CALL_TWO_r30 1162 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1163 -#define _POP_EXCEPT_r10 1164 -#define _POP_ITER_r20 1165 -#define _POP_JUMP_IF_FALSE_r00 1166 -#define _POP_JUMP_IF_FALSE_r10 1167 -#define _POP_JUMP_IF_FALSE_r21 1168 -#define _POP_JUMP_IF_FALSE_r32 1169 -#define _POP_JUMP_IF_TRUE_r00 1170 -#define _POP_JUMP_IF_TRUE_r10 1171 -#define _POP_JUMP_IF_TRUE_r21 1172 -#define _POP_JUMP_IF_TRUE_r32 1173 -#define _POP_TOP_r10 1174 -#define _POP_TOP_FLOAT_r00 1175 -#define _POP_TOP_FLOAT_r10 1176 -#define _POP_TOP_FLOAT_r21 1177 -#define _POP_TOP_FLOAT_r32 1178 -#define _POP_TOP_INT_r00 1179 -#define _POP_TOP_INT_r10 1180 -#define _POP_TOP_INT_r21 1181 -#define _POP_TOP_INT_r32 1182 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1183 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1184 -#define _POP_TOP_NOP_r00 1185 -#define _POP_TOP_NOP_r10 1186 -#define _POP_TOP_NOP_r21 1187 -#define _POP_TOP_NOP_r32 1188 -#define _POP_TOP_UNICODE_r00 1189 -#define _POP_TOP_UNICODE_r10 1190 -#define _POP_TOP_UNICODE_r21 1191 -#define _POP_TOP_UNICODE_r32 1192 -#define _POP_TWO_r20 1193 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1194 -#define _PUSH_EXC_INFO_r02 1195 -#define _PUSH_EXC_INFO_r12 1196 -#define _PUSH_EXC_INFO_r23 1197 -#define _PUSH_FRAME_r10 1198 -#define _PUSH_NULL_r01 1199 -#define _PUSH_NULL_r12 1200 -#define _PUSH_NULL_r23 1201 -#define _PUSH_NULL_CONDITIONAL_r00 1202 -#define _PY_FRAME_GENERAL_r01 1203 -#define _PY_FRAME_KW_r11 1204 -#define _QUICKEN_RESUME_r00 1205 -#define _QUICKEN_RESUME_r11 1206 -#define _QUICKEN_RESUME_r22 1207 -#define _QUICKEN_RESUME_r33 1208 -#define _REPLACE_WITH_TRUE_r11 1209 -#define _RESUME_CHECK_r00 1210 -#define _RESUME_CHECK_r11 1211 -#define _RESUME_CHECK_r22 1212 -#define _RESUME_CHECK_r33 1213 -#define _RETURN_GENERATOR_r01 1214 -#define _RETURN_VALUE_r11 1215 -#define _SAVE_RETURN_OFFSET_r00 1216 -#define _SAVE_RETURN_OFFSET_r11 1217 -#define _SAVE_RETURN_OFFSET_r22 1218 -#define _SAVE_RETURN_OFFSET_r33 1219 -#define _SEND_r22 1220 -#define _SEND_GEN_FRAME_r22 1221 -#define _SETUP_ANNOTATIONS_r00 1222 -#define _SET_ADD_r10 1223 -#define _SET_FUNCTION_ATTRIBUTE_r01 1224 -#define _SET_FUNCTION_ATTRIBUTE_r11 1225 -#define _SET_FUNCTION_ATTRIBUTE_r21 1226 -#define _SET_FUNCTION_ATTRIBUTE_r32 1227 -#define _SET_IP_r00 1228 -#define _SET_IP_r11 1229 -#define _SET_IP_r22 1230 -#define _SET_IP_r33 1231 -#define _SET_UPDATE_r10 1232 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1233 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1234 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1235 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1236 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1237 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1238 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1239 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1240 -#define _SPILL_OR_RELOAD_r01 1241 -#define _SPILL_OR_RELOAD_r02 1242 -#define _SPILL_OR_RELOAD_r03 1243 -#define _SPILL_OR_RELOAD_r10 1244 -#define _SPILL_OR_RELOAD_r12 1245 -#define _SPILL_OR_RELOAD_r13 1246 -#define _SPILL_OR_RELOAD_r20 1247 -#define _SPILL_OR_RELOAD_r21 1248 -#define _SPILL_OR_RELOAD_r23 1249 -#define _SPILL_OR_RELOAD_r30 1250 -#define _SPILL_OR_RELOAD_r31 1251 -#define _SPILL_OR_RELOAD_r32 1252 -#define _START_EXECUTOR_r00 1253 -#define _STORE_ATTR_r20 1254 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1255 -#define _STORE_ATTR_SLOT_r21 1256 -#define _STORE_ATTR_WITH_HINT_r21 1257 -#define _STORE_DEREF_r10 1258 -#define _STORE_FAST_r10 1259 -#define _STORE_FAST_0_r10 1260 -#define _STORE_FAST_1_r10 1261 -#define _STORE_FAST_2_r10 1262 -#define _STORE_FAST_3_r10 1263 -#define _STORE_FAST_4_r10 1264 -#define _STORE_FAST_5_r10 1265 -#define _STORE_FAST_6_r10 1266 -#define _STORE_FAST_7_r10 1267 -#define _STORE_FAST_LOAD_FAST_r11 1268 -#define _STORE_FAST_STORE_FAST_r20 1269 -#define _STORE_GLOBAL_r10 1270 -#define _STORE_NAME_r10 1271 -#define _STORE_SLICE_r30 1272 -#define _STORE_SUBSCR_r30 1273 -#define _STORE_SUBSCR_DICT_r31 1274 -#define _STORE_SUBSCR_LIST_INT_r32 1275 -#define _SWAP_r11 1276 -#define _SWAP_2_r02 1277 -#define _SWAP_2_r12 1278 -#define _SWAP_2_r22 1279 -#define _SWAP_2_r33 1280 -#define _SWAP_3_r03 1281 -#define _SWAP_3_r13 1282 -#define _SWAP_3_r23 1283 -#define _SWAP_3_r33 1284 -#define _TIER2_RESUME_CHECK_r00 1285 -#define _TIER2_RESUME_CHECK_r11 1286 -#define _TIER2_RESUME_CHECK_r22 1287 -#define _TIER2_RESUME_CHECK_r33 1288 -#define _TO_BOOL_r11 1289 -#define _TO_BOOL_BOOL_r01 1290 -#define _TO_BOOL_BOOL_r11 1291 -#define _TO_BOOL_BOOL_r22 1292 -#define _TO_BOOL_BOOL_r33 1293 -#define _TO_BOOL_INT_r11 1294 -#define _TO_BOOL_LIST_r11 1295 -#define _TO_BOOL_NONE_r01 1296 -#define _TO_BOOL_NONE_r11 1297 -#define _TO_BOOL_NONE_r22 1298 -#define _TO_BOOL_NONE_r33 1299 -#define _TO_BOOL_STR_r11 1300 -#define _TRACE_RECORD_r00 1301 -#define _UNARY_INVERT_r11 1302 -#define _UNARY_NEGATIVE_r11 1303 -#define _UNARY_NOT_r01 1304 -#define _UNARY_NOT_r11 1305 -#define _UNARY_NOT_r22 1306 -#define _UNARY_NOT_r33 1307 -#define _UNPACK_EX_r10 1308 -#define _UNPACK_SEQUENCE_r10 1309 -#define _UNPACK_SEQUENCE_LIST_r10 1310 -#define _UNPACK_SEQUENCE_TUPLE_r10 1311 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1312 -#define _WITH_EXCEPT_START_r33 1313 -#define _YIELD_VALUE_r11 1314 -#define MAX_UOP_REGS_ID 1314 +#define MAX_UOP_ID 558 +#define _BINARY_OP_r21 559 +#define _BINARY_OP_ADD_FLOAT_r03 560 +#define _BINARY_OP_ADD_FLOAT_r13 561 +#define _BINARY_OP_ADD_FLOAT_r23 562 +#define _BINARY_OP_ADD_INT_r03 563 +#define _BINARY_OP_ADD_INT_r13 564 +#define _BINARY_OP_ADD_INT_r23 565 +#define _BINARY_OP_ADD_UNICODE_r03 566 +#define _BINARY_OP_ADD_UNICODE_r13 567 +#define _BINARY_OP_ADD_UNICODE_r23 568 +#define _BINARY_OP_EXTEND_r21 569 +#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 570 +#define _BINARY_OP_MULTIPLY_FLOAT_r03 571 +#define _BINARY_OP_MULTIPLY_FLOAT_r13 572 +#define _BINARY_OP_MULTIPLY_FLOAT_r23 573 +#define _BINARY_OP_MULTIPLY_INT_r03 574 +#define _BINARY_OP_MULTIPLY_INT_r13 575 +#define _BINARY_OP_MULTIPLY_INT_r23 576 +#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 577 +#define _BINARY_OP_SUBSCR_DICT_r21 578 +#define _BINARY_OP_SUBSCR_INIT_CALL_r01 579 +#define _BINARY_OP_SUBSCR_INIT_CALL_r11 580 +#define _BINARY_OP_SUBSCR_INIT_CALL_r21 581 +#define _BINARY_OP_SUBSCR_INIT_CALL_r31 582 +#define _BINARY_OP_SUBSCR_LIST_INT_r23 583 +#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 584 +#define _BINARY_OP_SUBSCR_STR_INT_r23 585 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 586 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 587 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 588 +#define _BINARY_OP_SUBTRACT_FLOAT_r03 589 +#define _BINARY_OP_SUBTRACT_FLOAT_r13 590 +#define _BINARY_OP_SUBTRACT_FLOAT_r23 591 +#define _BINARY_OP_SUBTRACT_INT_r03 592 +#define _BINARY_OP_SUBTRACT_INT_r13 593 +#define _BINARY_OP_SUBTRACT_INT_r23 594 +#define _BINARY_SLICE_r31 595 +#define _BUILD_INTERPOLATION_r01 596 +#define _BUILD_LIST_r01 597 +#define _BUILD_MAP_r01 598 +#define _BUILD_SET_r01 599 +#define _BUILD_SLICE_r01 600 +#define _BUILD_STRING_r01 601 +#define _BUILD_TEMPLATE_r21 602 +#define _BUILD_TUPLE_r01 603 +#define _CALL_BUILTIN_CLASS_r01 604 +#define _CALL_BUILTIN_FAST_r01 605 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 606 +#define _CALL_BUILTIN_O_r03 607 +#define _CALL_INTRINSIC_1_r11 608 +#define _CALL_INTRINSIC_2_r21 609 +#define _CALL_ISINSTANCE_r31 610 +#define _CALL_KW_NON_PY_r11 611 +#define _CALL_LEN_r33 612 +#define _CALL_LIST_APPEND_r03 613 +#define _CALL_LIST_APPEND_r13 614 +#define _CALL_LIST_APPEND_r23 615 +#define _CALL_LIST_APPEND_r33 616 +#define _CALL_METHOD_DESCRIPTOR_FAST_r01 617 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 618 +#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 619 +#define _CALL_METHOD_DESCRIPTOR_O_r01 620 +#define _CALL_NON_PY_GENERAL_r01 621 +#define _CALL_STR_1_r32 622 +#define _CALL_TUPLE_1_r32 623 +#define _CALL_TYPE_1_r02 624 +#define _CALL_TYPE_1_r12 625 +#define _CALL_TYPE_1_r22 626 +#define _CALL_TYPE_1_r32 627 +#define _CHECK_AND_ALLOCATE_OBJECT_r00 628 +#define _CHECK_ATTR_CLASS_r01 629 +#define _CHECK_ATTR_CLASS_r11 630 +#define _CHECK_ATTR_CLASS_r22 631 +#define _CHECK_ATTR_CLASS_r33 632 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 633 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 634 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 635 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 636 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 637 +#define _CHECK_EG_MATCH_r22 638 +#define _CHECK_EXC_MATCH_r22 639 +#define _CHECK_FUNCTION_EXACT_ARGS_r00 640 +#define _CHECK_FUNCTION_VERSION_r00 641 +#define _CHECK_FUNCTION_VERSION_INLINE_r00 642 +#define _CHECK_FUNCTION_VERSION_INLINE_r11 643 +#define _CHECK_FUNCTION_VERSION_INLINE_r22 644 +#define _CHECK_FUNCTION_VERSION_INLINE_r33 645 +#define _CHECK_FUNCTION_VERSION_KW_r11 646 +#define _CHECK_IS_NOT_PY_CALLABLE_r00 647 +#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 648 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 649 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 650 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 651 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 652 +#define _CHECK_METHOD_VERSION_r00 653 +#define _CHECK_METHOD_VERSION_KW_r11 654 +#define _CHECK_PEP_523_r00 655 +#define _CHECK_PEP_523_r11 656 +#define _CHECK_PEP_523_r22 657 +#define _CHECK_PEP_523_r33 658 +#define _CHECK_PERIODIC_r00 659 +#define _CHECK_PERIODIC_AT_END_r00 660 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 661 +#define _CHECK_RECURSION_REMAINING_r00 662 +#define _CHECK_RECURSION_REMAINING_r11 663 +#define _CHECK_RECURSION_REMAINING_r22 664 +#define _CHECK_RECURSION_REMAINING_r33 665 +#define _CHECK_STACK_SPACE_r00 666 +#define _CHECK_STACK_SPACE_OPERAND_r00 667 +#define _CHECK_STACK_SPACE_OPERAND_r11 668 +#define _CHECK_STACK_SPACE_OPERAND_r22 669 +#define _CHECK_STACK_SPACE_OPERAND_r33 670 +#define _CHECK_VALIDITY_r00 671 +#define _CHECK_VALIDITY_r11 672 +#define _CHECK_VALIDITY_r22 673 +#define _CHECK_VALIDITY_r33 674 +#define _COLD_DYNAMIC_EXIT_r00 675 +#define _COLD_EXIT_r00 676 +#define _COMPARE_OP_r21 677 +#define _COMPARE_OP_FLOAT_r03 678 +#define _COMPARE_OP_FLOAT_r13 679 +#define _COMPARE_OP_FLOAT_r23 680 +#define _COMPARE_OP_INT_r23 681 +#define _COMPARE_OP_STR_r23 682 +#define _CONTAINS_OP_r21 683 +#define _CONTAINS_OP_DICT_r21 684 +#define _CONTAINS_OP_SET_r21 685 +#define _CONVERT_VALUE_r11 686 +#define _COPY_r01 687 +#define _COPY_1_r02 688 +#define _COPY_1_r12 689 +#define _COPY_1_r23 690 +#define _COPY_2_r03 691 +#define _COPY_2_r13 692 +#define _COPY_2_r23 693 +#define _COPY_3_r03 694 +#define _COPY_3_r13 695 +#define _COPY_3_r23 696 +#define _COPY_3_r33 697 +#define _COPY_FREE_VARS_r00 698 +#define _COPY_FREE_VARS_r11 699 +#define _COPY_FREE_VARS_r22 700 +#define _COPY_FREE_VARS_r33 701 +#define _CREATE_INIT_FRAME_r01 702 +#define _DELETE_ATTR_r10 703 +#define _DELETE_DEREF_r00 704 +#define _DELETE_FAST_r00 705 +#define _DELETE_GLOBAL_r00 706 +#define _DELETE_NAME_r00 707 +#define _DELETE_SUBSCR_r20 708 +#define _DEOPT_r00 709 +#define _DEOPT_r10 710 +#define _DEOPT_r20 711 +#define _DEOPT_r30 712 +#define _DICT_MERGE_r10 713 +#define _DICT_UPDATE_r10 714 +#define _DO_CALL_r01 715 +#define _DO_CALL_FUNCTION_EX_r31 716 +#define _DO_CALL_KW_r11 717 +#define _DYNAMIC_EXIT_r00 718 +#define _DYNAMIC_EXIT_r10 719 +#define _DYNAMIC_EXIT_r20 720 +#define _DYNAMIC_EXIT_r30 721 +#define _END_FOR_r10 722 +#define _END_SEND_r21 723 +#define _ERROR_POP_N_r00 724 +#define _EXIT_INIT_CHECK_r10 725 +#define _EXIT_TRACE_r00 726 +#define _EXIT_TRACE_r10 727 +#define _EXIT_TRACE_r20 728 +#define _EXIT_TRACE_r30 729 +#define _EXPAND_METHOD_r00 730 +#define _EXPAND_METHOD_KW_r11 731 +#define _FATAL_ERROR_r00 732 +#define _FATAL_ERROR_r11 733 +#define _FATAL_ERROR_r22 734 +#define _FATAL_ERROR_r33 735 +#define _FORMAT_SIMPLE_r11 736 +#define _FORMAT_WITH_SPEC_r21 737 +#define _FOR_ITER_r23 738 +#define _FOR_ITER_GEN_FRAME_r03 739 +#define _FOR_ITER_GEN_FRAME_r13 740 +#define _FOR_ITER_GEN_FRAME_r23 741 +#define _FOR_ITER_TIER_TWO_r23 742 +#define _GET_AITER_r11 743 +#define _GET_ANEXT_r12 744 +#define _GET_AWAITABLE_r11 745 +#define _GET_ITER_r12 746 +#define _GET_LEN_r12 747 +#define _GET_YIELD_FROM_ITER_r11 748 +#define _GUARD_BINARY_OP_EXTEND_r22 749 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 750 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 751 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 752 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 753 +#define _GUARD_CALLABLE_ISINSTANCE_r03 754 +#define _GUARD_CALLABLE_ISINSTANCE_r13 755 +#define _GUARD_CALLABLE_ISINSTANCE_r23 756 +#define _GUARD_CALLABLE_ISINSTANCE_r33 757 +#define _GUARD_CALLABLE_LEN_r03 758 +#define _GUARD_CALLABLE_LEN_r13 759 +#define _GUARD_CALLABLE_LEN_r23 760 +#define _GUARD_CALLABLE_LEN_r33 761 +#define _GUARD_CALLABLE_LIST_APPEND_r03 762 +#define _GUARD_CALLABLE_LIST_APPEND_r13 763 +#define _GUARD_CALLABLE_LIST_APPEND_r23 764 +#define _GUARD_CALLABLE_LIST_APPEND_r33 765 +#define _GUARD_CALLABLE_STR_1_r03 766 +#define _GUARD_CALLABLE_STR_1_r13 767 +#define _GUARD_CALLABLE_STR_1_r23 768 +#define _GUARD_CALLABLE_STR_1_r33 769 +#define _GUARD_CALLABLE_TUPLE_1_r03 770 +#define _GUARD_CALLABLE_TUPLE_1_r13 771 +#define _GUARD_CALLABLE_TUPLE_1_r23 772 +#define _GUARD_CALLABLE_TUPLE_1_r33 773 +#define _GUARD_CALLABLE_TYPE_1_r03 774 +#define _GUARD_CALLABLE_TYPE_1_r13 775 +#define _GUARD_CALLABLE_TYPE_1_r23 776 +#define _GUARD_CALLABLE_TYPE_1_r33 777 +#define _GUARD_DORV_NO_DICT_r01 778 +#define _GUARD_DORV_NO_DICT_r11 779 +#define _GUARD_DORV_NO_DICT_r22 780 +#define _GUARD_DORV_NO_DICT_r33 781 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 782 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 783 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 784 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 785 +#define _GUARD_GLOBALS_VERSION_r00 786 +#define _GUARD_GLOBALS_VERSION_r11 787 +#define _GUARD_GLOBALS_VERSION_r22 788 +#define _GUARD_GLOBALS_VERSION_r33 789 +#define _GUARD_IP_RETURN_GENERATOR_r00 790 +#define _GUARD_IP_RETURN_GENERATOR_r11 791 +#define _GUARD_IP_RETURN_GENERATOR_r22 792 +#define _GUARD_IP_RETURN_GENERATOR_r33 793 +#define _GUARD_IP_RETURN_VALUE_r00 794 +#define _GUARD_IP_RETURN_VALUE_r11 795 +#define _GUARD_IP_RETURN_VALUE_r22 796 +#define _GUARD_IP_RETURN_VALUE_r33 797 +#define _GUARD_IP_YIELD_VALUE_r00 798 +#define _GUARD_IP_YIELD_VALUE_r11 799 +#define _GUARD_IP_YIELD_VALUE_r22 800 +#define _GUARD_IP_YIELD_VALUE_r33 801 +#define _GUARD_IP__PUSH_FRAME_r00 802 +#define _GUARD_IP__PUSH_FRAME_r11 803 +#define _GUARD_IP__PUSH_FRAME_r22 804 +#define _GUARD_IP__PUSH_FRAME_r33 805 +#define _GUARD_IS_FALSE_POP_r00 806 +#define _GUARD_IS_FALSE_POP_r10 807 +#define _GUARD_IS_FALSE_POP_r21 808 +#define _GUARD_IS_FALSE_POP_r32 809 +#define _GUARD_IS_NONE_POP_r00 810 +#define _GUARD_IS_NONE_POP_r10 811 +#define _GUARD_IS_NONE_POP_r21 812 +#define _GUARD_IS_NONE_POP_r32 813 +#define _GUARD_IS_NOT_NONE_POP_r10 814 +#define _GUARD_IS_TRUE_POP_r00 815 +#define _GUARD_IS_TRUE_POP_r10 816 +#define _GUARD_IS_TRUE_POP_r21 817 +#define _GUARD_IS_TRUE_POP_r32 818 +#define _GUARD_KEYS_VERSION_r01 819 +#define _GUARD_KEYS_VERSION_r11 820 +#define _GUARD_KEYS_VERSION_r22 821 +#define _GUARD_KEYS_VERSION_r33 822 +#define _GUARD_NOS_DICT_r02 823 +#define _GUARD_NOS_DICT_r12 824 +#define _GUARD_NOS_DICT_r22 825 +#define _GUARD_NOS_DICT_r33 826 +#define _GUARD_NOS_FLOAT_r02 827 +#define _GUARD_NOS_FLOAT_r12 828 +#define _GUARD_NOS_FLOAT_r22 829 +#define _GUARD_NOS_FLOAT_r33 830 +#define _GUARD_NOS_INT_r02 831 +#define _GUARD_NOS_INT_r12 832 +#define _GUARD_NOS_INT_r22 833 +#define _GUARD_NOS_INT_r33 834 +#define _GUARD_NOS_LIST_r02 835 +#define _GUARD_NOS_LIST_r12 836 +#define _GUARD_NOS_LIST_r22 837 +#define _GUARD_NOS_LIST_r33 838 +#define _GUARD_NOS_NOT_NULL_r02 839 +#define _GUARD_NOS_NOT_NULL_r12 840 +#define _GUARD_NOS_NOT_NULL_r22 841 +#define _GUARD_NOS_NOT_NULL_r33 842 +#define _GUARD_NOS_NULL_r02 843 +#define _GUARD_NOS_NULL_r12 844 +#define _GUARD_NOS_NULL_r22 845 +#define _GUARD_NOS_NULL_r33 846 +#define _GUARD_NOS_OVERFLOWED_r02 847 +#define _GUARD_NOS_OVERFLOWED_r12 848 +#define _GUARD_NOS_OVERFLOWED_r22 849 +#define _GUARD_NOS_OVERFLOWED_r33 850 +#define _GUARD_NOS_TUPLE_r02 851 +#define _GUARD_NOS_TUPLE_r12 852 +#define _GUARD_NOS_TUPLE_r22 853 +#define _GUARD_NOS_TUPLE_r33 854 +#define _GUARD_NOS_UNICODE_r02 855 +#define _GUARD_NOS_UNICODE_r12 856 +#define _GUARD_NOS_UNICODE_r22 857 +#define _GUARD_NOS_UNICODE_r33 858 +#define _GUARD_NOT_EXHAUSTED_LIST_r02 859 +#define _GUARD_NOT_EXHAUSTED_LIST_r12 860 +#define _GUARD_NOT_EXHAUSTED_LIST_r22 861 +#define _GUARD_NOT_EXHAUSTED_LIST_r33 862 +#define _GUARD_NOT_EXHAUSTED_RANGE_r02 863 +#define _GUARD_NOT_EXHAUSTED_RANGE_r12 864 +#define _GUARD_NOT_EXHAUSTED_RANGE_r22 865 +#define _GUARD_NOT_EXHAUSTED_RANGE_r33 866 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 867 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 868 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 869 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 870 +#define _GUARD_THIRD_NULL_r03 871 +#define _GUARD_THIRD_NULL_r13 872 +#define _GUARD_THIRD_NULL_r23 873 +#define _GUARD_THIRD_NULL_r33 874 +#define _GUARD_TOS_ANY_SET_r01 875 +#define _GUARD_TOS_ANY_SET_r11 876 +#define _GUARD_TOS_ANY_SET_r22 877 +#define _GUARD_TOS_ANY_SET_r33 878 +#define _GUARD_TOS_DICT_r01 879 +#define _GUARD_TOS_DICT_r11 880 +#define _GUARD_TOS_DICT_r22 881 +#define _GUARD_TOS_DICT_r33 882 +#define _GUARD_TOS_FLOAT_r01 883 +#define _GUARD_TOS_FLOAT_r11 884 +#define _GUARD_TOS_FLOAT_r22 885 +#define _GUARD_TOS_FLOAT_r33 886 +#define _GUARD_TOS_INT_r01 887 +#define _GUARD_TOS_INT_r11 888 +#define _GUARD_TOS_INT_r22 889 +#define _GUARD_TOS_INT_r33 890 +#define _GUARD_TOS_LIST_r01 891 +#define _GUARD_TOS_LIST_r11 892 +#define _GUARD_TOS_LIST_r22 893 +#define _GUARD_TOS_LIST_r33 894 +#define _GUARD_TOS_OVERFLOWED_r01 895 +#define _GUARD_TOS_OVERFLOWED_r11 896 +#define _GUARD_TOS_OVERFLOWED_r22 897 +#define _GUARD_TOS_OVERFLOWED_r33 898 +#define _GUARD_TOS_SLICE_r01 899 +#define _GUARD_TOS_SLICE_r11 900 +#define _GUARD_TOS_SLICE_r22 901 +#define _GUARD_TOS_SLICE_r33 902 +#define _GUARD_TOS_TUPLE_r01 903 +#define _GUARD_TOS_TUPLE_r11 904 +#define _GUARD_TOS_TUPLE_r22 905 +#define _GUARD_TOS_TUPLE_r33 906 +#define _GUARD_TOS_UNICODE_r01 907 +#define _GUARD_TOS_UNICODE_r11 908 +#define _GUARD_TOS_UNICODE_r22 909 +#define _GUARD_TOS_UNICODE_r33 910 +#define _GUARD_TYPE_VERSION_r01 911 +#define _GUARD_TYPE_VERSION_r11 912 +#define _GUARD_TYPE_VERSION_r22 913 +#define _GUARD_TYPE_VERSION_r33 914 +#define _GUARD_TYPE_VERSION_AND_LOCK_r01 915 +#define _GUARD_TYPE_VERSION_AND_LOCK_r11 916 +#define _GUARD_TYPE_VERSION_AND_LOCK_r22 917 +#define _GUARD_TYPE_VERSION_AND_LOCK_r33 918 +#define _HANDLE_PENDING_AND_DEOPT_r00 919 +#define _HANDLE_PENDING_AND_DEOPT_r10 920 +#define _HANDLE_PENDING_AND_DEOPT_r20 921 +#define _HANDLE_PENDING_AND_DEOPT_r30 922 +#define _IMPORT_FROM_r12 923 +#define _IMPORT_NAME_r21 924 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 925 +#define _INIT_CALL_PY_EXACT_ARGS_r01 926 +#define _INIT_CALL_PY_EXACT_ARGS_0_r01 927 +#define _INIT_CALL_PY_EXACT_ARGS_1_r01 928 +#define _INIT_CALL_PY_EXACT_ARGS_2_r01 929 +#define _INIT_CALL_PY_EXACT_ARGS_3_r01 930 +#define _INIT_CALL_PY_EXACT_ARGS_4_r01 931 +#define _INSERT_NULL_r10 932 +#define _INSTRUMENTED_FOR_ITER_r23 933 +#define _INSTRUMENTED_INSTRUCTION_r00 934 +#define _INSTRUMENTED_JUMP_FORWARD_r00 935 +#define _INSTRUMENTED_JUMP_FORWARD_r11 936 +#define _INSTRUMENTED_JUMP_FORWARD_r22 937 +#define _INSTRUMENTED_JUMP_FORWARD_r33 938 +#define _INSTRUMENTED_LINE_r00 939 +#define _INSTRUMENTED_NOT_TAKEN_r00 940 +#define _INSTRUMENTED_NOT_TAKEN_r11 941 +#define _INSTRUMENTED_NOT_TAKEN_r22 942 +#define _INSTRUMENTED_NOT_TAKEN_r33 943 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 944 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 945 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 946 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 947 +#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 948 +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 949 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 950 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 951 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 952 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 953 +#define _IS_NONE_r11 954 +#define _IS_OP_r03 955 +#define _IS_OP_r13 956 +#define _IS_OP_r23 957 +#define _ITER_CHECK_LIST_r02 958 +#define _ITER_CHECK_LIST_r12 959 +#define _ITER_CHECK_LIST_r22 960 +#define _ITER_CHECK_LIST_r33 961 +#define _ITER_CHECK_RANGE_r02 962 +#define _ITER_CHECK_RANGE_r12 963 +#define _ITER_CHECK_RANGE_r22 964 +#define _ITER_CHECK_RANGE_r33 965 +#define _ITER_CHECK_TUPLE_r02 966 +#define _ITER_CHECK_TUPLE_r12 967 +#define _ITER_CHECK_TUPLE_r22 968 +#define _ITER_CHECK_TUPLE_r33 969 +#define _ITER_JUMP_LIST_r02 970 +#define _ITER_JUMP_LIST_r12 971 +#define _ITER_JUMP_LIST_r22 972 +#define _ITER_JUMP_LIST_r33 973 +#define _ITER_JUMP_RANGE_r02 974 +#define _ITER_JUMP_RANGE_r12 975 +#define _ITER_JUMP_RANGE_r22 976 +#define _ITER_JUMP_RANGE_r33 977 +#define _ITER_JUMP_TUPLE_r02 978 +#define _ITER_JUMP_TUPLE_r12 979 +#define _ITER_JUMP_TUPLE_r22 980 +#define _ITER_JUMP_TUPLE_r33 981 +#define _ITER_NEXT_LIST_r23 982 +#define _ITER_NEXT_LIST_TIER_TWO_r23 983 +#define _ITER_NEXT_RANGE_r03 984 +#define _ITER_NEXT_RANGE_r13 985 +#define _ITER_NEXT_RANGE_r23 986 +#define _ITER_NEXT_TUPLE_r03 987 +#define _ITER_NEXT_TUPLE_r13 988 +#define _ITER_NEXT_TUPLE_r23 989 +#define _JUMP_BACKWARD_NO_INTERRUPT_r00 990 +#define _JUMP_BACKWARD_NO_INTERRUPT_r11 991 +#define _JUMP_BACKWARD_NO_INTERRUPT_r22 992 +#define _JUMP_BACKWARD_NO_INTERRUPT_r33 993 +#define _JUMP_TO_TOP_r00 994 +#define _LIST_APPEND_r10 995 +#define _LIST_EXTEND_r10 996 +#define _LOAD_ATTR_r10 997 +#define _LOAD_ATTR_CLASS_r11 998 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 999 +#define _LOAD_ATTR_INSTANCE_VALUE_r02 1000 +#define _LOAD_ATTR_INSTANCE_VALUE_r12 1001 +#define _LOAD_ATTR_INSTANCE_VALUE_r23 1002 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1003 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1004 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1005 +#define _LOAD_ATTR_METHOD_NO_DICT_r02 1006 +#define _LOAD_ATTR_METHOD_NO_DICT_r12 1007 +#define _LOAD_ATTR_METHOD_NO_DICT_r23 1008 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1009 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1010 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1011 +#define _LOAD_ATTR_MODULE_r11 1012 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1013 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1014 +#define _LOAD_ATTR_PROPERTY_FRAME_r11 1015 +#define _LOAD_ATTR_SLOT_r11 1016 +#define _LOAD_ATTR_WITH_HINT_r12 1017 +#define _LOAD_BUILD_CLASS_r01 1018 +#define _LOAD_BYTECODE_r00 1019 +#define _LOAD_COMMON_CONSTANT_r01 1020 +#define _LOAD_COMMON_CONSTANT_r12 1021 +#define _LOAD_COMMON_CONSTANT_r23 1022 +#define _LOAD_CONST_r01 1023 +#define _LOAD_CONST_r12 1024 +#define _LOAD_CONST_r23 1025 +#define _LOAD_CONST_INLINE_r01 1026 +#define _LOAD_CONST_INLINE_r12 1027 +#define _LOAD_CONST_INLINE_r23 1028 +#define _LOAD_CONST_INLINE_BORROW_r01 1029 +#define _LOAD_CONST_INLINE_BORROW_r12 1030 +#define _LOAD_CONST_INLINE_BORROW_r23 1031 +#define _LOAD_CONST_UNDER_INLINE_r02 1032 +#define _LOAD_CONST_UNDER_INLINE_r12 1033 +#define _LOAD_CONST_UNDER_INLINE_r23 1034 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1035 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1036 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1037 +#define _LOAD_DEREF_r01 1038 +#define _LOAD_FAST_r01 1039 +#define _LOAD_FAST_r12 1040 +#define _LOAD_FAST_r23 1041 +#define _LOAD_FAST_0_r01 1042 +#define _LOAD_FAST_0_r12 1043 +#define _LOAD_FAST_0_r23 1044 +#define _LOAD_FAST_1_r01 1045 +#define _LOAD_FAST_1_r12 1046 +#define _LOAD_FAST_1_r23 1047 +#define _LOAD_FAST_2_r01 1048 +#define _LOAD_FAST_2_r12 1049 +#define _LOAD_FAST_2_r23 1050 +#define _LOAD_FAST_3_r01 1051 +#define _LOAD_FAST_3_r12 1052 +#define _LOAD_FAST_3_r23 1053 +#define _LOAD_FAST_4_r01 1054 +#define _LOAD_FAST_4_r12 1055 +#define _LOAD_FAST_4_r23 1056 +#define _LOAD_FAST_5_r01 1057 +#define _LOAD_FAST_5_r12 1058 +#define _LOAD_FAST_5_r23 1059 +#define _LOAD_FAST_6_r01 1060 +#define _LOAD_FAST_6_r12 1061 +#define _LOAD_FAST_6_r23 1062 +#define _LOAD_FAST_7_r01 1063 +#define _LOAD_FAST_7_r12 1064 +#define _LOAD_FAST_7_r23 1065 +#define _LOAD_FAST_AND_CLEAR_r01 1066 +#define _LOAD_FAST_AND_CLEAR_r12 1067 +#define _LOAD_FAST_AND_CLEAR_r23 1068 +#define _LOAD_FAST_BORROW_r01 1069 +#define _LOAD_FAST_BORROW_r12 1070 +#define _LOAD_FAST_BORROW_r23 1071 +#define _LOAD_FAST_BORROW_0_r01 1072 +#define _LOAD_FAST_BORROW_0_r12 1073 +#define _LOAD_FAST_BORROW_0_r23 1074 +#define _LOAD_FAST_BORROW_1_r01 1075 +#define _LOAD_FAST_BORROW_1_r12 1076 +#define _LOAD_FAST_BORROW_1_r23 1077 +#define _LOAD_FAST_BORROW_2_r01 1078 +#define _LOAD_FAST_BORROW_2_r12 1079 +#define _LOAD_FAST_BORROW_2_r23 1080 +#define _LOAD_FAST_BORROW_3_r01 1081 +#define _LOAD_FAST_BORROW_3_r12 1082 +#define _LOAD_FAST_BORROW_3_r23 1083 +#define _LOAD_FAST_BORROW_4_r01 1084 +#define _LOAD_FAST_BORROW_4_r12 1085 +#define _LOAD_FAST_BORROW_4_r23 1086 +#define _LOAD_FAST_BORROW_5_r01 1087 +#define _LOAD_FAST_BORROW_5_r12 1088 +#define _LOAD_FAST_BORROW_5_r23 1089 +#define _LOAD_FAST_BORROW_6_r01 1090 +#define _LOAD_FAST_BORROW_6_r12 1091 +#define _LOAD_FAST_BORROW_6_r23 1092 +#define _LOAD_FAST_BORROW_7_r01 1093 +#define _LOAD_FAST_BORROW_7_r12 1094 +#define _LOAD_FAST_BORROW_7_r23 1095 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1096 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1097 +#define _LOAD_FAST_CHECK_r01 1098 +#define _LOAD_FAST_CHECK_r12 1099 +#define _LOAD_FAST_CHECK_r23 1100 +#define _LOAD_FAST_LOAD_FAST_r02 1101 +#define _LOAD_FAST_LOAD_FAST_r13 1102 +#define _LOAD_FROM_DICT_OR_DEREF_r11 1103 +#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1104 +#define _LOAD_GLOBAL_r00 1105 +#define _LOAD_GLOBAL_BUILTINS_r01 1106 +#define _LOAD_GLOBAL_MODULE_r01 1107 +#define _LOAD_LOCALS_r01 1108 +#define _LOAD_LOCALS_r12 1109 +#define _LOAD_LOCALS_r23 1110 +#define _LOAD_NAME_r01 1111 +#define _LOAD_SMALL_INT_r01 1112 +#define _LOAD_SMALL_INT_r12 1113 +#define _LOAD_SMALL_INT_r23 1114 +#define _LOAD_SMALL_INT_0_r01 1115 +#define _LOAD_SMALL_INT_0_r12 1116 +#define _LOAD_SMALL_INT_0_r23 1117 +#define _LOAD_SMALL_INT_1_r01 1118 +#define _LOAD_SMALL_INT_1_r12 1119 +#define _LOAD_SMALL_INT_1_r23 1120 +#define _LOAD_SMALL_INT_2_r01 1121 +#define _LOAD_SMALL_INT_2_r12 1122 +#define _LOAD_SMALL_INT_2_r23 1123 +#define _LOAD_SMALL_INT_3_r01 1124 +#define _LOAD_SMALL_INT_3_r12 1125 +#define _LOAD_SMALL_INT_3_r23 1126 +#define _LOAD_SPECIAL_r00 1127 +#define _LOAD_SUPER_ATTR_ATTR_r31 1128 +#define _LOAD_SUPER_ATTR_METHOD_r32 1129 +#define _MAKE_CALLARGS_A_TUPLE_r33 1130 +#define _MAKE_CELL_r00 1131 +#define _MAKE_FUNCTION_r11 1132 +#define _MAKE_WARM_r00 1133 +#define _MAKE_WARM_r11 1134 +#define _MAKE_WARM_r22 1135 +#define _MAKE_WARM_r33 1136 +#define _MAP_ADD_r20 1137 +#define _MATCH_CLASS_r31 1138 +#define _MATCH_KEYS_r23 1139 +#define _MATCH_MAPPING_r02 1140 +#define _MATCH_MAPPING_r12 1141 +#define _MATCH_MAPPING_r23 1142 +#define _MATCH_SEQUENCE_r02 1143 +#define _MATCH_SEQUENCE_r12 1144 +#define _MATCH_SEQUENCE_r23 1145 +#define _MAYBE_EXPAND_METHOD_r00 1146 +#define _MAYBE_EXPAND_METHOD_KW_r11 1147 +#define _MONITOR_CALL_r00 1148 +#define _MONITOR_CALL_KW_r11 1149 +#define _MONITOR_JUMP_BACKWARD_r00 1150 +#define _MONITOR_JUMP_BACKWARD_r11 1151 +#define _MONITOR_JUMP_BACKWARD_r22 1152 +#define _MONITOR_JUMP_BACKWARD_r33 1153 +#define _MONITOR_RESUME_r00 1154 +#define _NOP_r00 1155 +#define _NOP_r11 1156 +#define _NOP_r22 1157 +#define _NOP_r33 1158 +#define _POP_CALL_r20 1159 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1160 +#define _POP_CALL_ONE_r30 1161 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1162 +#define _POP_CALL_TWO_r30 1163 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1164 +#define _POP_EXCEPT_r10 1165 +#define _POP_ITER_r20 1166 +#define _POP_JUMP_IF_FALSE_r00 1167 +#define _POP_JUMP_IF_FALSE_r10 1168 +#define _POP_JUMP_IF_FALSE_r21 1169 +#define _POP_JUMP_IF_FALSE_r32 1170 +#define _POP_JUMP_IF_TRUE_r00 1171 +#define _POP_JUMP_IF_TRUE_r10 1172 +#define _POP_JUMP_IF_TRUE_r21 1173 +#define _POP_JUMP_IF_TRUE_r32 1174 +#define _POP_TOP_r10 1175 +#define _POP_TOP_FLOAT_r00 1176 +#define _POP_TOP_FLOAT_r10 1177 +#define _POP_TOP_FLOAT_r21 1178 +#define _POP_TOP_FLOAT_r32 1179 +#define _POP_TOP_INT_r00 1180 +#define _POP_TOP_INT_r10 1181 +#define _POP_TOP_INT_r21 1182 +#define _POP_TOP_INT_r32 1183 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1184 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1185 +#define _POP_TOP_NOP_r00 1186 +#define _POP_TOP_NOP_r10 1187 +#define _POP_TOP_NOP_r21 1188 +#define _POP_TOP_NOP_r32 1189 +#define _POP_TOP_UNICODE_r00 1190 +#define _POP_TOP_UNICODE_r10 1191 +#define _POP_TOP_UNICODE_r21 1192 +#define _POP_TOP_UNICODE_r32 1193 +#define _POP_TWO_r20 1194 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1195 +#define _PUSH_EXC_INFO_r02 1196 +#define _PUSH_EXC_INFO_r12 1197 +#define _PUSH_EXC_INFO_r23 1198 +#define _PUSH_FRAME_r10 1199 +#define _PUSH_NULL_r01 1200 +#define _PUSH_NULL_r12 1201 +#define _PUSH_NULL_r23 1202 +#define _PUSH_NULL_CONDITIONAL_r00 1203 +#define _PY_FRAME_GENERAL_r01 1204 +#define _PY_FRAME_KW_r11 1205 +#define _QUICKEN_RESUME_r00 1206 +#define _QUICKEN_RESUME_r11 1207 +#define _QUICKEN_RESUME_r22 1208 +#define _QUICKEN_RESUME_r33 1209 +#define _REPLACE_WITH_TRUE_r11 1210 +#define _RESUME_CHECK_r00 1211 +#define _RESUME_CHECK_r11 1212 +#define _RESUME_CHECK_r22 1213 +#define _RESUME_CHECK_r33 1214 +#define _RETURN_GENERATOR_r01 1215 +#define _RETURN_VALUE_r11 1216 +#define _SAVE_RETURN_OFFSET_r00 1217 +#define _SAVE_RETURN_OFFSET_r11 1218 +#define _SAVE_RETURN_OFFSET_r22 1219 +#define _SAVE_RETURN_OFFSET_r33 1220 +#define _SEND_r22 1221 +#define _SEND_GEN_FRAME_r22 1222 +#define _SETUP_ANNOTATIONS_r00 1223 +#define _SET_ADD_r10 1224 +#define _SET_FUNCTION_ATTRIBUTE_r01 1225 +#define _SET_FUNCTION_ATTRIBUTE_r11 1226 +#define _SET_FUNCTION_ATTRIBUTE_r21 1227 +#define _SET_FUNCTION_ATTRIBUTE_r32 1228 +#define _SET_IP_r00 1229 +#define _SET_IP_r11 1230 +#define _SET_IP_r22 1231 +#define _SET_IP_r33 1232 +#define _SET_UPDATE_r10 1233 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1234 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1235 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1236 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1237 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1238 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1239 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1240 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1241 +#define _SPILL_OR_RELOAD_r01 1242 +#define _SPILL_OR_RELOAD_r02 1243 +#define _SPILL_OR_RELOAD_r03 1244 +#define _SPILL_OR_RELOAD_r10 1245 +#define _SPILL_OR_RELOAD_r12 1246 +#define _SPILL_OR_RELOAD_r13 1247 +#define _SPILL_OR_RELOAD_r20 1248 +#define _SPILL_OR_RELOAD_r21 1249 +#define _SPILL_OR_RELOAD_r23 1250 +#define _SPILL_OR_RELOAD_r30 1251 +#define _SPILL_OR_RELOAD_r31 1252 +#define _SPILL_OR_RELOAD_r32 1253 +#define _START_EXECUTOR_r00 1254 +#define _STORE_ATTR_r20 1255 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1256 +#define _STORE_ATTR_SLOT_r21 1257 +#define _STORE_ATTR_WITH_HINT_r21 1258 +#define _STORE_DEREF_r10 1259 +#define _STORE_FAST_r10 1260 +#define _STORE_FAST_0_r10 1261 +#define _STORE_FAST_1_r10 1262 +#define _STORE_FAST_2_r10 1263 +#define _STORE_FAST_3_r10 1264 +#define _STORE_FAST_4_r10 1265 +#define _STORE_FAST_5_r10 1266 +#define _STORE_FAST_6_r10 1267 +#define _STORE_FAST_7_r10 1268 +#define _STORE_FAST_LOAD_FAST_r11 1269 +#define _STORE_FAST_STORE_FAST_r20 1270 +#define _STORE_GLOBAL_r10 1271 +#define _STORE_NAME_r10 1272 +#define _STORE_SLICE_r30 1273 +#define _STORE_SUBSCR_r30 1274 +#define _STORE_SUBSCR_DICT_r31 1275 +#define _STORE_SUBSCR_LIST_INT_r32 1276 +#define _SWAP_r11 1277 +#define _SWAP_2_r02 1278 +#define _SWAP_2_r12 1279 +#define _SWAP_2_r22 1280 +#define _SWAP_2_r33 1281 +#define _SWAP_3_r03 1282 +#define _SWAP_3_r13 1283 +#define _SWAP_3_r23 1284 +#define _SWAP_3_r33 1285 +#define _TIER2_RESUME_CHECK_r00 1286 +#define _TIER2_RESUME_CHECK_r11 1287 +#define _TIER2_RESUME_CHECK_r22 1288 +#define _TIER2_RESUME_CHECK_r33 1289 +#define _TO_BOOL_r11 1290 +#define _TO_BOOL_BOOL_r01 1291 +#define _TO_BOOL_BOOL_r11 1292 +#define _TO_BOOL_BOOL_r22 1293 +#define _TO_BOOL_BOOL_r33 1294 +#define _TO_BOOL_INT_r11 1295 +#define _TO_BOOL_LIST_r11 1296 +#define _TO_BOOL_NONE_r01 1297 +#define _TO_BOOL_NONE_r11 1298 +#define _TO_BOOL_NONE_r22 1299 +#define _TO_BOOL_NONE_r33 1300 +#define _TO_BOOL_STR_r11 1301 +#define _TRACE_RECORD_r00 1302 +#define _UNARY_INVERT_r11 1303 +#define _UNARY_NEGATIVE_r11 1304 +#define _UNARY_NOT_r01 1305 +#define _UNARY_NOT_r11 1306 +#define _UNARY_NOT_r22 1307 +#define _UNARY_NOT_r33 1308 +#define _UNPACK_EX_r10 1309 +#define _UNPACK_SEQUENCE_r10 1310 +#define _UNPACK_SEQUENCE_LIST_r10 1311 +#define _UNPACK_SEQUENCE_TUPLE_r10 1312 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1313 +#define _WITH_EXCEPT_START_r33 1314 +#define _YIELD_VALUE_r11 1315 +#define MAX_UOP_REGS_ID 1315 #ifdef __cplusplus } diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h index 0d066c169019a7..fae1814e69da4b 100644 --- a/Include/opcode_ids.h +++ b/Include/opcode_ids.h @@ -198,21 +198,22 @@ extern "C" { #define LOAD_SUPER_ATTR_ATTR 192 #define LOAD_SUPER_ATTR_METHOD 193 #define RESUME_CHECK 194 -#define SEND_GEN 195 -#define STORE_ATTR_INSTANCE_VALUE 196 -#define STORE_ATTR_SLOT 197 -#define STORE_ATTR_WITH_HINT 198 -#define STORE_SUBSCR_DICT 199 -#define STORE_SUBSCR_LIST_INT 200 -#define TO_BOOL_ALWAYS_TRUE 201 -#define TO_BOOL_BOOL 202 -#define TO_BOOL_INT 203 -#define TO_BOOL_LIST 204 -#define TO_BOOL_NONE 205 -#define TO_BOOL_STR 206 -#define UNPACK_SEQUENCE_LIST 207 -#define UNPACK_SEQUENCE_TUPLE 208 -#define UNPACK_SEQUENCE_TWO_TUPLE 209 +#define RESUME_CHECK_JIT 195 +#define SEND_GEN 196 +#define STORE_ATTR_INSTANCE_VALUE 197 +#define STORE_ATTR_SLOT 198 +#define STORE_ATTR_WITH_HINT 199 +#define STORE_SUBSCR_DICT 200 +#define STORE_SUBSCR_LIST_INT 201 +#define TO_BOOL_ALWAYS_TRUE 202 +#define TO_BOOL_BOOL 203 +#define TO_BOOL_INT 204 +#define TO_BOOL_LIST 205 +#define TO_BOOL_NONE 206 +#define TO_BOOL_STR 207 +#define UNPACK_SEQUENCE_LIST 208 +#define UNPACK_SEQUENCE_TUPLE 209 +#define UNPACK_SEQUENCE_TWO_TUPLE 210 #define INSTRUMENTED_END_FOR 233 #define INSTRUMENTED_POP_ITER 234 #define INSTRUMENTED_END_SEND 235 diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py index b3dce93710a23f..5dcbe6d2e8322a 100644 --- a/Lib/_opcode_metadata.py +++ b/Lib/_opcode_metadata.py @@ -5,6 +5,7 @@ _specializations = { "RESUME": [ "RESUME_CHECK", + "RESUME_CHECK_JIT", ], "TO_BOOL": [ "TO_BOOL_ALWAYS_TRUE", @@ -189,21 +190,22 @@ 'LOAD_SUPER_ATTR_ATTR': 192, 'LOAD_SUPER_ATTR_METHOD': 193, 'RESUME_CHECK': 194, - 'SEND_GEN': 195, - 'STORE_ATTR_INSTANCE_VALUE': 196, - 'STORE_ATTR_SLOT': 197, - 'STORE_ATTR_WITH_HINT': 198, - 'STORE_SUBSCR_DICT': 199, - 'STORE_SUBSCR_LIST_INT': 200, - 'TO_BOOL_ALWAYS_TRUE': 201, - 'TO_BOOL_BOOL': 202, - 'TO_BOOL_INT': 203, - 'TO_BOOL_LIST': 204, - 'TO_BOOL_NONE': 205, - 'TO_BOOL_STR': 206, - 'UNPACK_SEQUENCE_LIST': 207, - 'UNPACK_SEQUENCE_TUPLE': 208, - 'UNPACK_SEQUENCE_TWO_TUPLE': 209, + 'RESUME_CHECK_JIT': 195, + 'SEND_GEN': 196, + 'STORE_ATTR_INSTANCE_VALUE': 197, + 'STORE_ATTR_SLOT': 198, + 'STORE_ATTR_WITH_HINT': 199, + 'STORE_SUBSCR_DICT': 200, + 'STORE_SUBSCR_LIST_INT': 201, + 'TO_BOOL_ALWAYS_TRUE': 202, + 'TO_BOOL_BOOL': 203, + 'TO_BOOL_INT': 204, + 'TO_BOOL_LIST': 205, + 'TO_BOOL_NONE': 206, + 'TO_BOOL_STR': 207, + 'UNPACK_SEQUENCE_LIST': 208, + 'UNPACK_SEQUENCE_TUPLE': 209, + 'UNPACK_SEQUENCE_TWO_TUPLE': 210, } opmap = { diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 3780bdb28c8c44..9789bc9ea2f71b 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -15,7 +15,7 @@ _testinternalcapi = import_helper.import_module("_testinternalcapi") -from _testinternalcapi import _PY_NSMALLPOSINTS, TIER2_THRESHOLD +from _testinternalcapi import _PY_NSMALLPOSINTS, TIER2_THRESHOLD, TIER2_RESUME_THRESHOLD #For test of issue 136154 GLOBAL_136154 = 42 @@ -291,6 +291,18 @@ def testfunc(n): uops = get_opnames(ex) self.assertIn("_JUMP_TO_TOP", uops) + def test_resume(self): + def testfunc(x): + if x <= 1: + return 1 + return testfunc(x-1) + + sys.setrecursionlimit(TIER2_RESUME_THRESHOLD * 2) + testfunc(TIER2_RESUME_THRESHOLD) + + ex = get_first_executor(testfunc) + self.assertIsNotNone(ex) + def test_jump_forward(self): def testfunc(n): a = 0 diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index fa611f480d60fd..49f3f377a66e49 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -2458,8 +2458,8 @@ def test_lambda_return_position(self): for i, pos in enumerate(positions): with self.subTest(i=i, pos=pos): start_line, end_line, start_col, end_col = pos - if i == 0 and start_col == end_col == 0: - # ignore the RESUME in the beginning + if i == 0 or i == 1: + # ignore the RESUME and CACHE in the beginning continue self.assertEqual(start_line, 1) self.assertEqual(end_line, 1) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 3e7477487200d0..bfa2fa43dce7ea 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -127,13 +127,13 @@ def _f(a): dis_f_with_offsets = """\ %3d 0 RESUME 0 -%3d 2 LOAD_GLOBAL 1 (print + NULL) - 12 LOAD_FAST_BORROW 0 (a) - 14 CALL 1 - 22 POP_TOP +%3d 4 LOAD_GLOBAL 1 (print + NULL) + 14 LOAD_FAST_BORROW 0 (a) + 16 CALL 1 + 24 POP_TOP -%3d 24 LOAD_SMALL_INT 1 - 26 RETURN_VALUE +%3d 26 LOAD_SMALL_INT 1 + 28 RETURN_VALUE """ % (_f.__code__.co_firstlineno, _f.__code__.co_firstlineno + 1, _f.__code__.co_firstlineno + 2) @@ -617,10 +617,10 @@ async def _asyncwith(c): CALL 0 GET_AWAITABLE 1 LOAD_CONST 0 (None) - L2: SEND 3 (to L5) + L2: SEND 4 (to L5) L3: YIELD_VALUE 1 L4: RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to L2) + JUMP_BACKWARD_NO_INTERRUPT 6 (to L2) L5: END_SEND L6: POP_TOP @@ -633,10 +633,10 @@ async def _asyncwith(c): CALL 3 GET_AWAITABLE 2 LOAD_CONST 0 (None) - L8: SEND 3 (to L11) + L8: SEND 4 (to L11) L9: YIELD_VALUE 1 L10: RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to L8) + JUMP_BACKWARD_NO_INTERRUPT 6 (to L8) L11: END_SEND POP_TOP @@ -646,17 +646,17 @@ async def _asyncwith(c): RETURN_VALUE %4d L12: CLEANUP_THROW - L13: JUMP_BACKWARD_NO_INTERRUPT 26 (to L5) + L13: JUMP_BACKWARD_NO_INTERRUPT 27 (to L5) L14: CLEANUP_THROW L15: JUMP_BACKWARD_NO_INTERRUPT 10 (to L11) L16: PUSH_EXC_INFO WITH_EXCEPT_START GET_AWAITABLE 2 LOAD_CONST 0 (None) - L17: SEND 4 (to L21) + L17: SEND 5 (to L21) L18: YIELD_VALUE 1 L19: RESUME 3 - JUMP_BACKWARD_NO_INTERRUPT 5 (to L17) + JUMP_BACKWARD_NO_INTERRUPT 6 (to L17) L20: CLEANUP_THROW L21: END_SEND TO_BOOL @@ -856,7 +856,7 @@ def foo(x): L1: RESUME 0 LOAD_FAST 0 (.0) GET_ITER - L2: FOR_ITER 14 (to L3) + L2: FOR_ITER 15 (to L3) STORE_FAST 1 (z) LOAD_DEREF 2 (x) LOAD_FAST_BORROW 1 (z) @@ -864,7 +864,7 @@ def foo(x): YIELD_VALUE 0 RESUME 5 POP_TOP - JUMP_BACKWARD 16 (to L2) + JUMP_BACKWARD 17 (to L2) L3: END_FOR POP_ITER LOAD_CONST 0 (None) @@ -885,7 +885,7 @@ def load_test(x, y=0): return a, b dis_load_test_quickened_code = """\ -%3d RESUME_CHECK 0 +%3d RESUME_CHECK{: <6} 0 %3d LOAD_FAST_LOAD_FAST 1 (x, y) STORE_FAST_STORE_FAST 50 (b, a) @@ -902,7 +902,7 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d RESUME_CHECK 0 +%3d RESUME_CHECK{: <6} 0 %3d BUILD_LIST 0 LOAD_CONST 2 ((1, 2, 3)) @@ -917,7 +917,7 @@ def loop_test(): LOAD_FAST_BORROW 0 (i) CALL_PY_GENERAL 1 POP_TOP - JUMP_BACKWARD_{: <6} 16 (to L1) + JUMP_BACKWARD{: <6} 16 (to L1) %3d L2: END_FOR POP_ITER @@ -1299,13 +1299,15 @@ def code_quicken(f): def test_super_instructions(self): self.code_quicken(lambda: load_test(0, 0)) got = self.get_disassembly(load_test, adaptive=True) - self.do_disassembly_compare(got, dis_load_test_quickened_code) + jit = sys._jit.is_enabled() + expected = dis_load_test_quickened_code.format("_JIT" if jit else "") + self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_load_attr_specialize(self): load_attr_quicken = """\ - 0 RESUME_CHECK 0 + 0 RESUME_CHECK{: <6} 0 1 LOAD_CONST 0 ('a') LOAD_ATTR_SLOT 0 (__class__) @@ -1314,13 +1316,15 @@ def test_load_attr_specialize(self): co = compile("'a'.__class__", "", "eval") self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) - self.do_disassembly_compare(got, load_attr_quicken) + jit = sys._jit.is_enabled() + expected = load_attr_quicken.format("_JIT" if jit else "") + self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_call_specialize(self): call_quicken = """\ - 0 RESUME_CHECK 0 + 0 RESUME_CHECK{: <6} 0 1 LOAD_NAME 0 (str) PUSH_NULL @@ -1331,7 +1335,9 @@ def test_call_specialize(self): co = compile("str(1)", "", "eval") self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) - self.do_disassembly_compare(got, call_quicken) + jit = sys._jit.is_enabled() + expected = call_quicken.format("_JIT" if jit else "") + self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization @@ -1340,7 +1346,8 @@ def test_loop_quicken(self): self.code_quicken(loop_test) got = self.get_disassembly(loop_test, adaptive=True) jit = sys._jit.is_enabled() - expected = dis_loop_test_quickened_code.format("JIT" if jit else "NO_JIT") + jit_str = "_JIT" if jit else "NO_JIT" + expected = dis_loop_test_quickened_code.format(jit_str, jit_str) self.do_disassembly_compare(got, expected) @cpython_only @@ -1407,7 +1414,7 @@ def test_show_caches(self): caches = list(self.get_cached_values(quickened, adaptive)) for cache in caches: self.assertRegex(cache, pattern) - total_caches = 21 + total_caches = 22 empty_caches = 7 self.assertEqual(caches.count(""), empty_caches) self.assertEqual(len(caches), total_caches) @@ -1752,210 +1759,210 @@ def _prepare_test_cases(): expected_opinfo_outer = [ make_inst(opname='MAKE_CELL', arg=0, argval='a', argrepr='a', offset=0, start_offset=0, starts_line=True, line_number=None), make_inst(opname='MAKE_CELL', arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None), - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1), - make_inst(opname='LOAD_CONST', arg=4, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2), - make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2), - make_inst(opname='BUILD_TUPLE', arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2), - make_inst(opname='LOAD_CONST', arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2), - make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=18, start_offset=18, starts_line=False, line_number=2), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=20, start_offset=20, starts_line=False, line_number=2), - make_inst(opname='STORE_FAST', arg=2, argval='f', argrepr='f', offset=22, start_offset=22, starts_line=False, line_number=2), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=24, start_offset=24, starts_line=True, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_DEREF', arg=0, argval='a', argrepr='a', offset=34, start_offset=34, starts_line=False, line_number=7), - make_inst(opname='LOAD_DEREF', arg=1, argval='b', argrepr='b', offset=36, start_offset=36, starts_line=False, line_number=7), - make_inst(opname='LOAD_CONST', arg=2, argval='', argrepr="''", offset=38, start_offset=38, starts_line=False, line_number=7), - make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=40, start_offset=40, starts_line=False, line_number=7), - make_inst(opname='BUILD_LIST', arg=0, argval=0, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7), - make_inst(opname='BUILD_MAP', arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7), - make_inst(opname='LOAD_CONST', arg=3, argval='Hello world!', argrepr="'Hello world!'", offset=46, start_offset=46, starts_line=False, line_number=7), - make_inst(opname='CALL', arg=7, argval=7, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=7), - make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='f', argrepr='f', offset=58, start_offset=58, starts_line=True, line_number=8), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=8), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=4, argval=(3, 4), argrepr='(3, 4)', offset=8, start_offset=8, starts_line=True, line_number=2), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=2), + make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=2), + make_inst(opname='BUILD_TUPLE', arg=2, argval=2, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=2), + make_inst(opname='LOAD_CONST', arg=1, argval=code_object_f, argrepr=repr(code_object_f), offset=16, start_offset=16, starts_line=False, line_number=2), + make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=2), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=20, start_offset=20, starts_line=False, line_number=2), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=22, start_offset=22, starts_line=False, line_number=2), + make_inst(opname='STORE_FAST', arg=2, argval='f', argrepr='f', offset=24, start_offset=24, starts_line=False, line_number=2), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=26, start_offset=26, starts_line=True, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_DEREF', arg=0, argval='a', argrepr='a', offset=36, start_offset=36, starts_line=False, line_number=7), + make_inst(opname='LOAD_DEREF', arg=1, argval='b', argrepr='b', offset=38, start_offset=38, starts_line=False, line_number=7), + make_inst(opname='LOAD_CONST', arg=2, argval='', argrepr="''", offset=40, start_offset=40, starts_line=False, line_number=7), + make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=7), + make_inst(opname='BUILD_LIST', arg=0, argval=0, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=7), + make_inst(opname='BUILD_MAP', arg=0, argval=0, argrepr='', offset=46, start_offset=46, starts_line=False, line_number=7), + make_inst(opname='LOAD_CONST', arg=3, argval='Hello world!', argrepr="'Hello world!'", offset=48, start_offset=48, starts_line=False, line_number=7), + make_inst(opname='CALL', arg=7, argval=7, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=58, start_offset=58, starts_line=False, line_number=7), + make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='f', argrepr='f', offset=60, start_offset=60, starts_line=True, line_number=8), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=62, start_offset=62, starts_line=False, line_number=8), ] expected_opinfo_f = [ make_inst(opname='COPY_FREE_VARS', arg=2, argval=2, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None), make_inst(opname='MAKE_CELL', arg=0, argval='c', argrepr='c', offset=2, start_offset=2, starts_line=False, line_number=None), make_inst(opname='MAKE_CELL', arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None), - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2), - make_inst(opname='LOAD_CONST', arg=2, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3), - make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3), - make_inst(opname='BUILD_TUPLE', arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3), - make_inst(opname='LOAD_CONST', arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3), - make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=24, start_offset=24, starts_line=False, line_number=3), - make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=26, start_offset=26, starts_line=False, line_number=3), - make_inst(opname='STORE_FAST', arg=2, argval='inner', argrepr='inner', offset=28, start_offset=28, starts_line=False, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_DEREF', arg=3, argval='a', argrepr='a', offset=40, start_offset=40, starts_line=False, line_number=5), - make_inst(opname='LOAD_DEREF', arg=4, argval='b', argrepr='b', offset=42, start_offset=42, starts_line=False, line_number=5), - make_inst(opname='LOAD_DEREF', arg=0, argval='c', argrepr='c', offset=44, start_offset=44, starts_line=False, line_number=5), - make_inst(opname='LOAD_DEREF', arg=1, argval='d', argrepr='d', offset=46, start_offset=46, starts_line=False, line_number=5), - make_inst(opname='CALL', arg=4, argval=4, argrepr='', offset=48, start_offset=48, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5), - make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='inner', argrepr='inner', offset=58, start_offset=58, starts_line=True, line_number=6), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=60, start_offset=60, starts_line=False, line_number=6), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=2, argval=(5, 6), argrepr='(5, 6)', offset=10, start_offset=10, starts_line=True, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=3, argval='a', argrepr='a', offset=12, start_offset=12, starts_line=False, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=4, argval='b', argrepr='b', offset=14, start_offset=14, starts_line=False, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='c', argrepr='c', offset=16, start_offset=16, starts_line=False, line_number=3), + make_inst(opname='LOAD_FAST_BORROW', arg=1, argval='d', argrepr='d', offset=18, start_offset=18, starts_line=False, line_number=3), + make_inst(opname='BUILD_TUPLE', arg=4, argval=4, argrepr='', offset=20, start_offset=20, starts_line=False, line_number=3), + make_inst(opname='LOAD_CONST', arg=1, argval=code_object_inner, argrepr=repr(code_object_inner), offset=22, start_offset=22, starts_line=False, line_number=3), + make_inst(opname='MAKE_FUNCTION', arg=None, argval=None, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=3), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=8, argval=8, argrepr='closure', offset=26, start_offset=26, starts_line=False, line_number=3), + make_inst(opname='SET_FUNCTION_ATTRIBUTE', arg=1, argval=1, argrepr='defaults', offset=28, start_offset=28, starts_line=False, line_number=3), + make_inst(opname='STORE_FAST', arg=2, argval='inner', argrepr='inner', offset=30, start_offset=30, starts_line=False, line_number=3), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=32, start_offset=32, starts_line=True, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_DEREF', arg=3, argval='a', argrepr='a', offset=42, start_offset=42, starts_line=False, line_number=5), + make_inst(opname='LOAD_DEREF', arg=4, argval='b', argrepr='b', offset=44, start_offset=44, starts_line=False, line_number=5), + make_inst(opname='LOAD_DEREF', arg=0, argval='c', argrepr='c', offset=46, start_offset=46, starts_line=False, line_number=5), + make_inst(opname='LOAD_DEREF', arg=1, argval='d', argrepr='d', offset=48, start_offset=48, starts_line=False, line_number=5), + make_inst(opname='CALL', arg=4, argval=4, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=58, start_offset=58, starts_line=False, line_number=5), + make_inst(opname='LOAD_FAST_BORROW', arg=2, argval='inner', argrepr='inner', offset=60, start_offset=60, starts_line=True, line_number=6), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=62, start_offset=62, starts_line=False, line_number=6), ] expected_opinfo_inner = [ make_inst(opname='COPY_FREE_VARS', arg=4, argval=4, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=None), - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=4, start_offset=4, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_DEREF', arg=2, argval='a', argrepr='a', offset=14, start_offset=14, starts_line=False, line_number=4), - make_inst(opname='LOAD_DEREF', arg=3, argval='b', argrepr='b', offset=16, start_offset=16, starts_line=False, line_number=4), - make_inst(opname='LOAD_DEREF', arg=4, argval='c', argrepr='c', offset=18, start_offset=18, starts_line=False, line_number=4), - make_inst(opname='LOAD_DEREF', arg=5, argval='d', argrepr='d', offset=20, start_offset=20, starts_line=False, line_number=4), - make_inst(opname='LOAD_FAST_BORROW_LOAD_FAST_BORROW', arg=1, argval=('e', 'f'), argrepr='e, f', offset=22, start_offset=22, starts_line=False, line_number=4), - make_inst(opname='CALL', arg=6, argval=6, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=32, start_offset=32, starts_line=False, line_number=4), - make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=34, start_offset=34, starts_line=False, line_number=4), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=36, start_offset=36, starts_line=False, line_number=4), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=2, start_offset=2, starts_line=True, line_number=3, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='print', argrepr='print + NULL', offset=6, start_offset=6, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_DEREF', arg=2, argval='a', argrepr='a', offset=16, start_offset=16, starts_line=False, line_number=4), + make_inst(opname='LOAD_DEREF', arg=3, argval='b', argrepr='b', offset=18, start_offset=18, starts_line=False, line_number=4), + make_inst(opname='LOAD_DEREF', arg=4, argval='c', argrepr='c', offset=20, start_offset=20, starts_line=False, line_number=4), + make_inst(opname='LOAD_DEREF', arg=5, argval='d', argrepr='d', offset=22, start_offset=22, starts_line=False, line_number=4), + make_inst(opname='LOAD_FAST_BORROW_LOAD_FAST_BORROW', arg=1, argval=('e', 'f'), argrepr='e, f', offset=24, start_offset=24, starts_line=False, line_number=4), + make_inst(opname='CALL', arg=6, argval=6, argrepr='', offset=26, start_offset=26, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=34, start_offset=34, starts_line=False, line_number=4), + make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=36, start_offset=36, starts_line=False, line_number=4), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=38, start_offset=38, starts_line=False, line_number=4), ] expected_opinfo_jumpy = [ - make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1), - make_inst(opname='LOAD_GLOBAL', arg=1, argval='range', argrepr='range + NULL', offset=2, start_offset=2, starts_line=True, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_SMALL_INT', arg=10, argval=10, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=3), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='GET_ITER', arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3), - make_inst(opname='FOR_ITER', arg=33, argval=94, argrepr='to L4', offset=24, start_offset=24, starts_line=False, line_number=3, label=1, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=28, start_offset=28, starts_line=False, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=30, start_offset=30, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=40, start_offset=40, starts_line=False, line_number=4), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=42, start_offset=42, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=50, start_offset=50, starts_line=False, line_number=4), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=52, start_offset=52, starts_line=True, line_number=5), - make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=54, start_offset=54, starts_line=False, line_number=5), - make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=56, start_offset=56, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=70, argrepr='to L2', offset=60, start_offset=60, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=64, start_offset=64, starts_line=False, line_number=5), - make_inst(opname='JUMP_BACKWARD', arg=23, argval=24, argrepr='to L1', offset=66, start_offset=66, starts_line=True, line_number=6, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=70, start_offset=70, starts_line=True, line_number=7, label=2), - make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=72, start_offset=72, starts_line=False, line_number=7), - make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=74, start_offset=74, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=88, argrepr='to L3', offset=78, start_offset=78, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=82, start_offset=82, starts_line=False, line_number=7), - make_inst(opname='JUMP_BACKWARD', arg=32, argval=24, argrepr='to L1', offset=84, start_offset=84, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=88, start_offset=88, starts_line=True, line_number=8, label=3), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=90, start_offset=90, starts_line=False, line_number=8), - make_inst(opname='JUMP_FORWARD', arg=13, argval=120, argrepr='to L5', offset=92, start_offset=92, starts_line=False, line_number=8), - make_inst(opname='END_FOR', arg=None, argval=None, argrepr='', offset=94, start_offset=94, starts_line=True, line_number=3, label=4), - make_inst(opname='POP_ITER', arg=None, argval=None, argrepr='', offset=96, start_offset=96, starts_line=False, line_number=3), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=98, start_offset=98, starts_line=True, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=1, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=108, start_offset=108, starts_line=False, line_number=10), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=110, start_offset=110, starts_line=False, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=118, start_offset=118, starts_line=False, line_number=10), - make_inst(opname='LOAD_FAST_CHECK', arg=0, argval='i', argrepr='i', offset=120, start_offset=120, starts_line=True, line_number=11, label=5), - make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=122, start_offset=122, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_JUMP_IF_FALSE', arg=40, argval=214, argrepr='to L8', offset=130, start_offset=130, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=134, start_offset=134, starts_line=False, line_number=11), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=136, start_offset=136, starts_line=True, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=146, start_offset=146, starts_line=False, line_number=12), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=148, start_offset=148, starts_line=False, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=156, start_offset=156, starts_line=False, line_number=12), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=158, start_offset=158, starts_line=True, line_number=13), - make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=160, start_offset=160, starts_line=False, line_number=13), - make_inst(opname='BINARY_OP', arg=23, argval=23, argrepr='-=', offset=162, start_offset=162, starts_line=False, line_number=13, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), - make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=False, line_number=13), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=176, start_offset=176, starts_line=True, line_number=14), - make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=178, start_offset=178, starts_line=False, line_number=14), - make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=180, start_offset=180, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=194, argrepr='to L6', offset=184, start_offset=184, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=188, start_offset=188, starts_line=False, line_number=14), - make_inst(opname='JUMP_BACKWARD', arg=37, argval=120, argrepr='to L5', offset=190, start_offset=190, starts_line=True, line_number=15, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=194, start_offset=194, starts_line=True, line_number=16, label=6), - make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=196, start_offset=196, starts_line=False, line_number=16), - make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=198, start_offset=198, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=212, argrepr='to L7', offset=202, start_offset=202, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=206, start_offset=206, starts_line=False, line_number=16), - make_inst(opname='JUMP_BACKWARD', arg=46, argval=120, argrepr='to L5', offset=208, start_offset=208, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='JUMP_FORWARD', arg=11, argval=236, argrepr='to L9', offset=212, start_offset=212, starts_line=True, line_number=17, label=7), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=214, start_offset=214, starts_line=True, line_number=19, label=8, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=2, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=224, start_offset=224, starts_line=False, line_number=19), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=226, start_offset=226, starts_line=False, line_number=19, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=False, line_number=19), - make_inst(opname='NOP', arg=None, argval=None, argrepr='', offset=236, start_offset=236, starts_line=True, line_number=20, label=9), - make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=238, start_offset=238, starts_line=True, line_number=21), - make_inst(opname='LOAD_SMALL_INT', arg=0, argval=0, argrepr='', offset=240, start_offset=240, starts_line=False, line_number=21), - make_inst(opname='BINARY_OP', arg=11, argval=11, argrepr='/', offset=242, start_offset=242, starts_line=False, line_number=21, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=254, start_offset=254, starts_line=False, line_number=21), - make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=256, start_offset=256, starts_line=True, line_number=25), - make_inst(opname='COPY', arg=1, argval=1, argrepr='', offset=258, start_offset=258, starts_line=False, line_number=25), - make_inst(opname='LOAD_SPECIAL', arg=1, argval=1, argrepr='__exit__', offset=260, start_offset=260, starts_line=False, line_number=25), - make_inst(opname='SWAP', arg=2, argval=2, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25), - make_inst(opname='SWAP', arg=3, argval=3, argrepr='', offset=264, start_offset=264, starts_line=False, line_number=25), - make_inst(opname='LOAD_SPECIAL', arg=0, argval=0, argrepr='__enter__', offset=266, start_offset=266, starts_line=False, line_number=25), - make_inst(opname='CALL', arg=0, argval=0, argrepr='', offset=268, start_offset=268, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='STORE_FAST', arg=1, argval='dodgy', argrepr='dodgy', offset=276, start_offset=276, starts_line=False, line_number=25), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=278, start_offset=278, starts_line=True, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=3, argval='Never reach this', argrepr="'Never reach this'", offset=288, start_offset=288, starts_line=False, line_number=26), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=290, start_offset=290, starts_line=False, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=298, start_offset=298, starts_line=False, line_number=26), - make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=300, start_offset=300, starts_line=True, line_number=25), - make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=False, line_number=25), + make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=1, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_GLOBAL', arg=1, argval='range', argrepr='range + NULL', offset=4, start_offset=4, starts_line=True, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_SMALL_INT', arg=10, argval=10, argrepr='', offset=14, start_offset=14, starts_line=False, line_number=3), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=3, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='GET_ITER', arg=None, argval=None, argrepr='', offset=24, start_offset=24, starts_line=False, line_number=3), + make_inst(opname='FOR_ITER', arg=33, argval=96, argrepr='to L4', offset=26, start_offset=26, starts_line=False, line_number=3, label=1, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=30, start_offset=30, starts_line=False, line_number=3), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=32, start_offset=32, starts_line=True, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=42, start_offset=42, starts_line=False, line_number=4), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=44, start_offset=44, starts_line=False, line_number=4, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=52, start_offset=52, starts_line=False, line_number=4), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=54, start_offset=54, starts_line=True, line_number=5), + make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=56, start_offset=56, starts_line=False, line_number=5), + make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=58, start_offset=58, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=72, argrepr='to L2', offset=62, start_offset=62, starts_line=False, line_number=5, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=66, start_offset=66, starts_line=False, line_number=5), + make_inst(opname='JUMP_BACKWARD', arg=23, argval=26, argrepr='to L1', offset=68, start_offset=68, starts_line=True, line_number=6, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=72, start_offset=72, starts_line=True, line_number=7, label=2), + make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=74, start_offset=74, starts_line=False, line_number=7), + make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=76, start_offset=76, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=90, argrepr='to L3', offset=80, start_offset=80, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=84, start_offset=84, starts_line=False, line_number=7), + make_inst(opname='JUMP_BACKWARD', arg=32, argval=26, argrepr='to L1', offset=86, start_offset=86, starts_line=False, line_number=7, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=90, start_offset=90, starts_line=True, line_number=8, label=3), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=92, start_offset=92, starts_line=False, line_number=8), + make_inst(opname='JUMP_FORWARD', arg=13, argval=122, argrepr='to L5', offset=94, start_offset=94, starts_line=False, line_number=8), + make_inst(opname='END_FOR', arg=None, argval=None, argrepr='', offset=96, start_offset=96, starts_line=True, line_number=3, label=4), + make_inst(opname='POP_ITER', arg=None, argval=None, argrepr='', offset=98, start_offset=98, starts_line=False, line_number=3), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=100, start_offset=100, starts_line=True, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=1, argval='I can haz else clause?', argrepr="'I can haz else clause?'", offset=110, start_offset=110, starts_line=False, line_number=10), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=112, start_offset=112, starts_line=False, line_number=10, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=10), + make_inst(opname='LOAD_FAST_CHECK', arg=0, argval='i', argrepr='i', offset=122, start_offset=122, starts_line=True, line_number=11, label=5), + make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=124, start_offset=124, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_JUMP_IF_FALSE', arg=40, argval=216, argrepr='to L8', offset=132, start_offset=132, starts_line=False, line_number=11, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=136, start_offset=136, starts_line=False, line_number=11), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=138, start_offset=138, starts_line=True, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=148, start_offset=148, starts_line=False, line_number=12), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=150, start_offset=150, starts_line=False, line_number=12, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=12), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=160, start_offset=160, starts_line=True, line_number=13), + make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=162, start_offset=162, starts_line=False, line_number=13), + make_inst(opname='BINARY_OP', arg=23, argval=23, argrepr='-=', offset=164, start_offset=164, starts_line=False, line_number=13, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), + make_inst(opname='STORE_FAST', arg=0, argval='i', argrepr='i', offset=176, start_offset=176, starts_line=False, line_number=13), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=178, start_offset=178, starts_line=True, line_number=14), + make_inst(opname='LOAD_SMALL_INT', arg=6, argval=6, argrepr='', offset=180, start_offset=180, starts_line=False, line_number=14), + make_inst(opname='COMPARE_OP', arg=148, argval='>', argrepr='bool(>)', offset=182, start_offset=182, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_FALSE', arg=3, argval=196, argrepr='to L6', offset=186, start_offset=186, starts_line=False, line_number=14, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=190, start_offset=190, starts_line=False, line_number=14), + make_inst(opname='JUMP_BACKWARD', arg=37, argval=122, argrepr='to L5', offset=192, start_offset=192, starts_line=True, line_number=15, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=196, start_offset=196, starts_line=True, line_number=16, label=6), + make_inst(opname='LOAD_SMALL_INT', arg=4, argval=4, argrepr='', offset=198, start_offset=198, starts_line=False, line_number=16), + make_inst(opname='COMPARE_OP', arg=18, argval='<', argrepr='bool(<)', offset=200, start_offset=200, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='POP_JUMP_IF_TRUE', arg=3, argval=214, argrepr='to L7', offset=204, start_offset=204, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=208, start_offset=208, starts_line=False, line_number=16), + make_inst(opname='JUMP_BACKWARD', arg=46, argval=122, argrepr='to L5', offset=210, start_offset=210, starts_line=False, line_number=16, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='JUMP_FORWARD', arg=11, argval=238, argrepr='to L9', offset=214, start_offset=214, starts_line=True, line_number=17, label=7), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=216, start_offset=216, starts_line=True, line_number=19, label=8, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=2, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=226, start_offset=226, starts_line=False, line_number=19), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=228, start_offset=228, starts_line=False, line_number=19, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=236, start_offset=236, starts_line=False, line_number=19), + make_inst(opname='NOP', arg=None, argval=None, argrepr='', offset=238, start_offset=238, starts_line=True, line_number=20, label=9), + make_inst(opname='LOAD_SMALL_INT', arg=1, argval=1, argrepr='', offset=240, start_offset=240, starts_line=True, line_number=21), + make_inst(opname='LOAD_SMALL_INT', arg=0, argval=0, argrepr='', offset=242, start_offset=242, starts_line=False, line_number=21), + make_inst(opname='BINARY_OP', arg=11, argval=11, argrepr='/', offset=244, start_offset=244, starts_line=False, line_number=21, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=256, start_offset=256, starts_line=False, line_number=21), + make_inst(opname='LOAD_FAST_BORROW', arg=0, argval='i', argrepr='i', offset=258, start_offset=258, starts_line=True, line_number=25), + make_inst(opname='COPY', arg=1, argval=1, argrepr='', offset=260, start_offset=260, starts_line=False, line_number=25), + make_inst(opname='LOAD_SPECIAL', arg=1, argval=1, argrepr='__exit__', offset=262, start_offset=262, starts_line=False, line_number=25), + make_inst(opname='SWAP', arg=2, argval=2, argrepr='', offset=264, start_offset=264, starts_line=False, line_number=25), + make_inst(opname='SWAP', arg=3, argval=3, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25), + make_inst(opname='LOAD_SPECIAL', arg=0, argval=0, argrepr='__enter__', offset=268, start_offset=268, starts_line=False, line_number=25), + make_inst(opname='CALL', arg=0, argval=0, argrepr='', offset=270, start_offset=270, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='STORE_FAST', arg=1, argval='dodgy', argrepr='dodgy', offset=278, start_offset=278, starts_line=False, line_number=25), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=280, start_offset=280, starts_line=True, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=3, argval='Never reach this', argrepr="'Never reach this'", offset=290, start_offset=290, starts_line=False, line_number=26), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=292, start_offset=292, starts_line=False, line_number=26, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=300, start_offset=300, starts_line=False, line_number=26), + make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=True, line_number=25), make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=304, start_offset=304, starts_line=False, line_number=25), - make_inst(opname='CALL', arg=3, argval=3, argrepr='', offset=306, start_offset=306, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=314, start_offset=314, starts_line=False, line_number=25), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=316, start_offset=316, starts_line=True, line_number=28, label=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=326, start_offset=326, starts_line=False, line_number=28), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=336, start_offset=336, starts_line=False, line_number=28), - make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=338, start_offset=338, starts_line=False, line_number=28), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=28), - make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=True, line_number=25), - make_inst(opname='WITH_EXCEPT_START', arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25), - make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_JUMP_IF_TRUE', arg=2, argval=362, argrepr='to L11', offset=354, start_offset=354, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=25), - make_inst(opname='RERAISE', arg=2, argval=2, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=11), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25), + make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=306, start_offset=306, starts_line=False, line_number=25), + make_inst(opname='CALL', arg=3, argval=3, argrepr='', offset=308, start_offset=308, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=316, start_offset=316, starts_line=False, line_number=25), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=318, start_offset=318, starts_line=True, line_number=28, label=10, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=328, start_offset=328, starts_line=False, line_number=28), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=330, start_offset=330, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28), + make_inst(opname='LOAD_CONST', arg=4, argval=None, argrepr='None', offset=340, start_offset=340, starts_line=False, line_number=28), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=28), + make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=True, line_number=25), + make_inst(opname='WITH_EXCEPT_START', arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=25), + make_inst(opname='TO_BOOL', arg=None, argval=None, argrepr='', offset=348, start_offset=348, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_JUMP_IF_TRUE', arg=2, argval=364, argrepr='to L11', offset=356, start_offset=356, starts_line=False, line_number=25, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25), + make_inst(opname='RERAISE', arg=2, argval=2, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=11), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25), make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25), make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=370, start_offset=370, starts_line=False, line_number=25), - make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=29, argval=316, argrepr='to L10', offset=372, start_offset=372, starts_line=False, line_number=25), - make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=374, start_offset=374, starts_line=True, line_number=None), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=None), - make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None), - make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=None), - make_inst(opname='LOAD_GLOBAL', arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=382, start_offset=382, starts_line=True, line_number=22, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='CHECK_EXC_MATCH', arg=None, argval=None, argrepr='', offset=392, start_offset=392, starts_line=False, line_number=22), - make_inst(opname='POP_JUMP_IF_FALSE', arg=15, argval=428, argrepr='to L12', offset=394, start_offset=394, starts_line=False, line_number=22, cache_info=[('counter', 1, b'\x00\x00')]), - make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=22), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=402, start_offset=402, starts_line=True, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=5, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=412, start_offset=412, starts_line=False, line_number=23), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=23), - make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=56, argval=316, argrepr='to L10', offset=426, start_offset=426, starts_line=False, line_number=23), - make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=428, start_offset=428, starts_line=True, line_number=22, label=12), - make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=430, start_offset=430, starts_line=True, line_number=None), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=None), - make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None), - make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=436, start_offset=436, starts_line=False, line_number=None), - make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=438, start_offset=438, starts_line=True, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), - make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=448, start_offset=448, starts_line=False, line_number=28), - make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=450, start_offset=450, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), - make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=458, start_offset=458, starts_line=False, line_number=28), - make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=460, start_offset=460, starts_line=False, line_number=28), - make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=462, start_offset=462, starts_line=True, line_number=None), - make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=464, start_offset=464, starts_line=False, line_number=None), - make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=466, start_offset=466, starts_line=False, line_number=None), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=372, start_offset=372, starts_line=False, line_number=25), + make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=29, argval=318, argrepr='to L10', offset=374, start_offset=374, starts_line=False, line_number=25), + make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=376, start_offset=376, starts_line=True, line_number=None), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None), + make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=None), + make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=382, start_offset=382, starts_line=False, line_number=None), + make_inst(opname='LOAD_GLOBAL', arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=384, start_offset=384, starts_line=True, line_number=22, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='CHECK_EXC_MATCH', arg=None, argval=None, argrepr='', offset=394, start_offset=394, starts_line=False, line_number=22), + make_inst(opname='POP_JUMP_IF_FALSE', arg=15, argval=430, argrepr='to L12', offset=396, start_offset=396, starts_line=False, line_number=22, cache_info=[('counter', 1, b'\x00\x00')]), + make_inst(opname='NOT_TAKEN', arg=None, argval=None, argrepr='', offset=400, start_offset=400, starts_line=False, line_number=22), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=402, start_offset=402, starts_line=False, line_number=22), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=404, start_offset=404, starts_line=True, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=5, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=414, start_offset=414, starts_line=False, line_number=23), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=416, start_offset=416, starts_line=False, line_number=23, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=424, start_offset=424, starts_line=False, line_number=23), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=426, start_offset=426, starts_line=False, line_number=23), + make_inst(opname='JUMP_BACKWARD_NO_INTERRUPT', arg=56, argval=318, argrepr='to L10', offset=428, start_offset=428, starts_line=False, line_number=23), + make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=430, start_offset=430, starts_line=True, line_number=22, label=12), + make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=432, start_offset=432, starts_line=True, line_number=None), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None), + make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=436, start_offset=436, starts_line=False, line_number=None), + make_inst(opname='PUSH_EXC_INFO', arg=None, argval=None, argrepr='', offset=438, start_offset=438, starts_line=False, line_number=None), + make_inst(opname='LOAD_GLOBAL', arg=3, argval='print', argrepr='print + NULL', offset=440, start_offset=440, starts_line=True, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), + make_inst(opname='LOAD_CONST', arg=6, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=450, start_offset=450, starts_line=False, line_number=28), + make_inst(opname='CALL', arg=1, argval=1, argrepr='', offset=452, start_offset=452, starts_line=False, line_number=28, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), + make_inst(opname='POP_TOP', arg=None, argval=None, argrepr='', offset=460, start_offset=460, starts_line=False, line_number=28), + make_inst(opname='RERAISE', arg=0, argval=0, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=28), + make_inst(opname='COPY', arg=3, argval=3, argrepr='', offset=464, start_offset=464, starts_line=True, line_number=None), + make_inst(opname='POP_EXCEPT', arg=None, argval=None, argrepr='', offset=466, start_offset=466, starts_line=False, line_number=None), + make_inst(opname='RERAISE', arg=1, argval=1, argrepr='', offset=468, start_offset=468, starts_line=False, line_number=None), ] # One last piece of inspect fodder to check the default line number handling def simple(): pass expected_opinfo_simple = [ make_inst(opname='RESUME', arg=0, argval=0, argrepr='', offset=0, start_offset=0, starts_line=True, line_number=simple.__code__.co_firstlineno), - make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=2, start_offset=2, starts_line=False, line_number=simple.__code__.co_firstlineno), - make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno), + make_inst(opname='LOAD_CONST', arg=0, argval=None, argrepr='None', offset=4, start_offset=4, starts_line=False, line_number=simple.__code__.co_firstlineno), + make_inst(opname='RETURN_VALUE', arg=None, argval=None, argrepr='', offset=6, start_offset=6, starts_line=False, line_number=simple.__code__.co_firstlineno), ] @@ -2346,8 +2353,10 @@ def test_from_traceback_dis(self): @requires_debug_ranges() def test_bytecode_co_positions(self): bytecode = dis.Bytecode("a=1") - for instr, positions in zip(bytecode, bytecode.codeobj.co_positions()): - assert instr.positions == positions + it = bytecode.codeobj.co_positions() + next(it) # Ignore the CACHE for the RESUME + for instr, positions in zip(bytecode, it): + self.assertEqual(instr.positions, positions) class TestBytecodeTestCase(BytecodeTestCase): def test_assert_not_in_with_op_not_in_bytecode(self): @@ -2415,7 +2424,7 @@ def func(): code = func.__code__ offsets = [linestart[0] for linestart in dis.findlinestarts(code)] - self.assertEqual(offsets, [0, 2]) + self.assertEqual(offsets, [0, 4]) class TestDisTraceback(DisTestBase): @@ -2552,6 +2561,7 @@ def test_show_cache(self): source = 'print()' expect = ''' 0 RESUME 0 + CACHE 0 (counter: 0) 1 LOAD_NAME 0 (print) PUSH_NULL @@ -2572,8 +2582,8 @@ def test_show_offsets(self): expect = ''' 0 0 RESUME 0 - 1 2 LOAD_CONST 0 (None) - 4 RETURN_VALUE + 1 4 LOAD_CONST 0 (None) + 6 RETURN_VALUE ''' for flag in ['-O', '--show-offsets']: self.check_output(source, expect, flag) diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index ea09f2d5ef836f..fe9136933fac2f 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -2691,6 +2691,12 @@ module_exec(PyObject *module) return 1; } + if (PyModule_Add(module, "TIER2_RESUME_THRESHOLD", + // + 1 more due to one loop spent on tracing. + PyLong_FromLong(RESUME_INITIAL_VALUE + 2)) < 0) { + return 1; + } + if (PyModule_Add(module, "SPECIALIZATION_THRESHOLD", PyLong_FromLong(ADAPTIVE_WARMUP_VALUE + 1)) < 0) { return 1; diff --git a/Objects/object.c b/Objects/object.c index 4fc692bb02940e..2991a8d5657d72 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -3190,7 +3190,7 @@ _Py_Dealloc(PyObject *op) #if !defined(Py_GIL_DISABLED) && !defined(Py_STACKREF_DEBUG) /* This assertion doesn't hold for the free-threading build, as * PyStackRef_CLOSE_SPECIALIZED is not implemented */ - assert(tstate->current_frame == NULL || tstate->current_frame->stackpointer != NULL); + // assert(tstate->current_frame == NULL || tstate->current_frame->stackpointer != NULL); #endif PyObject *old_exc = tstate != NULL ? tstate->current_exception : NULL; // Keep the old exception type alive to prevent undefined behavior diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index dbeedb7ffe0ce6..bf0d9f68a4d8ed 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,39 +1,39 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0, - 0,0,0,0,0,243,184,0,0,0,128,0,94,0,82,1, - 73,0,116,0,94,0,82,1,73,1,116,1,93,2,33,0, - 82,2,52,1,0,0,0,0,0,0,31,0,93,2,33,0, - 82,3,93,0,80,6,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,52,2,0,0,0,0,0,0, - 31,0,93,1,80,8,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,33,0,52,0,0,0,0,0, - 0,0,82,4,44,26,0,0,0,0,0,0,0,0,0,0, - 116,5,82,7,16,0,70,24,0,0,116,6,93,2,33,0, - 82,5,93,6,12,0,82,6,93,5,93,6,44,26,0,0, - 0,0,0,0,0,0,0,0,12,0,50,4,52,1,0,0, - 0,0,0,0,31,0,75,26,0,0,9,0,30,0,82,1, - 35,0,41,8,233,0,0,0,0,78,122,18,70,114,111,122, - 101,110,32,72,101,108,108,111,32,87,111,114,108,100,122,8, - 115,121,115,46,97,114,103,118,218,6,99,111,110,102,105,103, - 122,7,99,111,110,102,105,103,32,122,2,58,32,41,5,218, - 12,112,114,111,103,114,97,109,95,110,97,109,101,218,10,101, - 120,101,99,117,116,97,98,108,101,218,15,117,115,101,95,101, - 110,118,105,114,111,110,109,101,110,116,218,17,99,111,110,102, - 105,103,117,114,101,95,99,95,115,116,100,105,111,218,14,98, - 117,102,102,101,114,101,100,95,115,116,100,105,111,41,7,218, - 3,115,121,115,218,17,95,116,101,115,116,105,110,116,101,114, - 110,97,108,99,97,112,105,218,5,112,114,105,110,116,218,4, - 97,114,103,118,218,11,103,101,116,95,99,111,110,102,105,103, - 115,114,3,0,0,0,218,3,107,101,121,169,0,243,0,0, - 0,0,218,18,116,101,115,116,95,102,114,111,122,101,110,109, - 97,105,110,46,112,121,218,8,60,109,111,100,117,108,101,62, - 114,18,0,0,0,1,0,0,0,115,94,0,0,0,240,3, - 1,1,1,243,8,0,1,11,219,0,24,225,0,5,208,6, - 26,212,0,27,217,0,5,128,106,144,35,151,40,145,40,212, - 0,27,216,9,26,215,9,38,210,9,38,211,9,40,168,24, - 213,9,50,128,6,243,2,6,12,2,128,67,241,14,0,5, - 10,136,71,144,67,144,53,152,2,152,54,160,35,157,59,152, - 45,208,10,40,214,4,41,243,15,6,12,2,114,16,0,0, - 0, + 0,0,0,0,0,243,186,0,0,0,128,0,0,0,94,0, + 82,1,73,0,116,0,94,0,82,1,73,1,116,1,93,2, + 33,0,82,2,52,1,0,0,0,0,0,0,31,0,93,2, + 33,0,82,3,93,0,80,6,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,52,2,0,0,0,0, + 0,0,31,0,93,1,80,8,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,33,0,52,0,0,0, + 0,0,0,0,82,4,44,26,0,0,0,0,0,0,0,0, + 0,0,116,5,82,7,16,0,70,24,0,0,116,6,93,2, + 33,0,82,5,93,6,12,0,82,6,93,5,93,6,44,26, + 0,0,0,0,0,0,0,0,0,0,12,0,50,4,52,1, + 0,0,0,0,0,0,31,0,75,26,0,0,9,0,30,0, + 82,1,35,0,41,8,233,0,0,0,0,78,122,18,70,114, + 111,122,101,110,32,72,101,108,108,111,32,87,111,114,108,100, + 122,8,115,121,115,46,97,114,103,118,218,6,99,111,110,102, + 105,103,122,7,99,111,110,102,105,103,32,122,2,58,32,41, + 5,218,12,112,114,111,103,114,97,109,95,110,97,109,101,218, + 10,101,120,101,99,117,116,97,98,108,101,218,15,117,115,101, + 95,101,110,118,105,114,111,110,109,101,110,116,218,17,99,111, + 110,102,105,103,117,114,101,95,99,95,115,116,100,105,111,218, + 14,98,117,102,102,101,114,101,100,95,115,116,100,105,111,41, + 7,218,3,115,121,115,218,17,95,116,101,115,116,105,110,116, + 101,114,110,97,108,99,97,112,105,218,5,112,114,105,110,116, + 218,4,97,114,103,118,218,11,103,101,116,95,99,111,110,102, + 105,103,115,114,3,0,0,0,218,3,107,101,121,169,0,243, + 0,0,0,0,218,18,116,101,115,116,95,102,114,111,122,101, + 110,109,97,105,110,46,112,121,218,8,60,109,111,100,117,108, + 101,62,114,18,0,0,0,1,0,0,0,115,94,0,0,0, + 241,3,1,1,1,243,8,0,1,11,219,0,24,225,0,5, + 208,6,26,212,0,27,217,0,5,128,106,144,35,151,40,145, + 40,212,0,27,216,9,26,215,9,38,210,9,38,211,9,40, + 168,24,213,9,50,128,6,243,2,6,12,2,128,67,241,14, + 0,5,10,136,71,144,67,144,53,152,2,152,54,160,35,157, + 59,152,45,208,10,40,214,4,41,243,15,6,12,2,114,16, + 0,0,0, }; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 151fab29e3cfe0..ce36bb03085f46 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -147,6 +147,7 @@ dummy_func( family(RESUME, 1) = { RESUME_CHECK, + RESUME_CHECK_JIT, }; macro(NOT_TAKEN) = NOP; @@ -171,7 +172,8 @@ dummy_func( op(_QUICKEN_RESUME, (--)) { #if ENABLE_SPECIALIZATION_FT if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + uint8_t desired = tstate->interp->jit ? RESUME_CHECK_JIT : RESUME_CHECK; + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, desired); } #endif /* ENABLE_SPECIALIZATION_FT */ } @@ -224,7 +226,11 @@ dummy_func( _QUICKEN_RESUME + _CHECK_PERIODIC_IF_NOT_YIELD_FROM; - inst(RESUME_CHECK, (unused/1 --)) { + macro(RESUME_CHECK) = + unused/1 + + _RESUME_CHECK; + + op(_RESUME_CHECK, (--)) { #if defined(__EMSCRIPTEN__) DEOPT_IF(_Py_emscripten_signal_clock == 0); _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; @@ -239,6 +245,11 @@ dummy_func( #endif } + macro(RESUME_CHECK_JIT) = + unused/1 + + _RESUME_CHECK + + _JIT; + op(_MONITOR_RESUME, (--)) { int err = _Py_call_instrumentation( tstate, oparg == 0 ? PY_MONITORING_EVENT_PY_START : PY_MONITORING_EVENT_PY_RESUME, frame, this_instr); @@ -250,6 +261,7 @@ dummy_func( } macro(INSTRUMENTED_RESUME) = + unused/1 + _LOAD_BYTECODE + _MAYBE_INSTRUMENT + _CHECK_PERIODIC_IF_NOT_YIELD_FROM + @@ -2953,7 +2965,8 @@ dummy_func( #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT && + (this_instr->op.code == JUMP_BACKWARD_JIT || + this_instr->op.code == RESUME_CHECK_JIT) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; @@ -2961,7 +2974,8 @@ dummy_func( oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, + STACK_LEVEL(), 0, NULL, opcode, oparg); if (succ) { ENTER_TRACING(); } @@ -5390,7 +5404,8 @@ dummy_func( // Note: it's safe to use target->op.arg here instead of the oparg given by EXTENDED_ARG. // The invariant in the optimizer is the deopt target always points back to the first EXTENDED_ARG. // So setting it to anything else is wrong. - int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.arg); + int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), + chain_depth, exit, target->op.code, target->op.arg); exit->temperature = restart_backoff_counter(exit->temperature); if (succ) { GOTO_TIER_ONE_CONTINUE_TRACING(target); diff --git a/Python/ceval.c b/Python/ceval.c index 924afaa97443cb..264b5138a78de3 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1394,7 +1394,8 @@ static const _Py_CODEUNIT _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS[] = { { .op.code = INTERPRETER_EXIT, .op.arg = 0 }, /* reached on return */ { .op.code = NOP, .op.arg = 0 }, { .op.code = INTERPRETER_EXIT, .op.arg = 0 }, /* reached on yield */ - { .op.code = RESUME, .op.arg = RESUME_OPARG_DEPTH1_MASK | RESUME_AT_FUNC_START } + { .op.code = RESUME, .op.arg = RESUME_OPARG_DEPTH1_MASK | RESUME_AT_FUNC_START }, + { .op.code = CACHE, .op.arg = 0 } /* RESUME's CACHE */ }; const _Py_CODEUNIT *_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR = (_Py_CODEUNIT*)&_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS; @@ -1455,7 +1456,7 @@ _PyObjectArray_Free(PyObject **array, PyObject **scratch) #if _Py_TIER2 // 0 for success, -1 for error. -static int +static Py_NO_INLINE int stop_tracing_and_jit(PyThreadState *tstate, _PyInterpreterFrame *frame) { int _is_sys_tracing = (tstate->c_tracefunc != NULL) || (tstate->c_profilefunc != NULL); @@ -1469,11 +1470,14 @@ stop_tracing_and_jit(PyThreadState *tstate, _PyInterpreterFrame *frame) if (exit == NULL) { // We hold a strong reference to the code object, so the instruction won't be freed. if (err <= 0) { - _Py_BackoffCounter counter = _tstate->jit_tracer_state.initial_state.jump_backward_instr[1].counter; - _tstate->jit_tracer_state.initial_state.jump_backward_instr[1].counter = restart_backoff_counter(counter); + _Py_BackoffCounter counter = _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter; + _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter = restart_backoff_counter(counter); } else { - _tstate->jit_tracer_state.initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(); + int origin_opcode = _tstate->jit_tracer_state.initial_state.trace_origin_opcode; + assert(origin_opcode == JUMP_BACKWARD_JIT || origin_opcode == RESUME_CHECK_JIT); + _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter = origin_opcode == JUMP_BACKWARD_JIT + ? initial_jump_backoff_counter() : initial_resume_backoff_counter(); } } else { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 4e8fa34c0b2c0d..800df715ed86d3 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -17751,7 +17751,8 @@ _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit); assert(tstate->current_executor == (PyObject *)previous_executor); int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow; - int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.arg); + int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), + chain_depth, exit, target->op.code, target->op.arg); exit->temperature = restart_backoff_counter(exit->temperature); if (succ) { GOTO_TIER_ONE_CONTINUE_TRACING(target); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index b2eab7ac85e98e..05bf02a95cfd1b 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -6964,8 +6964,9 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(INSTRUMENTED_RESUME); + /* Skip 1 cache entry */ // _LOAD_BYTECODE { #ifdef Py_GIL_DISABLED @@ -7283,6 +7284,7 @@ frame->instr_ptr = next_instr; next_instr += 2; INSTRUCTION_STATS(JUMP_BACKWARD_JIT); + opcode = JUMP_BACKWARD_JIT; static_assert(1 == 1, "incorrect cache size"); /* Skip 1 cache entry */ // _CHECK_PERIODIC @@ -7304,14 +7306,16 @@ #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT && + (this_instr->op.code == JUMP_BACKWARD_JIT || + this_instr->op.code == RESUME_CHECK_JIT) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, STACK_LEVEL(), 0, NULL, oparg); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, + STACK_LEVEL(), 0, NULL, opcode, oparg); if (succ) { ENTER_TRACING(); } @@ -9958,7 +9962,8 @@ { #if ENABLE_SPECIALIZATION_FT if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + uint8_t desired = tstate->interp->jit ? RESUME_CHECK_JIT : RESUME_CHECK; + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, desired); } #endif /* ENABLE_SPECIALIZATION_FT */ } @@ -10015,6 +10020,76 @@ DISPATCH(); } + TARGET(RESUME_CHECK_JIT) { + #if _Py_TAIL_CALL_INTERP + int opcode = RESUME_CHECK_JIT; + (void)(opcode); + #endif + _Py_CODEUNIT* const this_instr = next_instr; + (void)this_instr; + frame->instr_ptr = next_instr; + next_instr += 2; + INSTRUCTION_STATS(RESUME_CHECK_JIT); + opcode = RESUME_CHECK_JIT; + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ + // _RESUME_CHECK + { + #if defined(__EMSCRIPTEN__) + if (_Py_emscripten_signal_clock == 0) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + #endif + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); + if (eval_breaker != version) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #ifdef Py_GIL_DISABLED + if (frame->tlbc_index != + ((_PyThreadStateImpl *)tstate)->tlbc_index) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #endif + } + // _JIT + { + #ifdef _Py_TIER2 + _Py_BackoffCounter counter = this_instr[1].counter; + if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && + (this_instr->op.code == JUMP_BACKWARD_JIT || + this_instr->op.code == RESUME_CHECK_JIT) && + next_instr->op.code != ENTER_EXECUTOR) { + _Py_CODEUNIT *insert_exec_at = this_instr; + while (oparg > 255) { + oparg >>= 8; + insert_exec_at--; + } + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, + STACK_LEVEL(), 0, NULL, opcode, oparg); + if (succ) { + ENTER_TRACING(); + } + else { + this_instr[1].counter = restart_backoff_counter(counter); + } + } + else { + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + #endif + } + DISPATCH(); + } + TARGET(RETURN_GENERATOR) { #if _Py_TAIL_CALL_INTERP int opcode = RETURN_GENERATOR; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 267e707dc597fb..ac85b96c64141f 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -195,6 +195,7 @@ static void *opcode_targets_table[256] = { &&TARGET_LOAD_SUPER_ATTR_ATTR, &&TARGET_LOAD_SUPER_ATTR_METHOD, &&TARGET_RESUME_CHECK, + &&TARGET_RESUME_CHECK_JIT, &&TARGET_SEND_GEN, &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_STORE_ATTR_SLOT, @@ -232,7 +233,6 @@ static void *opcode_targets_table[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_POP_ITER, &&TARGET_INSTRUMENTED_END_SEND, @@ -469,7 +469,7 @@ static void *opcode_tracing_targets_table[256] = { &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, - &&_unknown_opcode, + &&TARGET_TRACE_RECORD, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, @@ -715,6 +715,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RERAISE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESERVED(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK_JIT(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_GENERATOR(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_VALUE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_SEND(TAIL_CALL_PARAMS); @@ -953,6 +954,7 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [RESERVED] = _TAIL_CALL_RESERVED, [RESUME] = _TAIL_CALL_RESUME, [RESUME_CHECK] = _TAIL_CALL_RESUME_CHECK, + [RESUME_CHECK_JIT] = _TAIL_CALL_RESUME_CHECK_JIT, [RETURN_GENERATOR] = _TAIL_CALL_RETURN_GENERATOR, [RETURN_VALUE] = _TAIL_CALL_RETURN_VALUE, [SEND] = _TAIL_CALL_SEND, @@ -1001,7 +1003,6 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [210] = _TAIL_CALL_UNKNOWN_OPCODE, [211] = _TAIL_CALL_UNKNOWN_OPCODE, [212] = _TAIL_CALL_UNKNOWN_OPCODE, [213] = _TAIL_CALL_UNKNOWN_OPCODE, @@ -1211,6 +1212,7 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [RESERVED] = _TAIL_CALL_TRACE_RECORD, [RESUME] = _TAIL_CALL_TRACE_RECORD, [RESUME_CHECK] = _TAIL_CALL_TRACE_RECORD, + [RESUME_CHECK_JIT] = _TAIL_CALL_TRACE_RECORD, [RETURN_GENERATOR] = _TAIL_CALL_TRACE_RECORD, [RETURN_VALUE] = _TAIL_CALL_TRACE_RECORD, [SEND] = _TAIL_CALL_TRACE_RECORD, @@ -1259,7 +1261,6 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [210] = _TAIL_CALL_UNKNOWN_OPCODE, [211] = _TAIL_CALL_UNKNOWN_OPCODE, [212] = _TAIL_CALL_UNKNOWN_OPCODE, [213] = _TAIL_CALL_UNKNOWN_OPCODE, diff --git a/Python/optimizer.c b/Python/optimizer.c index 900b07473fe351..145bb0b0dcc21a 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -677,6 +677,13 @@ _PyJit_translate_single_bytecode_to_trace( } assert(!OPCODE_HAS_EXIT(opcode)); assert(!OPCODE_HAS_DEOPT(opcode)); + // First instruction is a RESUME_CHECK_JIT and we are an ENTER_EXECUTOR. + // This might cause no progress + // and interfere with instrumentation. Skip the RESUME_CHECK_JIT + // Skip this instruction. + if (opcode == RESUME) { + return 1; + } } bool needs_guard_ip = OPCODE_HAS_NEEDS_GUARD_IP(opcode); @@ -1014,7 +1021,7 @@ Py_NO_INLINE int _PyJit_TryInitializeTracing( PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_CODEUNIT *curr_instr, _Py_CODEUNIT *start_instr, _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, - _PyExitData *exit, int oparg) + _PyExitData *exit, int opcode, int oparg) { _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; // A recursive trace. @@ -1071,12 +1078,10 @@ _PyJit_TryInitializeTracing( _tstate->jit_tracer_state.prev_state.instr_frame = frame; _tstate->jit_tracer_state.prev_state.instr_oparg = oparg; _tstate->jit_tracer_state.prev_state.instr_stacklevel = curr_stackdepth; - assert(curr_instr->op.code == JUMP_BACKWARD_JIT || (exit != NULL)); - _tstate->jit_tracer_state.initial_state.jump_backward_instr = curr_instr; + assert(curr_instr->op.code == JUMP_BACKWARD_JIT || curr_instr->op.code == RESUME_CHECK_JIT || (exit != NULL)); + _tstate->jit_tracer_state.initial_state.trace_enter_instr = curr_instr; + _tstate->jit_tracer_state.initial_state.trace_origin_opcode = opcode; - if (_PyOpcode_Caches[_PyOpcode_Deopt[close_loop_instr->op.code]]) { - close_loop_instr[1].counter = trigger_backoff_counter(); - } _Py_BloomFilter_Init(&_tstate->jit_tracer_state.prev_state.dependencies); return 1; } diff --git a/Python/specialize.c b/Python/specialize.c index 55600af2efc2ab..952de72c9e9a96 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -2826,5 +2826,6 @@ const struct _PyCode8 _Py_InitCleanup = { EXIT_INIT_CHECK, 0, RETURN_VALUE, 0, RESUME, RESUME_AT_FUNC_START, + CACHE, 0, /* RESUME's cache */ } }; From 159601cb32e73aaf2d5ca091c63a85d497fb5748 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Mon, 29 Dec 2025 21:45:15 +0000 Subject: [PATCH 03/43] Fix all remaining bugs --- Lib/test/test_code.py | 5 +- Lib/test/test_monitoring.py | 151 ++++++++++++++++++------------------ Objects/codeobject.c | 7 +- Objects/object.c | 2 +- Python/assemble.c | 2 +- Python/bytecodes.c | 2 +- Python/executor_cases.c.h | 30 ++++++- Python/instrumentation.c | 1 + 8 files changed, 114 insertions(+), 86 deletions(-) diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 655f5a9be7fa31..e49c627c09293f 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -1437,6 +1437,7 @@ def f(): co_code=bytes( [ dis.opmap["RESUME"], 0, + dis.opmap["CACHE"], 0, dis.opmap["LOAD_COMMON_CONSTANT"], 0, dis.opmap["RAISE_VARARGS"], 1, ] @@ -1445,7 +1446,7 @@ def f(): [ (1 << 7) | (PY_CODE_LOCATION_INFO_NO_COLUMNS << 3) - | (3 - 1), + | (4 - 1), 0, ] ), @@ -1453,7 +1454,7 @@ def f(): self.assertRaises(AssertionError, f) self.assertEqual( list(f.__code__.co_positions()), - 3 * [(42, 42, None, None)], + 4 * [(42, 42, None, None)], ) @cpython_only diff --git a/Lib/test/test_monitoring.py b/Lib/test/test_monitoring.py index 83bf510ceea18c..b6fb4ed5be7a06 100644 --- a/Lib/test/test_monitoring.py +++ b/Lib/test/test_monitoring.py @@ -1214,19 +1214,20 @@ def func1(): line3 = 3 self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ - ('line', 'get_events', 10), - ('line', 'func1', 1), - ('instruction', 'func1', 2), - ('instruction', 'func1', 4), - ('line', 'func1', 2), - ('instruction', 'func1', 6), - ('instruction', 'func1', 8), - ('line', 'func1', 3), - ('instruction', 'func1', 10), - ('instruction', 'func1', 12), - ('instruction', 'func1', 14), - ('instruction', 'func1', 16), - ('line', 'get_events', 11)]) + ("line", "get_events", 10), + ("line", "func1", 1), + ("instruction", "func1", 4), + ("instruction", "func1", 6), + ("line", "func1", 2), + ("instruction", "func1", 8), + ("instruction", "func1", 10), + ("line", "func1", 3), + ("instruction", "func1", 12), + ("instruction", "func1", 14), + ("instruction", "func1", 16), + ("instruction", "func1", 18), + ("line", "get_events", 11), + ]) def test_c_call(self): @@ -1236,22 +1237,23 @@ def func2(): line3 = 3 self.check_events(func2, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ - ('line', 'get_events', 10), - ('line', 'func2', 1), - ('instruction', 'func2', 2), - ('instruction', 'func2', 4), - ('line', 'func2', 2), - ('instruction', 'func2', 6), - ('instruction', 'func2', 8), - ('instruction', 'func2', 28), - ('instruction', 'func2', 30), - ('instruction', 'func2', 38), - ('line', 'func2', 3), - ('instruction', 'func2', 40), - ('instruction', 'func2', 42), - ('instruction', 'func2', 44), - ('instruction', 'func2', 46), - ('line', 'get_events', 11)]) + ("line", "get_events", 10), + ("line", "func2", 1), + ("instruction", "func2", 4), + ("instruction", "func2", 6), + ("line", "func2", 2), + ("instruction", "func2", 8), + ("instruction", "func2", 10), + ("instruction", "func2", 30), + ("instruction", "func2", 32), + ("instruction", "func2", 40), + ("line", "func2", 3), + ("instruction", "func2", 42), + ("instruction", "func2", 44), + ("instruction", "func2", 46), + ("instruction", "func2", 48), + ("line", "get_events", 11), + ]) def test_try_except(self): @@ -1264,28 +1266,29 @@ def func3(): line = 6 self.check_events(func3, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ - ('line', 'get_events', 10), - ('line', 'func3', 1), - ('instruction', 'func3', 2), - ('line', 'func3', 2), - ('instruction', 'func3', 4), - ('instruction', 'func3', 6), - ('line', 'func3', 3), - ('instruction', 'func3', 8), - ('instruction', 'func3', 18), - ('instruction', 'func3', 20), - ('line', 'func3', 4), - ('instruction', 'func3', 22), - ('line', 'func3', 5), - ('instruction', 'func3', 24), - ('instruction', 'func3', 26), - ('instruction', 'func3', 28), - ('line', 'func3', 6), - ('instruction', 'func3', 30), - ('instruction', 'func3', 32), - ('instruction', 'func3', 34), - ('instruction', 'func3', 36), - ('line', 'get_events', 11)]) + ("line", "get_events", 10), + ("line", "func3", 1), + ("instruction", "func3", 4), + ("line", "func3", 2), + ("instruction", "func3", 6), + ("instruction", "func3", 8), + ("line", "func3", 3), + ("instruction", "func3", 10), + ("instruction", "func3", 20), + ("instruction", "func3", 22), + ("line", "func3", 4), + ("instruction", "func3", 24), + ("line", "func3", 5), + ("instruction", "func3", 26), + ("instruction", "func3", 28), + ("instruction", "func3", 30), + ("line", "func3", 6), + ("instruction", "func3", 32), + ("instruction", "func3", 34), + ("instruction", "func3", 36), + ("instruction", "func3", 38), + ("line", "get_events", 11), + ]) def test_with_restart(self): def func1(): @@ -1296,16 +1299,16 @@ def func1(): self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ ('line', 'get_events', 10), ('line', 'func1', 1), - ('instruction', 'func1', 2), ('instruction', 'func1', 4), - ('line', 'func1', 2), ('instruction', 'func1', 6), + ('line', 'func1', 2), ('instruction', 'func1', 8), - ('line', 'func1', 3), ('instruction', 'func1', 10), + ('line', 'func1', 3), ('instruction', 'func1', 12), ('instruction', 'func1', 14), ('instruction', 'func1', 16), + ('instruction', 'func1', 18), ('line', 'get_events', 11)]) sys.monitoring.restart_events() @@ -1313,16 +1316,16 @@ def func1(): self.check_events(func1, recorders = LINE_AND_INSTRUCTION_RECORDERS, expected = [ ('line', 'get_events', 10), ('line', 'func1', 1), - ('instruction', 'func1', 2), ('instruction', 'func1', 4), - ('line', 'func1', 2), ('instruction', 'func1', 6), + ('line', 'func1', 2), ('instruction', 'func1', 8), - ('line', 'func1', 3), ('instruction', 'func1', 10), + ('line', 'func1', 3), ('instruction', 'func1', 12), ('instruction', 'func1', 14), ('instruction', 'func1', 16), + ('instruction', 'func1', 18), ('line', 'get_events', 11)]) def test_turn_off_only_instruction(self): @@ -1370,10 +1373,10 @@ def func1(): line1 = 1 MUST_INCLUDE_LI = [ - ('instruction', 'func1', 2), - ('line', 'func1', 2), ('instruction', 'func1', 4), - ('instruction', 'func1', 6)] + ('line', 'func1', 2), + ('instruction', 'func1', 6), + ('instruction', 'func1', 8)] def test_line_then_instruction(self): recorders = [ LineRecorder, InstructionRecorder ] @@ -1390,11 +1393,11 @@ def func2(): len(()) MUST_INCLUDE_CI = [ - ('instruction', 'func2', 2), + ('instruction', 'func2', 4), ('call', 'func2', sys.monitoring.MISSING), ('call', 'len', ()), - ('instruction', 'func2', 12), - ('instruction', 'func2', 14)] + ('instruction', 'func2', 14), + ('instruction', 'func2', 16)] @@ -1609,11 +1612,11 @@ def whilefunc(n=0): ('branch right', 'whilefunc', 1, 3)]) self.check_events(func, recorders = BRANCH_OFFSET_RECORDERS, expected = [ - ('branch left', 'func', 28, 32), - ('branch right', 'func', 44, 58), - ('branch left', 'func', 28, 32), - ('branch left', 'func', 44, 50), - ('branch right', 'func', 28, 70)]) + ('branch left', 'func', 30, 34), + ('branch right', 'func', 46, 60), + ('branch left', 'func', 30, 34), + ('branch left', 'func', 46, 52), + ('branch right', 'func', 30, 72)]) def test_except_star(self): @@ -1640,8 +1643,8 @@ def func(): ('branch', 'func', 4, 4), ('line', 'func', 5), ('line', 'meth', 1), - ('jump', 'func', 5, '[offset=120]'), - ('branch', 'func', '[offset=124]', '[offset=130]'), + ('jump', 'func', 5, '[offset=122]'), + ('branch', 'func', '[offset=126]', '[offset=132]'), ('line', 'get_events', 11)]) self.check_events(func, recorders = FLOW_AND_LINE_RECORDERS, expected = [ @@ -1655,8 +1658,8 @@ def func(): ('line', 'func', 5), ('line', 'meth', 1), ('return', 'meth', None), - ('jump', 'func', 5, '[offset=120]'), - ('branch', 'func', '[offset=124]', '[offset=130]'), + ('jump', 'func', 5, '[offset=122]'), + ('branch', 'func', '[offset=126]', '[offset=132]'), ('return', 'func', None), ('line', 'get_events', 11)]) @@ -1668,8 +1671,8 @@ def foo(n=0): n += 1 return None - in_loop = ('branch left', 'foo', 10, 16) - exit_loop = ('branch right', 'foo', 10, 40) + in_loop = ('branch left', 'foo', 12, 18) + exit_loop = ('branch right', 'foo', 12, 42) self.check_events(foo, recorders = BRANCH_OFFSET_RECORDERS, expected = [ in_loop, in_loop, diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 3aea2038fd17e7..2deda3c56c452c 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -930,8 +930,9 @@ PyUnstable_Code_New(int argcount, int kwonlyargcount, // NOTE: When modifying the construction of PyCode_NewEmpty, please also change // test.test_code.CodeLocationTest.test_code_new_empty to keep it in sync! -static const uint8_t assert0[6] = { +static const uint8_t assert0[8] = { RESUME, RESUME_AT_FUNC_START, + CACHE, 0, LOAD_COMMON_CONSTANT, CONSTANT_ASSERTIONERROR, RAISE_VARARGS, 1 }; @@ -939,7 +940,7 @@ static const uint8_t assert0[6] = { static const uint8_t linetable[2] = { (1 << 7) // New entry. | (PY_CODE_LOCATION_INFO_NO_COLUMNS << 3) - | (3 - 1), // Three code units. + | (4 - 1), // Four code units. 0, // Offset from co_firstlineno. }; @@ -965,7 +966,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) if (filename_ob == NULL) { goto failed; } - code_ob = PyBytes_FromStringAndSize((const char *)assert0, 6); + code_ob = PyBytes_FromStringAndSize((const char *)assert0, 8); if (code_ob == NULL) { goto failed; } diff --git a/Objects/object.c b/Objects/object.c index 2991a8d5657d72..4fc692bb02940e 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -3190,7 +3190,7 @@ _Py_Dealloc(PyObject *op) #if !defined(Py_GIL_DISABLED) && !defined(Py_STACKREF_DEBUG) /* This assertion doesn't hold for the free-threading build, as * PyStackRef_CLOSE_SPECIALIZED is not implemented */ - // assert(tstate->current_frame == NULL || tstate->current_frame->stackpointer != NULL); + assert(tstate->current_frame == NULL || tstate->current_frame->stackpointer != NULL); #endif PyObject *old_exc = tstate != NULL ? tstate->current_exception : NULL; // Keep the old exception type alive to prevent undefined behavior diff --git a/Python/assemble.c b/Python/assemble.c index 8cc2d50a3227f8..7c08488092de63 100644 --- a/Python/assemble.c +++ b/Python/assemble.c @@ -669,7 +669,7 @@ makecode(_PyCompile_CodeUnitMetadata *umd, struct assembler *a, PyObject *const_ // The offset (in code units) of the END_SEND from the SEND in the `yield from` sequence. -#define END_SEND_OFFSET 5 +#define END_SEND_OFFSET 6 static int resolve_jump_offsets(instr_sequence *instrs) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index ce36bb03085f46..19a95a08dadb77 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5372,7 +5372,7 @@ dummy_func( #endif uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); HANDLE_PENDING_AND_DEOPT_IF(eval_breaker & _PY_EVAL_EVENTS_MASK); - assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + HANDLE_PENDING_AND_DEOPT_IF(!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))); } tier2 op(_COLD_EXIT, ( -- )) { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 800df715ed86d3..e2b4e18bc88e6f 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -17625,7 +17625,11 @@ SET_CURRENT_CACHED_VALUES(0); JUMP_TO_JUMP_TARGET(); } - assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { + UOP_STAT_INC(uopcode, miss); + SET_CURRENT_CACHED_VALUES(0); + JUMP_TO_JUMP_TARGET(); + } SET_CURRENT_CACHED_VALUES(0); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); break; @@ -17651,7 +17655,12 @@ SET_CURRENT_CACHED_VALUES(1); JUMP_TO_JUMP_TARGET(); } - assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { + UOP_STAT_INC(uopcode, miss); + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(1); + JUMP_TO_JUMP_TARGET(); + } _tos_cache0 = _stack_item_0; SET_CURRENT_CACHED_VALUES(1); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); @@ -17681,7 +17690,13 @@ SET_CURRENT_CACHED_VALUES(2); JUMP_TO_JUMP_TARGET(); } - assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { + UOP_STAT_INC(uopcode, miss); + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(2); + JUMP_TO_JUMP_TARGET(); + } _tos_cache1 = _stack_item_1; _tos_cache0 = _stack_item_0; SET_CURRENT_CACHED_VALUES(2); @@ -17715,7 +17730,14 @@ SET_CURRENT_CACHED_VALUES(3); JUMP_TO_JUMP_TARGET(); } - assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { + UOP_STAT_INC(uopcode, miss); + _tos_cache2 = _stack_item_2; + _tos_cache1 = _stack_item_1; + _tos_cache0 = _stack_item_0; + SET_CURRENT_CACHED_VALUES(3); + JUMP_TO_JUMP_TARGET(); + } _tos_cache2 = _stack_item_2; _tos_cache1 = _stack_item_1; _tos_cache0 = _stack_item_0; diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 28bbe1d82a3b88..7355552a8a7158 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -576,6 +576,7 @@ sanity_check_instrumentation(PyCodeObject *code) CHECK(opcode != END_FOR); CHECK(opcode != RESUME); CHECK(opcode != RESUME_CHECK); + CHECK(opcode != RESUME_CHECK_JIT); CHECK(opcode != INSTRUMENTED_RESUME); if (!is_instrumented(opcode)) { CHECK(_PyOpcode_Deopt[opcode] == opcode); From 9f28e8785351422267b4d03b0ae5f77032915a4f Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 00:50:41 +0000 Subject: [PATCH 04/43] Up the resume value to 7918 --- Include/internal/pycore_backoff.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h index 049e238b42e5ab..9cb62bccb21435 100644 --- a/Include/internal/pycore_backoff.h +++ b/Include/internal/pycore_backoff.h @@ -133,8 +133,11 @@ initial_jump_backoff_counter(void) JUMP_BACKWARD_INITIAL_BACKOFF); } -// Set this to slightly (~25%) higher than JUMP_BACKWARD_INITIAL_VALUE -#define RESUME_INITIAL_VALUE 5002 +// This needs to be around 2-4x of JUMP_BACKWARD_INITIAL_VALUE +// The reasoning is that we always want loop traces to form and inline +// functions before functions themselves warm up and link to them instead +// of inlining. +#define RESUME_INITIAL_VALUE 7917 #define RESUME_INITIAL_BACKOFF 6 static inline _Py_BackoffCounter initial_resume_backoff_counter(void) From 16205d73eb5af875c22cfd2c0efc74edc9caf4e1 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 12:10:08 +0000 Subject: [PATCH 05/43] remove control flow, allow RESUME_CHECK_JIT --- Include/internal/pycore_optimizer.h | 3 +- Lib/test/test_capi/test_opt.py | 18 ++++++++++- Python/bytecodes.c | 36 ++++++---------------- Python/ceval.c | 2 +- Python/executor_cases.c.h | 18 +++++------ Python/generated_cases.c.h | 31 ++----------------- Python/opcode_targets.h | 1 - Python/optimizer.c | 48 +++++++++++++++++------------ 8 files changed, 69 insertions(+), 88 deletions(-) diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index eb88f3fa6624eb..318918e8f458b1 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -36,10 +36,9 @@ typedef struct { typedef struct _PyExitData { uint32_t target; - uint16_t index:12; + uint16_t index:13; uint16_t stack_cache:2; uint16_t is_dynamic:1; - uint16_t is_control_flow:1; _Py_BackoffCounter temperature; struct _PyExecutorObject *executor; } _PyExitData; diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 9789bc9ea2f71b..78703217bc0bae 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -44,9 +44,25 @@ def get_all_executors(func): code = func.__code__ co_code = code.co_code executors = [] + seen = set() for i in range(0, len(co_code), 2): try: - executors.append(_opcode.get_executor(code, i)) + exec = _opcode.get_executor(code, i) + if id(exec) in seen: + continue + executors.append(exec) + seen.add(id(exec)) + # Add the side exit executors as well. + ops = get_ops(exec) + for idx, op in enumerate(ops): + opname = op[0] + if opname == "_EXIT_TRACE": + exit = op[3] + link_to = _testinternalcapi.get_exit_executor(exit) + if id(link_to) in seen: + continue + executors.append(link_to) + seen.add(id(link_to)) except ValueError: pass return executors diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 19a95a08dadb77..d2373c358d9df9 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3026,27 +3026,24 @@ dummy_func( tier1 inst(ENTER_EXECUTOR, (--)) { #ifdef _Py_TIER2 - if (IS_JIT_TRACING()) { - next_instr = this_instr; - goto stop_tracing; - } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - /* If the eval breaker is set then stay in tier 1. + /* If we are tracing or + * the eval breaker is set then stay in tier 1. * This avoids any potentially infinite loops * involving _RESUME_CHECK */ - if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } - DISPATCH_GOTO(); + DISPATCH_GOTO_NON_TRACING(); } assert(executor != tstate->interp->cold_executor); tstate->jit_exit = NULL; @@ -5188,10 +5185,10 @@ dummy_func( if (frame->lltrace >= 3) { printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", + printf(", exit %tu, temp %d, target %d -> %s]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code], exit->is_control_flow); + _PyOpcode_OpName[target->op.code]); } #endif tstate->jit_exit = exit; @@ -5398,9 +5395,7 @@ dummy_func( } _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit); assert(tstate->current_executor == (PyObject *)previous_executor); - // For control-flow guards, we don't want to increase the chain depth, as those don't actually - // represent deopts but rather just normal programs! - int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow; + int chain_depth = previous_executor->vm_data.chain_depth + 1; // Note: it's safe to use target->op.arg here instead of the oparg given by EXTENDED_ARG. // The invariant in the optimizer is the deopt target always points back to the first EXTENDED_ARG. // So setting it to anything else is wrong. @@ -5618,7 +5613,9 @@ dummy_func( LEAVE_TRACING(); int err = stop_tracing_and_jit(tstate, frame); ERROR_IF(err < 0); - DISPATCH(); + // We can't use DISPATCH() here, as it may clobber oparg, + // which may have been set by a previous EXTENDED_ARG. + DISPATCH_GOTO_NON_TRACING(); } // Super instructions. Instruction deopted. There's a mismatch in what the stack expects // in the optimizer. So we have to reflect in the trace correctly. @@ -5644,19 +5641,6 @@ dummy_func( #endif } - label(stop_tracing) { -#if _Py_TIER2 - assert(IS_JIT_TRACING()); - int opcode = next_instr->op.code; - _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); - LEAVE_TRACING(); - int err = stop_tracing_and_jit(tstate, frame); - ERROR_IF(err < 0); - DISPATCH_GOTO_NON_TRACING(); -#else - Py_FatalError("JIT label executed in non-jit build."); -#endif - } // END BYTECODES // diff --git a/Python/ceval.c b/Python/ceval.c index 264b5138a78de3..8ca46fc627a3d8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1723,7 +1723,7 @@ _PyTier2Interpreter( for (;;) { uopcode = next_uop->opcode; #ifdef Py_DEBUG - if (frame->lltrace >= 3) { + if (frame->lltrace >= 4) { dump_stack(frame, stack_pointer); printf(" cache=["); dump_cache_item(_tos_cache0, 0, current_cached_values); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index e2b4e18bc88e6f..767ddac9155066 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -16233,10 +16233,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", + printf(", exit %tu, temp %d, target %d -> %s]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code], exit->is_control_flow); + _PyOpcode_OpName[target->op.code]); stack_pointer = _PyFrame_GetStackPointer(frame); } #endif @@ -16263,10 +16263,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", + printf(", exit %tu, temp %d, target %d -> %s]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code], exit->is_control_flow); + _PyOpcode_OpName[target->op.code]); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -1; } @@ -16299,10 +16299,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", + printf(", exit %tu, temp %d, target %d -> %s]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code], exit->is_control_flow); + _PyOpcode_OpName[target->op.code]); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -2; } @@ -16338,10 +16338,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", + printf(", exit %tu, temp %d, target %d -> %s]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code], exit->is_control_flow); + _PyOpcode_OpName[target->op.code]); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -3; } @@ -17772,7 +17772,7 @@ } _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit); assert(tstate->current_executor == (PyObject *)previous_executor); - int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow; + int chain_depth = previous_executor->vm_data.chain_depth + 1; int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.code, target->op.arg); exit->temperature = restart_backoff_counter(exit->temperature); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 05bf02a95cfd1b..27154c444f0c50 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5245,24 +5245,20 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 - if (IS_JIT_TRACING()) { - next_instr = this_instr; - JUMP_TO_LABEL(stop_tracing); - } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } - DISPATCH_GOTO(); + DISPATCH_GOTO_NON_TRACING(); } assert(executor != tstate->interp->cold_executor); tstate->jit_exit = NULL; @@ -11540,7 +11536,7 @@ if (err < 0) { JUMP_TO_LABEL(error); } - DISPATCH(); + DISPATCH_GOTO_NON_TRACING(); } _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; _tstate->jit_tracer_state.prev_state.instr = next_instr; @@ -12140,26 +12136,5 @@ JUMP_TO_LABEL(error); DISPATCH(); } - LABEL(stop_tracing) - { - #if _Py_TIER2 - assert(IS_JIT_TRACING()); - int opcode = next_instr->op.code; - _PyFrame_SetStackPointer(frame, stack_pointer); - _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); - stack_pointer = _PyFrame_GetStackPointer(frame); - LEAVE_TRACING(); - _PyFrame_SetStackPointer(frame, stack_pointer); - int err = stop_tracing_and_jit(tstate, frame); - stack_pointer = _PyFrame_GetStackPointer(frame); - if (err < 0) { - JUMP_TO_LABEL(error); - } - DISPATCH_GOTO_NON_TRACING(); - #else - Py_FatalError("JIT label executed in non-jit build."); - #endif - } - /* END LABELS */ #undef TIER_ONE diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index ac85b96c64141f..ee333b6736c07d 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -528,7 +528,6 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_error(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_start_frame(TAIL_CALL_PARAMS); -static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(TAIL_CALL_PARAMS); diff --git a/Python/optimizer.c b/Python/optimizer.c index 145bb0b0dcc21a..18a1038611bf61 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -589,9 +589,8 @@ add_to_trace( } static int -is_terminator(const _PyUOpInstruction *uop) +opcode_is_terminator(int opcode) { - int opcode = _PyUop_Uncached[uop->opcode]; return ( opcode == _EXIT_TRACE || opcode == _DEOPT || @@ -600,6 +599,14 @@ is_terminator(const _PyUOpInstruction *uop) ); } +static int +is_terminator(const _PyUOpInstruction *uop) +{ + int opcode = uop->opcode; + int base_opcode = _PyUop_Uncached[uop->opcode]; + return opcode_is_terminator(opcode) || opcode_is_terminator(base_opcode); +} + /* Returns 1 on success (added to trace), 0 on trace end. */ // gh-142543: inlining this function causes stack overflows @@ -663,12 +670,23 @@ _PyJit_translate_single_bytecode_to_trace( } } - int old_stack_level = _tstate->jit_tracer_state.prev_state.instr_stacklevel; - // Strange control-flow bool has_dynamic_jump_taken = OPCODE_HAS_UNPREDICTABLE_JUMP(opcode) && (next_instr != this_instr + 1 + _PyOpcode_Caches[_PyOpcode_Deopt[opcode]]); + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; + opcode = executor->vm_data.opcode; + oparg = (oparg & ~255) | executor->vm_data.oparg; + // To create longer traces, peek under and continue tracing + // function entry executors. + // For all other executors, we want to link to them. + if (opcode != RESUME_CHECK_JIT) { + ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + goto full; + } + } + /* Special case the first instruction, * so that we can guarantee forward progress */ if (progress_needed && _tstate->jit_tracer_state.prev_state.code_curr_size < CODE_SIZE_NO_PROGRESS) { @@ -677,13 +695,6 @@ _PyJit_translate_single_bytecode_to_trace( } assert(!OPCODE_HAS_EXIT(opcode)); assert(!OPCODE_HAS_DEOPT(opcode)); - // First instruction is a RESUME_CHECK_JIT and we are an ENTER_EXECUTOR. - // This might cause no progress - // and interfere with instrumentation. Skip the RESUME_CHECK_JIT - // Skip this instruction. - if (opcode == RESUME) { - return 1; - } } bool needs_guard_ip = OPCODE_HAS_NEEDS_GUARD_IP(opcode); @@ -710,7 +721,8 @@ _PyJit_translate_single_bytecode_to_trace( goto done; } - DPRINTF(2, "%p %d: %s(%d) %d %d\n", old_code, target, _PyOpcode_OpName[opcode], oparg, needs_guard_ip, old_stack_level); + DPRINTF(2, "%p %d: %s(%d) %d %d\n", old_code, target, + _PyOpcode_OpName[opcode], oparg, needs_guard_ip, _tstate->jit_tracer_state.prev_state.instr_stacklevel); #ifdef Py_DEBUG if (oparg > 255) { @@ -836,7 +848,6 @@ _PyJit_translate_single_bytecode_to_trace( // inner loop might start and let the traces rejoin. OPT_STAT_INC(inner_loop); ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); - trace[trace_length-1].operand1 = true; // is_control_flow DPRINTF(2, "JUMP_BACKWARD not to top ends trace %p %p %p\n", next_instr, _tstate->jit_tracer_state.initial_state.close_loop_instr, _tstate->jit_tracer_state.initial_state.start_instr); goto done; @@ -846,6 +857,7 @@ _PyJit_translate_single_bytecode_to_trace( case RESUME: case RESUME_CHECK: + case RESUME_CHECK_JIT: /* Use a special tier 2 version of RESUME_CHECK to allow traces to * start with RESUME_CHECK */ ADD_TO_TRACE(_TIER2_RESUME_CHECK, 0, 0, target); @@ -1008,7 +1020,6 @@ _PyJit_translate_single_bytecode_to_trace( // We previously reversed one. max_length += 1; ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); - trace[trace_length-1].operand1 = true; // is_control_flow } _tstate->jit_tracer_state.prev_state.code_curr_size = trace_length; _tstate->jit_tracer_state.prev_state.code_max_size = max_length; @@ -1142,7 +1153,7 @@ get_cached_entries_for_side_exit(_PyUOpInstruction *inst) Py_UNREACHABLE(); } -static void make_exit(_PyUOpInstruction *inst, int opcode, int target, bool is_control_flow) +static void make_exit(_PyUOpInstruction *inst, int opcode, int target) { assert(opcode > MAX_UOP_ID && opcode <= MAX_UOP_REGS_ID); inst->opcode = opcode; @@ -1150,7 +1161,6 @@ static void make_exit(_PyUOpInstruction *inst, int opcode, int target, bool is_c inst->operand0 = 0; inst->format = UOP_FORMAT_TARGET; inst->target = target; - inst->operand1 = is_control_flow; #ifdef Py_STATS inst->execution_count = 0; #endif @@ -1206,9 +1216,8 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) int exit_depth = get_cached_entries_for_side_exit(inst); assert(_PyUop_Caching[base_exit_op].entries[exit_depth].opcode > 0); int16_t exit_op = _PyUop_Caching[base_exit_op].entries[exit_depth].opcode; - bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || is_for_iter_test[base_opcode]); if (jump_target != current_jump_target || current_exit_op != exit_op) { - make_exit(&buffer[next_spare], exit_op, jump_target, is_control_flow); + make_exit(&buffer[next_spare], exit_op, jump_target); current_exit_op = exit_op; current_jump_target = jump_target; current_jump = next_spare; @@ -1224,7 +1233,7 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) current_popped = popped; current_error = next_spare; current_error_target = target; - make_exit(&buffer[next_spare], _ERROR_POP_N_r00, 0, false); + make_exit(&buffer[next_spare], _ERROR_POP_N_r00, 0); buffer[next_spare].operand0 = target; next_spare++; } @@ -1363,7 +1372,6 @@ make_executor_from_uops(_PyUOpInstruction *buffer, int length, const _PyBloomFil dest->operand0 = (uint64_t)exit; exit->executor = base_opcode == _EXIT_TRACE ? cold : cold_dynamic; exit->is_dynamic = (char)(base_opcode == _DYNAMIC_EXIT); - exit->is_control_flow = (char)buffer[i].operand1; next_exit--; } } From 86f886b3cd835d720977b360ad699adb30f6bf72 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 12:21:49 +0000 Subject: [PATCH 06/43] fix broken tests, fix EXTENDED_ARG --- Lib/test/test_sys.py | 2 +- Python/optimizer.c | 33 +++++++++++++++++---------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 04018e9603ff13..2e87e38fe5dfdc 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -2254,7 +2254,7 @@ def frame_3_jit() -> None: # 1 extra iteration for tracing. for i in range(_testinternalcapi.TIER2_THRESHOLD + 2): # Careful, doing this in the reverse order breaks tracing: - expected = {enabled} and i >= _testinternalcapi.TIER2_THRESHOLD + expected = {enabled} and i >= _testinternalcapi.TIER2_THRESHOLD + 1 assert sys._jit.is_active() is expected frame_2_jit(expected) assert sys._jit.is_active() is expected diff --git a/Python/optimizer.c b/Python/optimizer.c index 18a1038611bf61..4dab912c754d4e 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -645,12 +645,29 @@ _PyJit_translate_single_bytecode_to_trace( // We must point to the first EXTENDED_ARG when deopting. int oparg = _tstate->jit_tracer_state.prev_state.instr_oparg; int opcode = this_instr->op.code; + + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; + opcode = executor->vm_data.opcode; + oparg = (oparg & ~255) | executor->vm_data.oparg; + // To create longer traces, peek under and continue tracing + // function entry executors. + // For all other executors, we want to link to them. + if (opcode != RESUME_CHECK_JIT) { + ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + goto full; + } + } + int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; target--; } + DPRINTF(2, "%p %d: %s(%d) %d\n", old_code, target, + _PyOpcode_OpName[opcode], oparg, _tstate->jit_tracer_state.prev_state.instr_stacklevel); + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]] > 0) { uint16_t backoff = (this_instr + 1)->counter.value_and_backoff; // adaptive_counter_cooldown is a fresh specialization. @@ -674,19 +691,6 @@ _PyJit_translate_single_bytecode_to_trace( bool has_dynamic_jump_taken = OPCODE_HAS_UNPREDICTABLE_JUMP(opcode) && (next_instr != this_instr + 1 + _PyOpcode_Caches[_PyOpcode_Deopt[opcode]]); - if (opcode == ENTER_EXECUTOR) { - _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; - opcode = executor->vm_data.opcode; - oparg = (oparg & ~255) | executor->vm_data.oparg; - // To create longer traces, peek under and continue tracing - // function entry executors. - // For all other executors, we want to link to them. - if (opcode != RESUME_CHECK_JIT) { - ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); - goto full; - } - } - /* Special case the first instruction, * so that we can guarantee forward progress */ if (progress_needed && _tstate->jit_tracer_state.prev_state.code_curr_size < CODE_SIZE_NO_PROGRESS) { @@ -721,9 +725,6 @@ _PyJit_translate_single_bytecode_to_trace( goto done; } - DPRINTF(2, "%p %d: %s(%d) %d %d\n", old_code, target, - _PyOpcode_OpName[opcode], oparg, needs_guard_ip, _tstate->jit_tracer_state.prev_state.instr_stacklevel); - #ifdef Py_DEBUG if (oparg > 255) { assert(_Py_GetBaseCodeUnit(old_code, target).op.code == EXTENDED_ARG); From 2304a2d2c8cab42fb02e08575bb8028eb58a2d37 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 12:34:21 +0000 Subject: [PATCH 07/43] Fix another bug --- Python/optimizer_bytecodes.c | 6 ------ Python/optimizer_cases.c.h | 5 ----- 2 files changed, 11 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 3e37cb81388ae0..9cbf02cfd3c128 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -966,12 +966,6 @@ dummy_func(void) { // handled by the tracer. ctx->frame->func = func; } - // Fixed calls don't need IP guards. - if ((this_instr-1)->opcode == _SAVE_RETURN_OFFSET || - (this_instr-1)->opcode == _CREATE_INIT_FRAME) { - assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); - REPLACE_OP(this_instr+1, _NOP, 0, 0); - } } op(_UNPACK_SEQUENCE, (seq -- values[oparg], top[0])) { diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index b043a9493cbd7c..cc1b6e30a5a54d 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2572,11 +2572,6 @@ PyFunctionObject *func = (PyFunctionObject *)operand; ctx->frame->func = func; } - if ((this_instr-1)->opcode == _SAVE_RETURN_OFFSET || - (this_instr-1)->opcode == _CREATE_INIT_FRAME) { - assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); - REPLACE_OP(this_instr+1, _NOP, 0, 0); - } break; } From 6b65f760ee772209e5c7fe2ad051551542abf149 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 13:12:34 +0000 Subject: [PATCH 08/43] link everythihng --- Python/optimizer.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Python/optimizer.c b/Python/optimizer.c index 4dab912c754d4e..497900fb4be591 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -647,16 +647,7 @@ _PyJit_translate_single_bytecode_to_trace( int opcode = this_instr->op.code; if (opcode == ENTER_EXECUTOR) { - _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; - opcode = executor->vm_data.opcode; - oparg = (oparg & ~255) | executor->vm_data.oparg; - // To create longer traces, peek under and continue tracing - // function entry executors. - // For all other executors, we want to link to them. - if (opcode != RESUME_CHECK_JIT) { - ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); - goto full; - } + goto full; } int rewind_oparg = oparg; From d84384d8fee0ccb4dad5c2249627188859a98221 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 13:15:48 +0000 Subject: [PATCH 09/43] Revert "link everythihng" This reverts commit 6b65f760ee772209e5c7fe2ad051551542abf149. --- Python/optimizer.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Python/optimizer.c b/Python/optimizer.c index 497900fb4be591..4dab912c754d4e 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -647,7 +647,16 @@ _PyJit_translate_single_bytecode_to_trace( int opcode = this_instr->op.code; if (opcode == ENTER_EXECUTOR) { - goto full; + _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; + opcode = executor->vm_data.opcode; + oparg = (oparg & ~255) | executor->vm_data.oparg; + // To create longer traces, peek under and continue tracing + // function entry executors. + // For all other executors, we want to link to them. + if (opcode != RESUME_CHECK_JIT) { + ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + goto full; + } } int rewind_oparg = oparg; From e29ced3a494c153c4cd699786e4409e52dd18110 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 15:06:00 +0000 Subject: [PATCH 10/43] add back is_control_flow --- Include/internal/pycore_optimizer.h | 3 ++- Python/bytecodes.c | 6 +++--- Python/executor_cases.c.h | 18 +++++++++--------- Python/optimizer.c | 23 +++++++++++++++-------- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index 318918e8f458b1..eb88f3fa6624eb 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -36,9 +36,10 @@ typedef struct { typedef struct _PyExitData { uint32_t target; - uint16_t index:13; + uint16_t index:12; uint16_t stack_cache:2; uint16_t is_dynamic:1; + uint16_t is_control_flow:1; _Py_BackoffCounter temperature; struct _PyExecutorObject *executor; } _PyExitData; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index d2373c358d9df9..9192c37c388100 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5185,10 +5185,10 @@ dummy_func( if (frame->lltrace >= 3) { printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s]\n", + printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code]); + _PyOpcode_OpName[target->op.code], exit->is_control_flow); } #endif tstate->jit_exit = exit; @@ -5395,7 +5395,7 @@ dummy_func( } _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit); assert(tstate->current_executor == (PyObject *)previous_executor); - int chain_depth = previous_executor->vm_data.chain_depth + 1; + int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow; // Note: it's safe to use target->op.arg here instead of the oparg given by EXTENDED_ARG. // The invariant in the optimizer is the deopt target always points back to the first EXTENDED_ARG. // So setting it to anything else is wrong. diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 767ddac9155066..e2b4e18bc88e6f 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -16233,10 +16233,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s]\n", + printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code]); + _PyOpcode_OpName[target->op.code], exit->is_control_flow); stack_pointer = _PyFrame_GetStackPointer(frame); } #endif @@ -16263,10 +16263,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s]\n", + printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code]); + _PyOpcode_OpName[target->op.code], exit->is_control_flow); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -1; } @@ -16299,10 +16299,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s]\n", + printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code]); + _PyOpcode_OpName[target->op.code], exit->is_control_flow); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -2; } @@ -16338,10 +16338,10 @@ _PyFrame_SetStackPointer(frame, stack_pointer); printf("SIDE EXIT: [UOp "); _PyUOpPrint(&next_uop[-1]); - printf(", exit %tu, temp %d, target %d -> %s]\n", + printf(", exit %tu, temp %d, target %d -> %s, is_control_flow %d]\n", exit - current_executor->exits, exit->temperature.value_and_backoff, (int)(target - _PyFrame_GetBytecode(frame)), - _PyOpcode_OpName[target->op.code]); + _PyOpcode_OpName[target->op.code], exit->is_control_flow); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -3; } @@ -17772,7 +17772,7 @@ } _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit); assert(tstate->current_executor == (PyObject *)previous_executor); - int chain_depth = previous_executor->vm_data.chain_depth + 1; + int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow; int succ = _PyJit_TryInitializeTracing(tstate, frame, target, target, target, STACK_LEVEL(), chain_depth, exit, target->op.code, target->op.arg); exit->temperature = restart_backoff_counter(exit->temperature); diff --git a/Python/optimizer.c b/Python/optimizer.c index 4dab912c754d4e..19a6a82279b2bd 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -655,6 +655,7 @@ _PyJit_translate_single_bytecode_to_trace( // For all other executors, we want to link to them. if (opcode != RESUME_CHECK_JIT) { ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + trace[trace_length-1].operand1 = true; // is_control_flow goto full; } } @@ -719,11 +720,8 @@ _PyJit_translate_single_bytecode_to_trace( DPRINTF(2, "Told to stop tracing\n"); goto unsupported; } - else if (stop_tracing_opcode != 0) { - assert(stop_tracing_opcode == _EXIT_TRACE); - ADD_TO_TRACE(stop_tracing_opcode, 0, 0, target); - goto done; - } + + assert(stop_tracing_opcode == 0); #ifdef Py_DEBUG if (oparg > 255) { @@ -849,6 +847,7 @@ _PyJit_translate_single_bytecode_to_trace( // inner loop might start and let the traces rejoin. OPT_STAT_INC(inner_loop); ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + trace[trace_length-1].operand1 = true; // is_control_flow DPRINTF(2, "JUMP_BACKWARD not to top ends trace %p %p %p\n", next_instr, _tstate->jit_tracer_state.initial_state.close_loop_instr, _tstate->jit_tracer_state.initial_state.start_instr); goto done; @@ -1021,6 +1020,7 @@ _PyJit_translate_single_bytecode_to_trace( // We previously reversed one. max_length += 1; ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + trace[trace_length-1].operand1 = true; // is_control_flow } _tstate->jit_tracer_state.prev_state.code_curr_size = trace_length; _tstate->jit_tracer_state.prev_state.code_max_size = max_length; @@ -1154,7 +1154,7 @@ get_cached_entries_for_side_exit(_PyUOpInstruction *inst) Py_UNREACHABLE(); } -static void make_exit(_PyUOpInstruction *inst, int opcode, int target) +static void make_exit(_PyUOpInstruction *inst, int opcode, int target, bool is_control_flow) { assert(opcode > MAX_UOP_ID && opcode <= MAX_UOP_REGS_ID); inst->opcode = opcode; @@ -1162,6 +1162,7 @@ static void make_exit(_PyUOpInstruction *inst, int opcode, int target) inst->operand0 = 0; inst->format = UOP_FORMAT_TARGET; inst->target = target; + inst->operand1 = is_control_flow; #ifdef Py_STATS inst->execution_count = 0; #endif @@ -1217,8 +1218,13 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) int exit_depth = get_cached_entries_for_side_exit(inst); assert(_PyUop_Caching[base_exit_op].entries[exit_depth].opcode > 0); int16_t exit_op = _PyUop_Caching[base_exit_op].entries[exit_depth].opcode; + bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || + base_opcode == _GUARD_IS_TRUE_POP || + base_opcode == _GUARD_IS_NONE_POP || + base_opcode == _GUARD_IS_NOT_NONE_POP || + is_for_iter_test[base_opcode]); if (jump_target != current_jump_target || current_exit_op != exit_op) { - make_exit(&buffer[next_spare], exit_op, jump_target); + make_exit(&buffer[next_spare], exit_op, jump_target, is_control_flow); current_exit_op = exit_op; current_jump_target = jump_target; current_jump = next_spare; @@ -1234,7 +1240,7 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) current_popped = popped; current_error = next_spare; current_error_target = target; - make_exit(&buffer[next_spare], _ERROR_POP_N_r00, 0); + make_exit(&buffer[next_spare], _ERROR_POP_N_r00, 0, false); buffer[next_spare].operand0 = target; next_spare++; } @@ -1373,6 +1379,7 @@ make_executor_from_uops(_PyUOpInstruction *buffer, int length, const _PyBloomFil dest->operand0 = (uint64_t)exit; exit->executor = base_opcode == _EXIT_TRACE ? cold : cold_dynamic; exit->is_dynamic = (char)(base_opcode == _DYNAMIC_EXIT); + exit->is_control_flow = (char)buffer[i].operand1; next_exit--; } } From 6bbd9ccaca08c5ed356ae9ee119a4bca767c4358 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 15:39:40 +0000 Subject: [PATCH 11/43] undo changes, turn off RESUME tracing for now --- Include/internal/pycore_opcode_metadata.h | 3 +- Python/bytecodes.c | 21 ++++- Python/generated_cases.c.h | 100 ++++++++++------------ Python/opcode_targets.h | 1 + Python/optimizer.c | 19 ++-- 5 files changed, 73 insertions(+), 71 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index e27c261cf2653d..5237d0e53b1ecd 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1267,7 +1267,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RESERVED] = { true, INSTR_FMT_IX, 0 }, [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, - [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [RESUME_CHECK_JIT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, @@ -1479,6 +1479,7 @@ _PyOpcode_macro_expansion[256] = { [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { _PUSH_EXC_INFO, OPARG_SIMPLE, 0 } } }, [PUSH_NULL] = { .nuops = 1, .uops = { { _PUSH_NULL, OPARG_SIMPLE, 0 } } }, [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 1 } } }, + [RESUME_CHECK_JIT] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 1 } } }, [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } }, [RETURN_VALUE] = { .nuops = 1, .uops = { { _RETURN_VALUE, OPARG_SIMPLE, 0 } } }, [SEND_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _SEND_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } }, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 9192c37c388100..379aef8a41abae 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -247,8 +247,7 @@ dummy_func( macro(RESUME_CHECK_JIT) = unused/1 + - _RESUME_CHECK + - _JIT; + _RESUME_CHECK; op(_MONITOR_RESUME, (--)) { int err = _Py_call_instrumentation( @@ -3026,6 +3025,10 @@ dummy_func( tier1 inst(ENTER_EXECUTOR, (--)) { #ifdef _Py_TIER2 + if (IS_JIT_TRACING()) { + next_instr = this_instr; + goto stop_tracing; + } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); @@ -5641,7 +5644,19 @@ dummy_func( #endif } - + label(stop_tracing) { +#if _Py_TIER2 + assert(IS_JIT_TRACING()); + int opcode = next_instr->op.code; + _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); + LEAVE_TRACING(); + int err = stop_tracing_and_jit(tstate, frame); + ERROR_IF(err < 0); + DISPATCH_GOTO_NON_TRACING(); +#else + Py_FatalError("JIT label executed in non-jit build."); +#endif + } // END BYTECODES // diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 27154c444f0c50..a94d5908c45ee9 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5245,6 +5245,10 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 + if (IS_JIT_TRACING()) { + next_instr = this_instr; + JUMP_TO_LABEL(stop_tracing); + } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); @@ -10026,63 +10030,32 @@ frame->instr_ptr = next_instr; next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK_JIT); - opcode = RESUME_CHECK_JIT; static_assert(1 == 1, "incorrect cache size"); /* Skip 1 cache entry */ - // _RESUME_CHECK - { - #if defined(__EMSCRIPTEN__) - if (_Py_emscripten_signal_clock == 0) { - UPDATE_MISS_STATS(RESUME); - assert(_PyOpcode_Deopt[opcode] == (RESUME)); - JUMP_TO_PREDICTED(RESUME); - } - _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; - #endif - uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); - uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); - assert((version & _PY_EVAL_EVENTS_MASK) == 0); - if (eval_breaker != version) { - UPDATE_MISS_STATS(RESUME); - assert(_PyOpcode_Deopt[opcode] == (RESUME)); - JUMP_TO_PREDICTED(RESUME); - } - #ifdef Py_GIL_DISABLED - if (frame->tlbc_index != - ((_PyThreadStateImpl *)tstate)->tlbc_index) { - UPDATE_MISS_STATS(RESUME); - assert(_PyOpcode_Deopt[opcode] == (RESUME)); - JUMP_TO_PREDICTED(RESUME); - } - #endif + #if defined(__EMSCRIPTEN__) + if (_Py_emscripten_signal_clock == 0) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); } - // _JIT - { - #ifdef _Py_TIER2 - _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || - this_instr->op.code == RESUME_CHECK_JIT) && - next_instr->op.code != ENTER_EXECUTOR) { - _Py_CODEUNIT *insert_exec_at = this_instr; - while (oparg > 255) { - oparg >>= 8; - insert_exec_at--; - } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, - STACK_LEVEL(), 0, NULL, opcode, oparg); - if (succ) { - ENTER_TRACING(); - } - else { - this_instr[1].counter = restart_backoff_counter(counter); - } - } - else { - ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); - } - #endif + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + #endif + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); + if (eval_breaker != version) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); } + #ifdef Py_GIL_DISABLED + if (frame->tlbc_index != + ((_PyThreadStateImpl *)tstate)->tlbc_index) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #endif DISPATCH(); } @@ -12136,5 +12109,26 @@ JUMP_TO_LABEL(error); DISPATCH(); } + LABEL(stop_tracing) + { + #if _Py_TIER2 + assert(IS_JIT_TRACING()); + int opcode = next_instr->op.code; + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); + stack_pointer = _PyFrame_GetStackPointer(frame); + LEAVE_TRACING(); + _PyFrame_SetStackPointer(frame, stack_pointer); + int err = stop_tracing_and_jit(tstate, frame); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (err < 0) { + JUMP_TO_LABEL(error); + } + DISPATCH_GOTO_NON_TRACING(); + #else + Py_FatalError("JIT label executed in non-jit build."); + #endif + } + /* END LABELS */ #undef TIER_ONE diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index ee333b6736c07d..ac85b96c64141f 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -528,6 +528,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_error(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_start_frame(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(TAIL_CALL_PARAMS); diff --git a/Python/optimizer.c b/Python/optimizer.c index 19a6a82279b2bd..a315b33e573e6a 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -646,20 +646,6 @@ _PyJit_translate_single_bytecode_to_trace( int oparg = _tstate->jit_tracer_state.prev_state.instr_oparg; int opcode = this_instr->op.code; - if (opcode == ENTER_EXECUTOR) { - _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; - opcode = executor->vm_data.opcode; - oparg = (oparg & ~255) | executor->vm_data.oparg; - // To create longer traces, peek under and continue tracing - // function entry executors. - // For all other executors, we want to link to them. - if (opcode != RESUME_CHECK_JIT) { - ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); - trace[trace_length-1].operand1 = true; // is_control_flow - goto full; - } - } - int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; @@ -720,6 +706,11 @@ _PyJit_translate_single_bytecode_to_trace( DPRINTF(2, "Told to stop tracing\n"); goto unsupported; } + else if (stop_tracing_opcode != 0) { + assert(stop_tracing_opcode == _EXIT_TRACE); + ADD_TO_TRACE(stop_tracing_opcode, 0, 0, target); + goto done; + } assert(stop_tracing_opcode == 0); From a4e3e5fd2ceefa67dacfc70b9982513f4de1c20c Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 16:00:01 +0000 Subject: [PATCH 12/43] temporary --- Include/internal/pycore_uop.h | 2 +- Python/bytecodes.c | 7 ++++--- Python/generated_cases.c.h | 2 +- Python/optimizer.c | 6 +----- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Include/internal/pycore_uop.h b/Include/internal/pycore_uop.h index e828a1cc5a5722..2a0e6597831c07 100644 --- a/Include/internal/pycore_uop.h +++ b/Include/internal/pycore_uop.h @@ -36,7 +36,7 @@ typedef struct _PyUOpInstruction{ } _PyUOpInstruction; // This is the length of the trace we translate initially. -#ifdef Py_DEBUG +#if defined(Py_DEBUG) && defined(_Py_JIT) // With asserts, the stencils are a lot larger #define UOP_MAX_TRACE_LENGTH 2000 #else diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 379aef8a41abae..a5b017d6fef02c 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3035,11 +3035,10 @@ dummy_func( assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - /* If we are tracing or - * the eval breaker is set then stay in tier 1. + /* If the eval breaker is set then stay in tier 1. * This avoids any potentially infinite loops * involving _RESUME_CHECK */ - if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; @@ -5398,6 +5397,8 @@ dummy_func( } _PyExecutorObject *previous_executor = _PyExecutor_FromExit(exit); assert(tstate->current_executor == (PyObject *)previous_executor); + // For control-flow guards, we don't want to increase the chain depth, as those don't actually + // represent deopts but rather just normal programs! int chain_depth = previous_executor->vm_data.chain_depth + !exit->is_control_flow; // Note: it's safe to use target->op.arg here instead of the oparg given by EXTENDED_ARG. // The invariant in the optimizer is the deopt target always points back to the first EXTENDED_ARG. diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index a94d5908c45ee9..cb585748c6b8f5 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5255,7 +5255,7 @@ assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; diff --git a/Python/optimizer.c b/Python/optimizer.c index a315b33e573e6a..e0113104ccec8a 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1209,11 +1209,7 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) int exit_depth = get_cached_entries_for_side_exit(inst); assert(_PyUop_Caching[base_exit_op].entries[exit_depth].opcode > 0); int16_t exit_op = _PyUop_Caching[base_exit_op].entries[exit_depth].opcode; - bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || - base_opcode == _GUARD_IS_TRUE_POP || - base_opcode == _GUARD_IS_NONE_POP || - base_opcode == _GUARD_IS_NOT_NONE_POP || - is_for_iter_test[base_opcode]); + bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || is_for_iter_test[base_opcode]); if (jump_target != current_jump_target || current_exit_op != exit_op) { make_exit(&buffer[next_spare], exit_op, jump_target, is_control_flow); current_exit_op = exit_op; From ff0e9f020fd24dc880d9706f571137168986da18 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 16:32:37 +0000 Subject: [PATCH 13/43] reduce diff --- Python/optimizer.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Python/optimizer.c b/Python/optimizer.c index e0113104ccec8a..3fb9d94c5f9809 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1085,6 +1085,9 @@ _PyJit_TryInitializeTracing( _tstate->jit_tracer_state.initial_state.trace_enter_instr = curr_instr; _tstate->jit_tracer_state.initial_state.trace_origin_opcode = opcode; + if (_PyOpcode_Caches[_PyOpcode_Deopt[close_loop_instr->op.code]]) { + close_loop_instr[1].counter = trigger_backoff_counter(); + } _Py_BloomFilter_Init(&_tstate->jit_tracer_state.prev_state.dependencies); return 1; } From 90e76f8e56204730283c760a3f47b6b3644d6180 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 16:42:49 +0000 Subject: [PATCH 14/43] add back _JIT (still off) --- Include/internal/pycore_opcode_metadata.h | 3 +- Python/bytecodes.c | 6 +- Python/generated_cases.c.h | 77 ++++++++++++++++------- 3 files changed, 57 insertions(+), 29 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 5237d0e53b1ecd..e27c261cf2653d 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1267,7 +1267,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RESERVED] = { true, INSTR_FMT_IX, 0 }, [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, - [RESUME_CHECK_JIT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, + [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, @@ -1479,7 +1479,6 @@ _PyOpcode_macro_expansion[256] = { [PUSH_EXC_INFO] = { .nuops = 1, .uops = { { _PUSH_EXC_INFO, OPARG_SIMPLE, 0 } } }, [PUSH_NULL] = { .nuops = 1, .uops = { { _PUSH_NULL, OPARG_SIMPLE, 0 } } }, [RESUME_CHECK] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 1 } } }, - [RESUME_CHECK_JIT] = { .nuops = 1, .uops = { { _RESUME_CHECK, OPARG_SIMPLE, 1 } } }, [RETURN_GENERATOR] = { .nuops = 1, .uops = { { _RETURN_GENERATOR, OPARG_SIMPLE, 0 } } }, [RETURN_VALUE] = { .nuops = 1, .uops = { { _RETURN_VALUE, OPARG_SIMPLE, 0 } } }, [SEND_GEN] = { .nuops = 3, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _SEND_GEN_FRAME, OPARG_SIMPLE, 1 }, { _PUSH_FRAME, OPARG_SIMPLE, 1 } } }, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index a5b017d6fef02c..3aad867a14b085 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -247,7 +247,8 @@ dummy_func( macro(RESUME_CHECK_JIT) = unused/1 + - _RESUME_CHECK; + _RESUME_CHECK + + _JIT; op(_MONITOR_RESUME, (--)) { int err = _Py_call_instrumentation( @@ -2964,8 +2965,7 @@ dummy_func( #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || - this_instr->op.code == RESUME_CHECK_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index cb585748c6b8f5..0178fe27240699 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7306,8 +7306,7 @@ #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || - this_instr->op.code == RESUME_CHECK_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { @@ -10030,32 +10029,62 @@ frame->instr_ptr = next_instr; next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK_JIT); + opcode = RESUME_CHECK_JIT; static_assert(1 == 1, "incorrect cache size"); /* Skip 1 cache entry */ - #if defined(__EMSCRIPTEN__) - if (_Py_emscripten_signal_clock == 0) { - UPDATE_MISS_STATS(RESUME); - assert(_PyOpcode_Deopt[opcode] == (RESUME)); - JUMP_TO_PREDICTED(RESUME); - } - _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; - #endif - uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); - uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); - assert((version & _PY_EVAL_EVENTS_MASK) == 0); - if (eval_breaker != version) { - UPDATE_MISS_STATS(RESUME); - assert(_PyOpcode_Deopt[opcode] == (RESUME)); - JUMP_TO_PREDICTED(RESUME); + // _RESUME_CHECK + { + #if defined(__EMSCRIPTEN__) + if (_Py_emscripten_signal_clock == 0) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + #endif + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); + if (eval_breaker != version) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #ifdef Py_GIL_DISABLED + if (frame->tlbc_index != + ((_PyThreadStateImpl *)tstate)->tlbc_index) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #endif } - #ifdef Py_GIL_DISABLED - if (frame->tlbc_index != - ((_PyThreadStateImpl *)tstate)->tlbc_index) { - UPDATE_MISS_STATS(RESUME); - assert(_PyOpcode_Deopt[opcode] == (RESUME)); - JUMP_TO_PREDICTED(RESUME); + // _JIT + { + #ifdef _Py_TIER2 + _Py_BackoffCounter counter = this_instr[1].counter; + if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && + (this_instr->op.code == JUMP_BACKWARD_JIT) && + next_instr->op.code != ENTER_EXECUTOR) { + _Py_CODEUNIT *insert_exec_at = this_instr; + while (oparg > 255) { + oparg >>= 8; + insert_exec_at--; + } + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, + STACK_LEVEL(), 0, NULL, opcode, oparg); + if (succ) { + ENTER_TRACING(); + } + else { + this_instr[1].counter = restart_backoff_counter(counter); + } + } + else { + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + #endif } - #endif DISPATCH(); } From 81aa269daa1b1422d75d33d280c98fc423371fee Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 17:21:52 +0000 Subject: [PATCH 15/43] restore RESUME_CHECK_JIT jitting --- Python/bytecodes.c | 2 +- Python/generated_cases.c.h | 4 ++-- Python/optimizer.c | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 3aad867a14b085..22e54ea6660338 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2965,7 +2965,7 @@ dummy_func( #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || this_instr->op.code == RESUME_CHECK_JIT) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 0178fe27240699..2c65cd95a60d59 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7306,7 +7306,7 @@ #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || this_instr->op.code == RESUME_CHECK_JIT) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { @@ -10064,7 +10064,7 @@ #ifdef _Py_TIER2 _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || this_instr->op.code == RESUME_CHECK_JIT) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { diff --git a/Python/optimizer.c b/Python/optimizer.c index 3fb9d94c5f9809..ac42bc38323c91 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1212,7 +1212,10 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) int exit_depth = get_cached_entries_for_side_exit(inst); assert(_PyUop_Caching[base_exit_op].entries[exit_depth].opcode > 0); int16_t exit_op = _PyUop_Caching[base_exit_op].entries[exit_depth].opcode; - bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || is_for_iter_test[base_opcode]); + // Note: The for loop guards are not in here, as we don't want to interfere with other loop tracing the + // exhausted iteration. + bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || + base_opcode == _GUARD_IS_NONE_POP || base_opcode == _GUARD_IS_NOT_NONE_POP || is_for_iter_test[base_opcode]); if (jump_target != current_jump_target || current_exit_op != exit_op) { make_exit(&buffer[next_spare], exit_op, jump_target, is_control_flow); current_exit_op = exit_op; From d52a10667d95fc049b3ba61d2c48f76a4aa614a8 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 18:17:52 +0000 Subject: [PATCH 16/43] only link up traces when they're backwards jumps --- Python/bytecodes.c | 6 +----- Python/generated_cases.c.h | 6 +----- Python/optimizer.c | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 22e54ea6660338..5f908954d91c35 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3025,10 +3025,6 @@ dummy_func( tier1 inst(ENTER_EXECUTOR, (--)) { #ifdef _Py_TIER2 - if (IS_JIT_TRACING()) { - next_instr = this_instr; - goto stop_tracing; - } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); @@ -3038,7 +3034,7 @@ dummy_func( /* If the eval breaker is set then stay in tier 1. * This avoids any potentially infinite loops * involving _RESUME_CHECK */ - if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 2c65cd95a60d59..8947038acd049c 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5245,17 +5245,13 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 - if (IS_JIT_TRACING()) { - next_instr = this_instr; - JUMP_TO_LABEL(stop_tracing); - } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; diff --git a/Python/optimizer.c b/Python/optimizer.c index ac42bc38323c91..234d48ce6ec605 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -646,6 +646,18 @@ _PyJit_translate_single_bytecode_to_trace( int oparg = _tstate->jit_tracer_state.prev_state.instr_oparg; int opcode = this_instr->op.code; + + // Peek under the executor to form a longer trace. + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *executor = old_code->co_executors->executors[this_instr->op.arg]; + opcode = executor->vm_data.opcode; + oparg = (oparg & ~255) | executor->vm_data.oparg; + // Except for when it's a backwards jump executor, we want to link to those. + if (opcode == JUMP_BACKWARD_JIT) { + goto full; + } + } + int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; @@ -1212,8 +1224,6 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) int exit_depth = get_cached_entries_for_side_exit(inst); assert(_PyUop_Caching[base_exit_op].entries[exit_depth].opcode > 0); int16_t exit_op = _PyUop_Caching[base_exit_op].entries[exit_depth].opcode; - // Note: The for loop guards are not in here, as we don't want to interfere with other loop tracing the - // exhausted iteration. bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || base_opcode == _GUARD_IS_NONE_POP || base_opcode == _GUARD_IS_NOT_NONE_POP || is_for_iter_test[base_opcode]); if (jump_target != current_jump_target || current_exit_op != exit_op) { From 32334235fb1213b42a2d6a1410e73ec2d556be40 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 19:55:11 +0000 Subject: [PATCH 17/43] stop tracing when we hit an ENTER_EXECUTOR --- Python/bytecodes.c | 6 +++++- Python/generated_cases.c.h | 6 +++++- Python/optimizer.c | 12 ------------ 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 5f908954d91c35..22e54ea6660338 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3025,6 +3025,10 @@ dummy_func( tier1 inst(ENTER_EXECUTOR, (--)) { #ifdef _Py_TIER2 + if (IS_JIT_TRACING()) { + next_instr = this_instr; + goto stop_tracing; + } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); @@ -3034,7 +3038,7 @@ dummy_func( /* If the eval breaker is set then stay in tier 1. * This avoids any potentially infinite loops * involving _RESUME_CHECK */ - if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 8947038acd049c..2c65cd95a60d59 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5245,13 +5245,17 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 + if (IS_JIT_TRACING()) { + next_instr = this_instr; + JUMP_TO_LABEL(stop_tracing); + } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - if (IS_JIT_TRACING() || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; diff --git a/Python/optimizer.c b/Python/optimizer.c index 234d48ce6ec605..859077be25bedc 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -646,18 +646,6 @@ _PyJit_translate_single_bytecode_to_trace( int oparg = _tstate->jit_tracer_state.prev_state.instr_oparg; int opcode = this_instr->op.code; - - // Peek under the executor to form a longer trace. - if (opcode == ENTER_EXECUTOR) { - _PyExecutorObject *executor = old_code->co_executors->executors[this_instr->op.arg]; - opcode = executor->vm_data.opcode; - oparg = (oparg & ~255) | executor->vm_data.oparg; - // Except for when it's a backwards jump executor, we want to link to those. - if (opcode == JUMP_BACKWARD_JIT) { - goto full; - } - } - int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; From e4e1cc0ce7605112aef6181c613e0f3442dd6a85 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 20:20:00 +0000 Subject: [PATCH 18/43] re-enable old opt --- Python/optimizer_bytecodes.c | 6 ++++++ Python/optimizer_cases.c.h | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 9cbf02cfd3c128..22f9e690f44f01 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -966,6 +966,12 @@ dummy_func(void) { // handled by the tracer. ctx->frame->func = func; } + // Fixed calls don't need IP guards. + if ((this_instr-2)->opcode == _INIT_CALL_PY_EXACT_ARGS || + (this_instr-1)->opcode == _CREATE_INIT_FRAME) { + assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); + REPLACE_OP(this_instr+1, _NOP, 0, 0); + } } op(_UNPACK_SEQUENCE, (seq -- values[oparg], top[0])) { diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index cc1b6e30a5a54d..f933a7dcb957c2 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2572,6 +2572,11 @@ PyFunctionObject *func = (PyFunctionObject *)operand; ctx->frame->func = func; } + if ((this_instr-2)->opcode == _INIT_CALL_PY_EXACT_ARGS || + (this_instr-1)->opcode == _CREATE_INIT_FRAME) { + assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); + REPLACE_OP(this_instr+1, _NOP, 0, 0); + } break; } From 19f390a007bf99a7850565a535b9c4f43e163326 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 20:22:28 +0000 Subject: [PATCH 19/43] partially disable opt --- Python/optimizer_bytecodes.c | 3 +-- Python/optimizer_cases.c.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 22f9e690f44f01..7c838fdc037418 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -967,8 +967,7 @@ dummy_func(void) { ctx->frame->func = func; } // Fixed calls don't need IP guards. - if ((this_instr-2)->opcode == _INIT_CALL_PY_EXACT_ARGS || - (this_instr-1)->opcode == _CREATE_INIT_FRAME) { + if ((this_instr-1)->opcode == _CREATE_INIT_FRAME) { assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); REPLACE_OP(this_instr+1, _NOP, 0, 0); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index f933a7dcb957c2..bf6af0b8bbd7a5 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2572,8 +2572,7 @@ PyFunctionObject *func = (PyFunctionObject *)operand; ctx->frame->func = func; } - if ((this_instr-2)->opcode == _INIT_CALL_PY_EXACT_ARGS || - (this_instr-1)->opcode == _CREATE_INIT_FRAME) { + if ((this_instr-1)->opcode == _CREATE_INIT_FRAME) { assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); REPLACE_OP(this_instr+1, _NOP, 0, 0); } From be252440c2462f5f750086c593f467c09a90fae8 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 20:29:28 +0000 Subject: [PATCH 20/43] formatting fix --- Python/optimizer_bytecodes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 7c838fdc037418..514f43551722d3 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -970,7 +970,7 @@ dummy_func(void) { if ((this_instr-1)->opcode == _CREATE_INIT_FRAME) { assert((this_instr+1)->opcode == _GUARD_IP__PUSH_FRAME); REPLACE_OP(this_instr+1, _NOP, 0, 0); - } + } } op(_UNPACK_SEQUENCE, (seq -- values[oparg], top[0])) { From 98c21be7bd54414d132856fdf00903c188372a9b Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 20:57:48 +0000 Subject: [PATCH 21/43] fix an off-by-one --- Lib/test/test_sys.py | 2 +- Python/bytecodes.c | 6 ++---- Python/generated_cases.c.h | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 2e87e38fe5dfdc..04018e9603ff13 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -2254,7 +2254,7 @@ def frame_3_jit() -> None: # 1 extra iteration for tracing. for i in range(_testinternalcapi.TIER2_THRESHOLD + 2): # Careful, doing this in the reverse order breaks tracing: - expected = {enabled} and i >= _testinternalcapi.TIER2_THRESHOLD + 1 + expected = {enabled} and i >= _testinternalcapi.TIER2_THRESHOLD assert sys._jit.is_active() is expected frame_2_jit(expected) assert sys._jit.is_active() is expected diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 22e54ea6660338..6f6f152604b6e1 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5616,10 +5616,8 @@ dummy_func( if (full) { LEAVE_TRACING(); int err = stop_tracing_and_jit(tstate, frame); - ERROR_IF(err < 0); - // We can't use DISPATCH() here, as it may clobber oparg, - // which may have been set by a previous EXTENDED_ARG. - DISPATCH_GOTO_NON_TRACING(); + ERROR_IF(err < 0);. + DISPATCH(); } // Super instructions. Instruction deopted. There's a mismatch in what the stack expects // in the optimizer. So we have to reflect in the trace correctly. diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 2c65cd95a60d59..f5754c446d7a7d 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -11538,7 +11538,7 @@ if (err < 0) { JUMP_TO_LABEL(error); } - DISPATCH_GOTO_NON_TRACING(); + DISPATCH(); } _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate; _tstate->jit_tracer_state.prev_state.instr = next_instr; From dc0c71c3bcc64e87fdceed250dd6a43c741e2452 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 21:04:56 +0000 Subject: [PATCH 22/43] format --- Python/bytecodes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 6f6f152604b6e1..90868cabcccade 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5616,7 +5616,7 @@ dummy_func( if (full) { LEAVE_TRACING(); int err = stop_tracing_and_jit(tstate, frame); - ERROR_IF(err < 0);. + ERROR_IF(err < 0); DISPATCH(); } // Super instructions. Instruction deopted. There's a mismatch in what the stack expects From 73681afee0c127db02b3a8bb0a48453773c1b49d Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Tue, 30 Dec 2025 21:21:53 +0000 Subject: [PATCH 23/43] up the resume initial value a little --- Include/internal/pycore_backoff.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h index 9cb62bccb21435..94bf24d43a877b 100644 --- a/Include/internal/pycore_backoff.h +++ b/Include/internal/pycore_backoff.h @@ -137,7 +137,7 @@ initial_jump_backoff_counter(void) // The reasoning is that we always want loop traces to form and inline // functions before functions themselves warm up and link to them instead // of inlining. -#define RESUME_INITIAL_VALUE 7917 +#define RESUME_INITIAL_VALUE 8190 #define RESUME_INITIAL_BACKOFF 6 static inline _Py_BackoffCounter initial_resume_backoff_counter(void) From 55cf943ed46c3881b0be3783582666abd3d375bf Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 00:04:31 +0000 Subject: [PATCH 24/43] fix RESUME slowness --- Include/internal/pycore_code.h | 1 + Include/internal/pycore_uop_ids.h | 1589 ++++++++++++++--------------- Lib/test/test_dis.py | 17 +- Python/bytecodes.c | 31 +- Python/executor_cases.c.h | 2 - Python/generated_cases.c.h | 33 +- Python/optimizer_cases.c.h | 2 - Python/specialize.c | 20 + 8 files changed, 870 insertions(+), 825 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index cb9c0aa27a1785..eb6cef4967d107 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -326,6 +326,7 @@ PyAPI_FUNC(void) _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_GatherStats_GetIter(_PyStackRef iterable); +PyAPI_FUNC(void) _Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate); // Utility functions for reading/writing 32/64-bit values in the inline caches. // Great care should be taken to ensure that these functions remain correct and diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 6f0197e03a5fea..cbd8511d93d009 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -303,822 +303,817 @@ extern "C" { #define _PUSH_NULL_CONDITIONAL 518 #define _PY_FRAME_GENERAL 519 #define _PY_FRAME_KW 520 -#define _QUICKEN_RESUME 521 -#define _REPLACE_WITH_TRUE 522 -#define _RESUME_CHECK 523 +#define _REPLACE_WITH_TRUE 521 +#define _RESUME_CHECK 522 #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 524 -#define _SEND 525 -#define _SEND_GEN_FRAME 526 +#define _SAVE_RETURN_OFFSET 523 +#define _SEND 524 +#define _SEND_GEN_FRAME 525 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 527 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 528 -#define _SPILL_OR_RELOAD 529 -#define _START_EXECUTOR 530 -#define _STORE_ATTR 531 -#define _STORE_ATTR_INSTANCE_VALUE 532 -#define _STORE_ATTR_SLOT 533 -#define _STORE_ATTR_WITH_HINT 534 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 526 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 527 +#define _SPILL_OR_RELOAD 528 +#define _START_EXECUTOR 529 +#define _STORE_ATTR 530 +#define _STORE_ATTR_INSTANCE_VALUE 531 +#define _STORE_ATTR_SLOT 532 +#define _STORE_ATTR_WITH_HINT 533 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 535 -#define _STORE_FAST_0 536 -#define _STORE_FAST_1 537 -#define _STORE_FAST_2 538 -#define _STORE_FAST_3 539 -#define _STORE_FAST_4 540 -#define _STORE_FAST_5 541 -#define _STORE_FAST_6 542 -#define _STORE_FAST_7 543 +#define _STORE_FAST 534 +#define _STORE_FAST_0 535 +#define _STORE_FAST_1 536 +#define _STORE_FAST_2 537 +#define _STORE_FAST_3 538 +#define _STORE_FAST_4 539 +#define _STORE_FAST_5 540 +#define _STORE_FAST_6 541 +#define _STORE_FAST_7 542 #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 544 -#define _STORE_SUBSCR 545 -#define _STORE_SUBSCR_DICT 546 -#define _STORE_SUBSCR_LIST_INT 547 -#define _SWAP 548 -#define _SWAP_2 549 -#define _SWAP_3 550 -#define _TIER2_RESUME_CHECK 551 -#define _TO_BOOL 552 +#define _STORE_SLICE 543 +#define _STORE_SUBSCR 544 +#define _STORE_SUBSCR_DICT 545 +#define _STORE_SUBSCR_LIST_INT 546 +#define _SWAP 547 +#define _SWAP_2 548 +#define _SWAP_3 549 +#define _TIER2_RESUME_CHECK 550 +#define _TO_BOOL 551 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 553 +#define _TO_BOOL_LIST 552 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 554 +#define _TO_BOOL_STR 553 #define _TRACE_RECORD TRACE_RECORD #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 555 -#define _UNPACK_SEQUENCE_LIST 556 -#define _UNPACK_SEQUENCE_TUPLE 557 -#define _UNPACK_SEQUENCE_TWO_TUPLE 558 +#define _UNPACK_SEQUENCE 554 +#define _UNPACK_SEQUENCE_LIST 555 +#define _UNPACK_SEQUENCE_TUPLE 556 +#define _UNPACK_SEQUENCE_TWO_TUPLE 557 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 558 -#define _BINARY_OP_r21 559 -#define _BINARY_OP_ADD_FLOAT_r03 560 -#define _BINARY_OP_ADD_FLOAT_r13 561 -#define _BINARY_OP_ADD_FLOAT_r23 562 -#define _BINARY_OP_ADD_INT_r03 563 -#define _BINARY_OP_ADD_INT_r13 564 -#define _BINARY_OP_ADD_INT_r23 565 -#define _BINARY_OP_ADD_UNICODE_r03 566 -#define _BINARY_OP_ADD_UNICODE_r13 567 -#define _BINARY_OP_ADD_UNICODE_r23 568 -#define _BINARY_OP_EXTEND_r21 569 -#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 570 -#define _BINARY_OP_MULTIPLY_FLOAT_r03 571 -#define _BINARY_OP_MULTIPLY_FLOAT_r13 572 -#define _BINARY_OP_MULTIPLY_FLOAT_r23 573 -#define _BINARY_OP_MULTIPLY_INT_r03 574 -#define _BINARY_OP_MULTIPLY_INT_r13 575 -#define _BINARY_OP_MULTIPLY_INT_r23 576 -#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 577 -#define _BINARY_OP_SUBSCR_DICT_r21 578 -#define _BINARY_OP_SUBSCR_INIT_CALL_r01 579 -#define _BINARY_OP_SUBSCR_INIT_CALL_r11 580 -#define _BINARY_OP_SUBSCR_INIT_CALL_r21 581 -#define _BINARY_OP_SUBSCR_INIT_CALL_r31 582 -#define _BINARY_OP_SUBSCR_LIST_INT_r23 583 -#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 584 -#define _BINARY_OP_SUBSCR_STR_INT_r23 585 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 586 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 587 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 588 -#define _BINARY_OP_SUBTRACT_FLOAT_r03 589 -#define _BINARY_OP_SUBTRACT_FLOAT_r13 590 -#define _BINARY_OP_SUBTRACT_FLOAT_r23 591 -#define _BINARY_OP_SUBTRACT_INT_r03 592 -#define _BINARY_OP_SUBTRACT_INT_r13 593 -#define _BINARY_OP_SUBTRACT_INT_r23 594 -#define _BINARY_SLICE_r31 595 -#define _BUILD_INTERPOLATION_r01 596 -#define _BUILD_LIST_r01 597 -#define _BUILD_MAP_r01 598 -#define _BUILD_SET_r01 599 -#define _BUILD_SLICE_r01 600 -#define _BUILD_STRING_r01 601 -#define _BUILD_TEMPLATE_r21 602 -#define _BUILD_TUPLE_r01 603 -#define _CALL_BUILTIN_CLASS_r01 604 -#define _CALL_BUILTIN_FAST_r01 605 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 606 -#define _CALL_BUILTIN_O_r03 607 -#define _CALL_INTRINSIC_1_r11 608 -#define _CALL_INTRINSIC_2_r21 609 -#define _CALL_ISINSTANCE_r31 610 -#define _CALL_KW_NON_PY_r11 611 -#define _CALL_LEN_r33 612 -#define _CALL_LIST_APPEND_r03 613 -#define _CALL_LIST_APPEND_r13 614 -#define _CALL_LIST_APPEND_r23 615 -#define _CALL_LIST_APPEND_r33 616 -#define _CALL_METHOD_DESCRIPTOR_FAST_r01 617 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 618 -#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 619 -#define _CALL_METHOD_DESCRIPTOR_O_r01 620 -#define _CALL_NON_PY_GENERAL_r01 621 -#define _CALL_STR_1_r32 622 -#define _CALL_TUPLE_1_r32 623 -#define _CALL_TYPE_1_r02 624 -#define _CALL_TYPE_1_r12 625 -#define _CALL_TYPE_1_r22 626 -#define _CALL_TYPE_1_r32 627 -#define _CHECK_AND_ALLOCATE_OBJECT_r00 628 -#define _CHECK_ATTR_CLASS_r01 629 -#define _CHECK_ATTR_CLASS_r11 630 -#define _CHECK_ATTR_CLASS_r22 631 -#define _CHECK_ATTR_CLASS_r33 632 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 633 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 634 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 635 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 636 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 637 -#define _CHECK_EG_MATCH_r22 638 -#define _CHECK_EXC_MATCH_r22 639 -#define _CHECK_FUNCTION_EXACT_ARGS_r00 640 -#define _CHECK_FUNCTION_VERSION_r00 641 -#define _CHECK_FUNCTION_VERSION_INLINE_r00 642 -#define _CHECK_FUNCTION_VERSION_INLINE_r11 643 -#define _CHECK_FUNCTION_VERSION_INLINE_r22 644 -#define _CHECK_FUNCTION_VERSION_INLINE_r33 645 -#define _CHECK_FUNCTION_VERSION_KW_r11 646 -#define _CHECK_IS_NOT_PY_CALLABLE_r00 647 -#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 648 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 649 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 650 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 651 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 652 -#define _CHECK_METHOD_VERSION_r00 653 -#define _CHECK_METHOD_VERSION_KW_r11 654 -#define _CHECK_PEP_523_r00 655 -#define _CHECK_PEP_523_r11 656 -#define _CHECK_PEP_523_r22 657 -#define _CHECK_PEP_523_r33 658 -#define _CHECK_PERIODIC_r00 659 -#define _CHECK_PERIODIC_AT_END_r00 660 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 661 -#define _CHECK_RECURSION_REMAINING_r00 662 -#define _CHECK_RECURSION_REMAINING_r11 663 -#define _CHECK_RECURSION_REMAINING_r22 664 -#define _CHECK_RECURSION_REMAINING_r33 665 -#define _CHECK_STACK_SPACE_r00 666 -#define _CHECK_STACK_SPACE_OPERAND_r00 667 -#define _CHECK_STACK_SPACE_OPERAND_r11 668 -#define _CHECK_STACK_SPACE_OPERAND_r22 669 -#define _CHECK_STACK_SPACE_OPERAND_r33 670 -#define _CHECK_VALIDITY_r00 671 -#define _CHECK_VALIDITY_r11 672 -#define _CHECK_VALIDITY_r22 673 -#define _CHECK_VALIDITY_r33 674 -#define _COLD_DYNAMIC_EXIT_r00 675 -#define _COLD_EXIT_r00 676 -#define _COMPARE_OP_r21 677 -#define _COMPARE_OP_FLOAT_r03 678 -#define _COMPARE_OP_FLOAT_r13 679 -#define _COMPARE_OP_FLOAT_r23 680 -#define _COMPARE_OP_INT_r23 681 -#define _COMPARE_OP_STR_r23 682 -#define _CONTAINS_OP_r21 683 -#define _CONTAINS_OP_DICT_r21 684 -#define _CONTAINS_OP_SET_r21 685 -#define _CONVERT_VALUE_r11 686 -#define _COPY_r01 687 -#define _COPY_1_r02 688 -#define _COPY_1_r12 689 -#define _COPY_1_r23 690 -#define _COPY_2_r03 691 -#define _COPY_2_r13 692 -#define _COPY_2_r23 693 -#define _COPY_3_r03 694 -#define _COPY_3_r13 695 -#define _COPY_3_r23 696 -#define _COPY_3_r33 697 -#define _COPY_FREE_VARS_r00 698 -#define _COPY_FREE_VARS_r11 699 -#define _COPY_FREE_VARS_r22 700 -#define _COPY_FREE_VARS_r33 701 -#define _CREATE_INIT_FRAME_r01 702 -#define _DELETE_ATTR_r10 703 -#define _DELETE_DEREF_r00 704 -#define _DELETE_FAST_r00 705 -#define _DELETE_GLOBAL_r00 706 -#define _DELETE_NAME_r00 707 -#define _DELETE_SUBSCR_r20 708 -#define _DEOPT_r00 709 -#define _DEOPT_r10 710 -#define _DEOPT_r20 711 -#define _DEOPT_r30 712 -#define _DICT_MERGE_r10 713 -#define _DICT_UPDATE_r10 714 -#define _DO_CALL_r01 715 -#define _DO_CALL_FUNCTION_EX_r31 716 -#define _DO_CALL_KW_r11 717 -#define _DYNAMIC_EXIT_r00 718 -#define _DYNAMIC_EXIT_r10 719 -#define _DYNAMIC_EXIT_r20 720 -#define _DYNAMIC_EXIT_r30 721 -#define _END_FOR_r10 722 -#define _END_SEND_r21 723 -#define _ERROR_POP_N_r00 724 -#define _EXIT_INIT_CHECK_r10 725 -#define _EXIT_TRACE_r00 726 -#define _EXIT_TRACE_r10 727 -#define _EXIT_TRACE_r20 728 -#define _EXIT_TRACE_r30 729 -#define _EXPAND_METHOD_r00 730 -#define _EXPAND_METHOD_KW_r11 731 -#define _FATAL_ERROR_r00 732 -#define _FATAL_ERROR_r11 733 -#define _FATAL_ERROR_r22 734 -#define _FATAL_ERROR_r33 735 -#define _FORMAT_SIMPLE_r11 736 -#define _FORMAT_WITH_SPEC_r21 737 -#define _FOR_ITER_r23 738 -#define _FOR_ITER_GEN_FRAME_r03 739 -#define _FOR_ITER_GEN_FRAME_r13 740 -#define _FOR_ITER_GEN_FRAME_r23 741 -#define _FOR_ITER_TIER_TWO_r23 742 -#define _GET_AITER_r11 743 -#define _GET_ANEXT_r12 744 -#define _GET_AWAITABLE_r11 745 -#define _GET_ITER_r12 746 -#define _GET_LEN_r12 747 -#define _GET_YIELD_FROM_ITER_r11 748 -#define _GUARD_BINARY_OP_EXTEND_r22 749 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 750 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 751 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 752 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 753 -#define _GUARD_CALLABLE_ISINSTANCE_r03 754 -#define _GUARD_CALLABLE_ISINSTANCE_r13 755 -#define _GUARD_CALLABLE_ISINSTANCE_r23 756 -#define _GUARD_CALLABLE_ISINSTANCE_r33 757 -#define _GUARD_CALLABLE_LEN_r03 758 -#define _GUARD_CALLABLE_LEN_r13 759 -#define _GUARD_CALLABLE_LEN_r23 760 -#define _GUARD_CALLABLE_LEN_r33 761 -#define _GUARD_CALLABLE_LIST_APPEND_r03 762 -#define _GUARD_CALLABLE_LIST_APPEND_r13 763 -#define _GUARD_CALLABLE_LIST_APPEND_r23 764 -#define _GUARD_CALLABLE_LIST_APPEND_r33 765 -#define _GUARD_CALLABLE_STR_1_r03 766 -#define _GUARD_CALLABLE_STR_1_r13 767 -#define _GUARD_CALLABLE_STR_1_r23 768 -#define _GUARD_CALLABLE_STR_1_r33 769 -#define _GUARD_CALLABLE_TUPLE_1_r03 770 -#define _GUARD_CALLABLE_TUPLE_1_r13 771 -#define _GUARD_CALLABLE_TUPLE_1_r23 772 -#define _GUARD_CALLABLE_TUPLE_1_r33 773 -#define _GUARD_CALLABLE_TYPE_1_r03 774 -#define _GUARD_CALLABLE_TYPE_1_r13 775 -#define _GUARD_CALLABLE_TYPE_1_r23 776 -#define _GUARD_CALLABLE_TYPE_1_r33 777 -#define _GUARD_DORV_NO_DICT_r01 778 -#define _GUARD_DORV_NO_DICT_r11 779 -#define _GUARD_DORV_NO_DICT_r22 780 -#define _GUARD_DORV_NO_DICT_r33 781 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 782 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 783 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 784 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 785 -#define _GUARD_GLOBALS_VERSION_r00 786 -#define _GUARD_GLOBALS_VERSION_r11 787 -#define _GUARD_GLOBALS_VERSION_r22 788 -#define _GUARD_GLOBALS_VERSION_r33 789 -#define _GUARD_IP_RETURN_GENERATOR_r00 790 -#define _GUARD_IP_RETURN_GENERATOR_r11 791 -#define _GUARD_IP_RETURN_GENERATOR_r22 792 -#define _GUARD_IP_RETURN_GENERATOR_r33 793 -#define _GUARD_IP_RETURN_VALUE_r00 794 -#define _GUARD_IP_RETURN_VALUE_r11 795 -#define _GUARD_IP_RETURN_VALUE_r22 796 -#define _GUARD_IP_RETURN_VALUE_r33 797 -#define _GUARD_IP_YIELD_VALUE_r00 798 -#define _GUARD_IP_YIELD_VALUE_r11 799 -#define _GUARD_IP_YIELD_VALUE_r22 800 -#define _GUARD_IP_YIELD_VALUE_r33 801 -#define _GUARD_IP__PUSH_FRAME_r00 802 -#define _GUARD_IP__PUSH_FRAME_r11 803 -#define _GUARD_IP__PUSH_FRAME_r22 804 -#define _GUARD_IP__PUSH_FRAME_r33 805 -#define _GUARD_IS_FALSE_POP_r00 806 -#define _GUARD_IS_FALSE_POP_r10 807 -#define _GUARD_IS_FALSE_POP_r21 808 -#define _GUARD_IS_FALSE_POP_r32 809 -#define _GUARD_IS_NONE_POP_r00 810 -#define _GUARD_IS_NONE_POP_r10 811 -#define _GUARD_IS_NONE_POP_r21 812 -#define _GUARD_IS_NONE_POP_r32 813 -#define _GUARD_IS_NOT_NONE_POP_r10 814 -#define _GUARD_IS_TRUE_POP_r00 815 -#define _GUARD_IS_TRUE_POP_r10 816 -#define _GUARD_IS_TRUE_POP_r21 817 -#define _GUARD_IS_TRUE_POP_r32 818 -#define _GUARD_KEYS_VERSION_r01 819 -#define _GUARD_KEYS_VERSION_r11 820 -#define _GUARD_KEYS_VERSION_r22 821 -#define _GUARD_KEYS_VERSION_r33 822 -#define _GUARD_NOS_DICT_r02 823 -#define _GUARD_NOS_DICT_r12 824 -#define _GUARD_NOS_DICT_r22 825 -#define _GUARD_NOS_DICT_r33 826 -#define _GUARD_NOS_FLOAT_r02 827 -#define _GUARD_NOS_FLOAT_r12 828 -#define _GUARD_NOS_FLOAT_r22 829 -#define _GUARD_NOS_FLOAT_r33 830 -#define _GUARD_NOS_INT_r02 831 -#define _GUARD_NOS_INT_r12 832 -#define _GUARD_NOS_INT_r22 833 -#define _GUARD_NOS_INT_r33 834 -#define _GUARD_NOS_LIST_r02 835 -#define _GUARD_NOS_LIST_r12 836 -#define _GUARD_NOS_LIST_r22 837 -#define _GUARD_NOS_LIST_r33 838 -#define _GUARD_NOS_NOT_NULL_r02 839 -#define _GUARD_NOS_NOT_NULL_r12 840 -#define _GUARD_NOS_NOT_NULL_r22 841 -#define _GUARD_NOS_NOT_NULL_r33 842 -#define _GUARD_NOS_NULL_r02 843 -#define _GUARD_NOS_NULL_r12 844 -#define _GUARD_NOS_NULL_r22 845 -#define _GUARD_NOS_NULL_r33 846 -#define _GUARD_NOS_OVERFLOWED_r02 847 -#define _GUARD_NOS_OVERFLOWED_r12 848 -#define _GUARD_NOS_OVERFLOWED_r22 849 -#define _GUARD_NOS_OVERFLOWED_r33 850 -#define _GUARD_NOS_TUPLE_r02 851 -#define _GUARD_NOS_TUPLE_r12 852 -#define _GUARD_NOS_TUPLE_r22 853 -#define _GUARD_NOS_TUPLE_r33 854 -#define _GUARD_NOS_UNICODE_r02 855 -#define _GUARD_NOS_UNICODE_r12 856 -#define _GUARD_NOS_UNICODE_r22 857 -#define _GUARD_NOS_UNICODE_r33 858 -#define _GUARD_NOT_EXHAUSTED_LIST_r02 859 -#define _GUARD_NOT_EXHAUSTED_LIST_r12 860 -#define _GUARD_NOT_EXHAUSTED_LIST_r22 861 -#define _GUARD_NOT_EXHAUSTED_LIST_r33 862 -#define _GUARD_NOT_EXHAUSTED_RANGE_r02 863 -#define _GUARD_NOT_EXHAUSTED_RANGE_r12 864 -#define _GUARD_NOT_EXHAUSTED_RANGE_r22 865 -#define _GUARD_NOT_EXHAUSTED_RANGE_r33 866 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 867 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 868 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 869 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 870 -#define _GUARD_THIRD_NULL_r03 871 -#define _GUARD_THIRD_NULL_r13 872 -#define _GUARD_THIRD_NULL_r23 873 -#define _GUARD_THIRD_NULL_r33 874 -#define _GUARD_TOS_ANY_SET_r01 875 -#define _GUARD_TOS_ANY_SET_r11 876 -#define _GUARD_TOS_ANY_SET_r22 877 -#define _GUARD_TOS_ANY_SET_r33 878 -#define _GUARD_TOS_DICT_r01 879 -#define _GUARD_TOS_DICT_r11 880 -#define _GUARD_TOS_DICT_r22 881 -#define _GUARD_TOS_DICT_r33 882 -#define _GUARD_TOS_FLOAT_r01 883 -#define _GUARD_TOS_FLOAT_r11 884 -#define _GUARD_TOS_FLOAT_r22 885 -#define _GUARD_TOS_FLOAT_r33 886 -#define _GUARD_TOS_INT_r01 887 -#define _GUARD_TOS_INT_r11 888 -#define _GUARD_TOS_INT_r22 889 -#define _GUARD_TOS_INT_r33 890 -#define _GUARD_TOS_LIST_r01 891 -#define _GUARD_TOS_LIST_r11 892 -#define _GUARD_TOS_LIST_r22 893 -#define _GUARD_TOS_LIST_r33 894 -#define _GUARD_TOS_OVERFLOWED_r01 895 -#define _GUARD_TOS_OVERFLOWED_r11 896 -#define _GUARD_TOS_OVERFLOWED_r22 897 -#define _GUARD_TOS_OVERFLOWED_r33 898 -#define _GUARD_TOS_SLICE_r01 899 -#define _GUARD_TOS_SLICE_r11 900 -#define _GUARD_TOS_SLICE_r22 901 -#define _GUARD_TOS_SLICE_r33 902 -#define _GUARD_TOS_TUPLE_r01 903 -#define _GUARD_TOS_TUPLE_r11 904 -#define _GUARD_TOS_TUPLE_r22 905 -#define _GUARD_TOS_TUPLE_r33 906 -#define _GUARD_TOS_UNICODE_r01 907 -#define _GUARD_TOS_UNICODE_r11 908 -#define _GUARD_TOS_UNICODE_r22 909 -#define _GUARD_TOS_UNICODE_r33 910 -#define _GUARD_TYPE_VERSION_r01 911 -#define _GUARD_TYPE_VERSION_r11 912 -#define _GUARD_TYPE_VERSION_r22 913 -#define _GUARD_TYPE_VERSION_r33 914 -#define _GUARD_TYPE_VERSION_AND_LOCK_r01 915 -#define _GUARD_TYPE_VERSION_AND_LOCK_r11 916 -#define _GUARD_TYPE_VERSION_AND_LOCK_r22 917 -#define _GUARD_TYPE_VERSION_AND_LOCK_r33 918 -#define _HANDLE_PENDING_AND_DEOPT_r00 919 -#define _HANDLE_PENDING_AND_DEOPT_r10 920 -#define _HANDLE_PENDING_AND_DEOPT_r20 921 -#define _HANDLE_PENDING_AND_DEOPT_r30 922 -#define _IMPORT_FROM_r12 923 -#define _IMPORT_NAME_r21 924 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 925 -#define _INIT_CALL_PY_EXACT_ARGS_r01 926 -#define _INIT_CALL_PY_EXACT_ARGS_0_r01 927 -#define _INIT_CALL_PY_EXACT_ARGS_1_r01 928 -#define _INIT_CALL_PY_EXACT_ARGS_2_r01 929 -#define _INIT_CALL_PY_EXACT_ARGS_3_r01 930 -#define _INIT_CALL_PY_EXACT_ARGS_4_r01 931 -#define _INSERT_NULL_r10 932 -#define _INSTRUMENTED_FOR_ITER_r23 933 -#define _INSTRUMENTED_INSTRUCTION_r00 934 -#define _INSTRUMENTED_JUMP_FORWARD_r00 935 -#define _INSTRUMENTED_JUMP_FORWARD_r11 936 -#define _INSTRUMENTED_JUMP_FORWARD_r22 937 -#define _INSTRUMENTED_JUMP_FORWARD_r33 938 -#define _INSTRUMENTED_LINE_r00 939 -#define _INSTRUMENTED_NOT_TAKEN_r00 940 -#define _INSTRUMENTED_NOT_TAKEN_r11 941 -#define _INSTRUMENTED_NOT_TAKEN_r22 942 -#define _INSTRUMENTED_NOT_TAKEN_r33 943 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 944 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 945 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 946 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 947 -#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 948 -#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 949 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 950 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 951 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 952 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 953 -#define _IS_NONE_r11 954 -#define _IS_OP_r03 955 -#define _IS_OP_r13 956 -#define _IS_OP_r23 957 -#define _ITER_CHECK_LIST_r02 958 -#define _ITER_CHECK_LIST_r12 959 -#define _ITER_CHECK_LIST_r22 960 -#define _ITER_CHECK_LIST_r33 961 -#define _ITER_CHECK_RANGE_r02 962 -#define _ITER_CHECK_RANGE_r12 963 -#define _ITER_CHECK_RANGE_r22 964 -#define _ITER_CHECK_RANGE_r33 965 -#define _ITER_CHECK_TUPLE_r02 966 -#define _ITER_CHECK_TUPLE_r12 967 -#define _ITER_CHECK_TUPLE_r22 968 -#define _ITER_CHECK_TUPLE_r33 969 -#define _ITER_JUMP_LIST_r02 970 -#define _ITER_JUMP_LIST_r12 971 -#define _ITER_JUMP_LIST_r22 972 -#define _ITER_JUMP_LIST_r33 973 -#define _ITER_JUMP_RANGE_r02 974 -#define _ITER_JUMP_RANGE_r12 975 -#define _ITER_JUMP_RANGE_r22 976 -#define _ITER_JUMP_RANGE_r33 977 -#define _ITER_JUMP_TUPLE_r02 978 -#define _ITER_JUMP_TUPLE_r12 979 -#define _ITER_JUMP_TUPLE_r22 980 -#define _ITER_JUMP_TUPLE_r33 981 -#define _ITER_NEXT_LIST_r23 982 -#define _ITER_NEXT_LIST_TIER_TWO_r23 983 -#define _ITER_NEXT_RANGE_r03 984 -#define _ITER_NEXT_RANGE_r13 985 -#define _ITER_NEXT_RANGE_r23 986 -#define _ITER_NEXT_TUPLE_r03 987 -#define _ITER_NEXT_TUPLE_r13 988 -#define _ITER_NEXT_TUPLE_r23 989 -#define _JUMP_BACKWARD_NO_INTERRUPT_r00 990 -#define _JUMP_BACKWARD_NO_INTERRUPT_r11 991 -#define _JUMP_BACKWARD_NO_INTERRUPT_r22 992 -#define _JUMP_BACKWARD_NO_INTERRUPT_r33 993 -#define _JUMP_TO_TOP_r00 994 -#define _LIST_APPEND_r10 995 -#define _LIST_EXTEND_r10 996 -#define _LOAD_ATTR_r10 997 -#define _LOAD_ATTR_CLASS_r11 998 -#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 999 -#define _LOAD_ATTR_INSTANCE_VALUE_r02 1000 -#define _LOAD_ATTR_INSTANCE_VALUE_r12 1001 -#define _LOAD_ATTR_INSTANCE_VALUE_r23 1002 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1003 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1004 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1005 -#define _LOAD_ATTR_METHOD_NO_DICT_r02 1006 -#define _LOAD_ATTR_METHOD_NO_DICT_r12 1007 -#define _LOAD_ATTR_METHOD_NO_DICT_r23 1008 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1009 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1010 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1011 -#define _LOAD_ATTR_MODULE_r11 1012 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1013 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1014 -#define _LOAD_ATTR_PROPERTY_FRAME_r11 1015 -#define _LOAD_ATTR_SLOT_r11 1016 -#define _LOAD_ATTR_WITH_HINT_r12 1017 -#define _LOAD_BUILD_CLASS_r01 1018 -#define _LOAD_BYTECODE_r00 1019 -#define _LOAD_COMMON_CONSTANT_r01 1020 -#define _LOAD_COMMON_CONSTANT_r12 1021 -#define _LOAD_COMMON_CONSTANT_r23 1022 -#define _LOAD_CONST_r01 1023 -#define _LOAD_CONST_r12 1024 -#define _LOAD_CONST_r23 1025 -#define _LOAD_CONST_INLINE_r01 1026 -#define _LOAD_CONST_INLINE_r12 1027 -#define _LOAD_CONST_INLINE_r23 1028 -#define _LOAD_CONST_INLINE_BORROW_r01 1029 -#define _LOAD_CONST_INLINE_BORROW_r12 1030 -#define _LOAD_CONST_INLINE_BORROW_r23 1031 -#define _LOAD_CONST_UNDER_INLINE_r02 1032 -#define _LOAD_CONST_UNDER_INLINE_r12 1033 -#define _LOAD_CONST_UNDER_INLINE_r23 1034 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1035 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1036 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1037 -#define _LOAD_DEREF_r01 1038 -#define _LOAD_FAST_r01 1039 -#define _LOAD_FAST_r12 1040 -#define _LOAD_FAST_r23 1041 -#define _LOAD_FAST_0_r01 1042 -#define _LOAD_FAST_0_r12 1043 -#define _LOAD_FAST_0_r23 1044 -#define _LOAD_FAST_1_r01 1045 -#define _LOAD_FAST_1_r12 1046 -#define _LOAD_FAST_1_r23 1047 -#define _LOAD_FAST_2_r01 1048 -#define _LOAD_FAST_2_r12 1049 -#define _LOAD_FAST_2_r23 1050 -#define _LOAD_FAST_3_r01 1051 -#define _LOAD_FAST_3_r12 1052 -#define _LOAD_FAST_3_r23 1053 -#define _LOAD_FAST_4_r01 1054 -#define _LOAD_FAST_4_r12 1055 -#define _LOAD_FAST_4_r23 1056 -#define _LOAD_FAST_5_r01 1057 -#define _LOAD_FAST_5_r12 1058 -#define _LOAD_FAST_5_r23 1059 -#define _LOAD_FAST_6_r01 1060 -#define _LOAD_FAST_6_r12 1061 -#define _LOAD_FAST_6_r23 1062 -#define _LOAD_FAST_7_r01 1063 -#define _LOAD_FAST_7_r12 1064 -#define _LOAD_FAST_7_r23 1065 -#define _LOAD_FAST_AND_CLEAR_r01 1066 -#define _LOAD_FAST_AND_CLEAR_r12 1067 -#define _LOAD_FAST_AND_CLEAR_r23 1068 -#define _LOAD_FAST_BORROW_r01 1069 -#define _LOAD_FAST_BORROW_r12 1070 -#define _LOAD_FAST_BORROW_r23 1071 -#define _LOAD_FAST_BORROW_0_r01 1072 -#define _LOAD_FAST_BORROW_0_r12 1073 -#define _LOAD_FAST_BORROW_0_r23 1074 -#define _LOAD_FAST_BORROW_1_r01 1075 -#define _LOAD_FAST_BORROW_1_r12 1076 -#define _LOAD_FAST_BORROW_1_r23 1077 -#define _LOAD_FAST_BORROW_2_r01 1078 -#define _LOAD_FAST_BORROW_2_r12 1079 -#define _LOAD_FAST_BORROW_2_r23 1080 -#define _LOAD_FAST_BORROW_3_r01 1081 -#define _LOAD_FAST_BORROW_3_r12 1082 -#define _LOAD_FAST_BORROW_3_r23 1083 -#define _LOAD_FAST_BORROW_4_r01 1084 -#define _LOAD_FAST_BORROW_4_r12 1085 -#define _LOAD_FAST_BORROW_4_r23 1086 -#define _LOAD_FAST_BORROW_5_r01 1087 -#define _LOAD_FAST_BORROW_5_r12 1088 -#define _LOAD_FAST_BORROW_5_r23 1089 -#define _LOAD_FAST_BORROW_6_r01 1090 -#define _LOAD_FAST_BORROW_6_r12 1091 -#define _LOAD_FAST_BORROW_6_r23 1092 -#define _LOAD_FAST_BORROW_7_r01 1093 -#define _LOAD_FAST_BORROW_7_r12 1094 -#define _LOAD_FAST_BORROW_7_r23 1095 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1096 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1097 -#define _LOAD_FAST_CHECK_r01 1098 -#define _LOAD_FAST_CHECK_r12 1099 -#define _LOAD_FAST_CHECK_r23 1100 -#define _LOAD_FAST_LOAD_FAST_r02 1101 -#define _LOAD_FAST_LOAD_FAST_r13 1102 -#define _LOAD_FROM_DICT_OR_DEREF_r11 1103 -#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1104 -#define _LOAD_GLOBAL_r00 1105 -#define _LOAD_GLOBAL_BUILTINS_r01 1106 -#define _LOAD_GLOBAL_MODULE_r01 1107 -#define _LOAD_LOCALS_r01 1108 -#define _LOAD_LOCALS_r12 1109 -#define _LOAD_LOCALS_r23 1110 -#define _LOAD_NAME_r01 1111 -#define _LOAD_SMALL_INT_r01 1112 -#define _LOAD_SMALL_INT_r12 1113 -#define _LOAD_SMALL_INT_r23 1114 -#define _LOAD_SMALL_INT_0_r01 1115 -#define _LOAD_SMALL_INT_0_r12 1116 -#define _LOAD_SMALL_INT_0_r23 1117 -#define _LOAD_SMALL_INT_1_r01 1118 -#define _LOAD_SMALL_INT_1_r12 1119 -#define _LOAD_SMALL_INT_1_r23 1120 -#define _LOAD_SMALL_INT_2_r01 1121 -#define _LOAD_SMALL_INT_2_r12 1122 -#define _LOAD_SMALL_INT_2_r23 1123 -#define _LOAD_SMALL_INT_3_r01 1124 -#define _LOAD_SMALL_INT_3_r12 1125 -#define _LOAD_SMALL_INT_3_r23 1126 -#define _LOAD_SPECIAL_r00 1127 -#define _LOAD_SUPER_ATTR_ATTR_r31 1128 -#define _LOAD_SUPER_ATTR_METHOD_r32 1129 -#define _MAKE_CALLARGS_A_TUPLE_r33 1130 -#define _MAKE_CELL_r00 1131 -#define _MAKE_FUNCTION_r11 1132 -#define _MAKE_WARM_r00 1133 -#define _MAKE_WARM_r11 1134 -#define _MAKE_WARM_r22 1135 -#define _MAKE_WARM_r33 1136 -#define _MAP_ADD_r20 1137 -#define _MATCH_CLASS_r31 1138 -#define _MATCH_KEYS_r23 1139 -#define _MATCH_MAPPING_r02 1140 -#define _MATCH_MAPPING_r12 1141 -#define _MATCH_MAPPING_r23 1142 -#define _MATCH_SEQUENCE_r02 1143 -#define _MATCH_SEQUENCE_r12 1144 -#define _MATCH_SEQUENCE_r23 1145 -#define _MAYBE_EXPAND_METHOD_r00 1146 -#define _MAYBE_EXPAND_METHOD_KW_r11 1147 -#define _MONITOR_CALL_r00 1148 -#define _MONITOR_CALL_KW_r11 1149 -#define _MONITOR_JUMP_BACKWARD_r00 1150 -#define _MONITOR_JUMP_BACKWARD_r11 1151 -#define _MONITOR_JUMP_BACKWARD_r22 1152 -#define _MONITOR_JUMP_BACKWARD_r33 1153 -#define _MONITOR_RESUME_r00 1154 -#define _NOP_r00 1155 -#define _NOP_r11 1156 -#define _NOP_r22 1157 -#define _NOP_r33 1158 -#define _POP_CALL_r20 1159 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1160 -#define _POP_CALL_ONE_r30 1161 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1162 -#define _POP_CALL_TWO_r30 1163 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1164 -#define _POP_EXCEPT_r10 1165 -#define _POP_ITER_r20 1166 -#define _POP_JUMP_IF_FALSE_r00 1167 -#define _POP_JUMP_IF_FALSE_r10 1168 -#define _POP_JUMP_IF_FALSE_r21 1169 -#define _POP_JUMP_IF_FALSE_r32 1170 -#define _POP_JUMP_IF_TRUE_r00 1171 -#define _POP_JUMP_IF_TRUE_r10 1172 -#define _POP_JUMP_IF_TRUE_r21 1173 -#define _POP_JUMP_IF_TRUE_r32 1174 -#define _POP_TOP_r10 1175 -#define _POP_TOP_FLOAT_r00 1176 -#define _POP_TOP_FLOAT_r10 1177 -#define _POP_TOP_FLOAT_r21 1178 -#define _POP_TOP_FLOAT_r32 1179 -#define _POP_TOP_INT_r00 1180 -#define _POP_TOP_INT_r10 1181 -#define _POP_TOP_INT_r21 1182 -#define _POP_TOP_INT_r32 1183 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1184 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1185 -#define _POP_TOP_NOP_r00 1186 -#define _POP_TOP_NOP_r10 1187 -#define _POP_TOP_NOP_r21 1188 -#define _POP_TOP_NOP_r32 1189 -#define _POP_TOP_UNICODE_r00 1190 -#define _POP_TOP_UNICODE_r10 1191 -#define _POP_TOP_UNICODE_r21 1192 -#define _POP_TOP_UNICODE_r32 1193 -#define _POP_TWO_r20 1194 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1195 -#define _PUSH_EXC_INFO_r02 1196 -#define _PUSH_EXC_INFO_r12 1197 -#define _PUSH_EXC_INFO_r23 1198 -#define _PUSH_FRAME_r10 1199 -#define _PUSH_NULL_r01 1200 -#define _PUSH_NULL_r12 1201 -#define _PUSH_NULL_r23 1202 -#define _PUSH_NULL_CONDITIONAL_r00 1203 -#define _PY_FRAME_GENERAL_r01 1204 -#define _PY_FRAME_KW_r11 1205 -#define _QUICKEN_RESUME_r00 1206 -#define _QUICKEN_RESUME_r11 1207 -#define _QUICKEN_RESUME_r22 1208 -#define _QUICKEN_RESUME_r33 1209 -#define _REPLACE_WITH_TRUE_r11 1210 -#define _RESUME_CHECK_r00 1211 -#define _RESUME_CHECK_r11 1212 -#define _RESUME_CHECK_r22 1213 -#define _RESUME_CHECK_r33 1214 -#define _RETURN_GENERATOR_r01 1215 -#define _RETURN_VALUE_r11 1216 -#define _SAVE_RETURN_OFFSET_r00 1217 -#define _SAVE_RETURN_OFFSET_r11 1218 -#define _SAVE_RETURN_OFFSET_r22 1219 -#define _SAVE_RETURN_OFFSET_r33 1220 -#define _SEND_r22 1221 -#define _SEND_GEN_FRAME_r22 1222 -#define _SETUP_ANNOTATIONS_r00 1223 -#define _SET_ADD_r10 1224 -#define _SET_FUNCTION_ATTRIBUTE_r01 1225 -#define _SET_FUNCTION_ATTRIBUTE_r11 1226 -#define _SET_FUNCTION_ATTRIBUTE_r21 1227 -#define _SET_FUNCTION_ATTRIBUTE_r32 1228 -#define _SET_IP_r00 1229 -#define _SET_IP_r11 1230 -#define _SET_IP_r22 1231 -#define _SET_IP_r33 1232 -#define _SET_UPDATE_r10 1233 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1234 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1235 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1236 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1237 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1238 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1239 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1240 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1241 -#define _SPILL_OR_RELOAD_r01 1242 -#define _SPILL_OR_RELOAD_r02 1243 -#define _SPILL_OR_RELOAD_r03 1244 -#define _SPILL_OR_RELOAD_r10 1245 -#define _SPILL_OR_RELOAD_r12 1246 -#define _SPILL_OR_RELOAD_r13 1247 -#define _SPILL_OR_RELOAD_r20 1248 -#define _SPILL_OR_RELOAD_r21 1249 -#define _SPILL_OR_RELOAD_r23 1250 -#define _SPILL_OR_RELOAD_r30 1251 -#define _SPILL_OR_RELOAD_r31 1252 -#define _SPILL_OR_RELOAD_r32 1253 -#define _START_EXECUTOR_r00 1254 -#define _STORE_ATTR_r20 1255 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1256 -#define _STORE_ATTR_SLOT_r21 1257 -#define _STORE_ATTR_WITH_HINT_r21 1258 -#define _STORE_DEREF_r10 1259 -#define _STORE_FAST_r10 1260 -#define _STORE_FAST_0_r10 1261 -#define _STORE_FAST_1_r10 1262 -#define _STORE_FAST_2_r10 1263 -#define _STORE_FAST_3_r10 1264 -#define _STORE_FAST_4_r10 1265 -#define _STORE_FAST_5_r10 1266 -#define _STORE_FAST_6_r10 1267 -#define _STORE_FAST_7_r10 1268 -#define _STORE_FAST_LOAD_FAST_r11 1269 -#define _STORE_FAST_STORE_FAST_r20 1270 -#define _STORE_GLOBAL_r10 1271 -#define _STORE_NAME_r10 1272 -#define _STORE_SLICE_r30 1273 -#define _STORE_SUBSCR_r30 1274 -#define _STORE_SUBSCR_DICT_r31 1275 -#define _STORE_SUBSCR_LIST_INT_r32 1276 -#define _SWAP_r11 1277 -#define _SWAP_2_r02 1278 -#define _SWAP_2_r12 1279 -#define _SWAP_2_r22 1280 -#define _SWAP_2_r33 1281 -#define _SWAP_3_r03 1282 -#define _SWAP_3_r13 1283 -#define _SWAP_3_r23 1284 -#define _SWAP_3_r33 1285 -#define _TIER2_RESUME_CHECK_r00 1286 -#define _TIER2_RESUME_CHECK_r11 1287 -#define _TIER2_RESUME_CHECK_r22 1288 -#define _TIER2_RESUME_CHECK_r33 1289 -#define _TO_BOOL_r11 1290 -#define _TO_BOOL_BOOL_r01 1291 -#define _TO_BOOL_BOOL_r11 1292 -#define _TO_BOOL_BOOL_r22 1293 -#define _TO_BOOL_BOOL_r33 1294 -#define _TO_BOOL_INT_r11 1295 -#define _TO_BOOL_LIST_r11 1296 -#define _TO_BOOL_NONE_r01 1297 -#define _TO_BOOL_NONE_r11 1298 -#define _TO_BOOL_NONE_r22 1299 -#define _TO_BOOL_NONE_r33 1300 -#define _TO_BOOL_STR_r11 1301 -#define _TRACE_RECORD_r00 1302 -#define _UNARY_INVERT_r11 1303 -#define _UNARY_NEGATIVE_r11 1304 -#define _UNARY_NOT_r01 1305 -#define _UNARY_NOT_r11 1306 -#define _UNARY_NOT_r22 1307 -#define _UNARY_NOT_r33 1308 -#define _UNPACK_EX_r10 1309 -#define _UNPACK_SEQUENCE_r10 1310 -#define _UNPACK_SEQUENCE_LIST_r10 1311 -#define _UNPACK_SEQUENCE_TUPLE_r10 1312 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1313 -#define _WITH_EXCEPT_START_r33 1314 -#define _YIELD_VALUE_r11 1315 -#define MAX_UOP_REGS_ID 1315 +#define MAX_UOP_ID 557 +#define _BINARY_OP_r21 558 +#define _BINARY_OP_ADD_FLOAT_r03 559 +#define _BINARY_OP_ADD_FLOAT_r13 560 +#define _BINARY_OP_ADD_FLOAT_r23 561 +#define _BINARY_OP_ADD_INT_r03 562 +#define _BINARY_OP_ADD_INT_r13 563 +#define _BINARY_OP_ADD_INT_r23 564 +#define _BINARY_OP_ADD_UNICODE_r03 565 +#define _BINARY_OP_ADD_UNICODE_r13 566 +#define _BINARY_OP_ADD_UNICODE_r23 567 +#define _BINARY_OP_EXTEND_r21 568 +#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 569 +#define _BINARY_OP_MULTIPLY_FLOAT_r03 570 +#define _BINARY_OP_MULTIPLY_FLOAT_r13 571 +#define _BINARY_OP_MULTIPLY_FLOAT_r23 572 +#define _BINARY_OP_MULTIPLY_INT_r03 573 +#define _BINARY_OP_MULTIPLY_INT_r13 574 +#define _BINARY_OP_MULTIPLY_INT_r23 575 +#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 576 +#define _BINARY_OP_SUBSCR_DICT_r21 577 +#define _BINARY_OP_SUBSCR_INIT_CALL_r01 578 +#define _BINARY_OP_SUBSCR_INIT_CALL_r11 579 +#define _BINARY_OP_SUBSCR_INIT_CALL_r21 580 +#define _BINARY_OP_SUBSCR_INIT_CALL_r31 581 +#define _BINARY_OP_SUBSCR_LIST_INT_r23 582 +#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 583 +#define _BINARY_OP_SUBSCR_STR_INT_r23 584 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 585 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 586 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 587 +#define _BINARY_OP_SUBTRACT_FLOAT_r03 588 +#define _BINARY_OP_SUBTRACT_FLOAT_r13 589 +#define _BINARY_OP_SUBTRACT_FLOAT_r23 590 +#define _BINARY_OP_SUBTRACT_INT_r03 591 +#define _BINARY_OP_SUBTRACT_INT_r13 592 +#define _BINARY_OP_SUBTRACT_INT_r23 593 +#define _BINARY_SLICE_r31 594 +#define _BUILD_INTERPOLATION_r01 595 +#define _BUILD_LIST_r01 596 +#define _BUILD_MAP_r01 597 +#define _BUILD_SET_r01 598 +#define _BUILD_SLICE_r01 599 +#define _BUILD_STRING_r01 600 +#define _BUILD_TEMPLATE_r21 601 +#define _BUILD_TUPLE_r01 602 +#define _CALL_BUILTIN_CLASS_r01 603 +#define _CALL_BUILTIN_FAST_r01 604 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 605 +#define _CALL_BUILTIN_O_r03 606 +#define _CALL_INTRINSIC_1_r11 607 +#define _CALL_INTRINSIC_2_r21 608 +#define _CALL_ISINSTANCE_r31 609 +#define _CALL_KW_NON_PY_r11 610 +#define _CALL_LEN_r33 611 +#define _CALL_LIST_APPEND_r03 612 +#define _CALL_LIST_APPEND_r13 613 +#define _CALL_LIST_APPEND_r23 614 +#define _CALL_LIST_APPEND_r33 615 +#define _CALL_METHOD_DESCRIPTOR_FAST_r01 616 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 617 +#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 618 +#define _CALL_METHOD_DESCRIPTOR_O_r01 619 +#define _CALL_NON_PY_GENERAL_r01 620 +#define _CALL_STR_1_r32 621 +#define _CALL_TUPLE_1_r32 622 +#define _CALL_TYPE_1_r02 623 +#define _CALL_TYPE_1_r12 624 +#define _CALL_TYPE_1_r22 625 +#define _CALL_TYPE_1_r32 626 +#define _CHECK_AND_ALLOCATE_OBJECT_r00 627 +#define _CHECK_ATTR_CLASS_r01 628 +#define _CHECK_ATTR_CLASS_r11 629 +#define _CHECK_ATTR_CLASS_r22 630 +#define _CHECK_ATTR_CLASS_r33 631 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 632 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 633 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 634 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 635 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 636 +#define _CHECK_EG_MATCH_r22 637 +#define _CHECK_EXC_MATCH_r22 638 +#define _CHECK_FUNCTION_EXACT_ARGS_r00 639 +#define _CHECK_FUNCTION_VERSION_r00 640 +#define _CHECK_FUNCTION_VERSION_INLINE_r00 641 +#define _CHECK_FUNCTION_VERSION_INLINE_r11 642 +#define _CHECK_FUNCTION_VERSION_INLINE_r22 643 +#define _CHECK_FUNCTION_VERSION_INLINE_r33 644 +#define _CHECK_FUNCTION_VERSION_KW_r11 645 +#define _CHECK_IS_NOT_PY_CALLABLE_r00 646 +#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 647 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 648 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 649 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 650 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 651 +#define _CHECK_METHOD_VERSION_r00 652 +#define _CHECK_METHOD_VERSION_KW_r11 653 +#define _CHECK_PEP_523_r00 654 +#define _CHECK_PEP_523_r11 655 +#define _CHECK_PEP_523_r22 656 +#define _CHECK_PEP_523_r33 657 +#define _CHECK_PERIODIC_r00 658 +#define _CHECK_PERIODIC_AT_END_r00 659 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 660 +#define _CHECK_RECURSION_REMAINING_r00 661 +#define _CHECK_RECURSION_REMAINING_r11 662 +#define _CHECK_RECURSION_REMAINING_r22 663 +#define _CHECK_RECURSION_REMAINING_r33 664 +#define _CHECK_STACK_SPACE_r00 665 +#define _CHECK_STACK_SPACE_OPERAND_r00 666 +#define _CHECK_STACK_SPACE_OPERAND_r11 667 +#define _CHECK_STACK_SPACE_OPERAND_r22 668 +#define _CHECK_STACK_SPACE_OPERAND_r33 669 +#define _CHECK_VALIDITY_r00 670 +#define _CHECK_VALIDITY_r11 671 +#define _CHECK_VALIDITY_r22 672 +#define _CHECK_VALIDITY_r33 673 +#define _COLD_DYNAMIC_EXIT_r00 674 +#define _COLD_EXIT_r00 675 +#define _COMPARE_OP_r21 676 +#define _COMPARE_OP_FLOAT_r03 677 +#define _COMPARE_OP_FLOAT_r13 678 +#define _COMPARE_OP_FLOAT_r23 679 +#define _COMPARE_OP_INT_r23 680 +#define _COMPARE_OP_STR_r23 681 +#define _CONTAINS_OP_r21 682 +#define _CONTAINS_OP_DICT_r21 683 +#define _CONTAINS_OP_SET_r21 684 +#define _CONVERT_VALUE_r11 685 +#define _COPY_r01 686 +#define _COPY_1_r02 687 +#define _COPY_1_r12 688 +#define _COPY_1_r23 689 +#define _COPY_2_r03 690 +#define _COPY_2_r13 691 +#define _COPY_2_r23 692 +#define _COPY_3_r03 693 +#define _COPY_3_r13 694 +#define _COPY_3_r23 695 +#define _COPY_3_r33 696 +#define _COPY_FREE_VARS_r00 697 +#define _COPY_FREE_VARS_r11 698 +#define _COPY_FREE_VARS_r22 699 +#define _COPY_FREE_VARS_r33 700 +#define _CREATE_INIT_FRAME_r01 701 +#define _DELETE_ATTR_r10 702 +#define _DELETE_DEREF_r00 703 +#define _DELETE_FAST_r00 704 +#define _DELETE_GLOBAL_r00 705 +#define _DELETE_NAME_r00 706 +#define _DELETE_SUBSCR_r20 707 +#define _DEOPT_r00 708 +#define _DEOPT_r10 709 +#define _DEOPT_r20 710 +#define _DEOPT_r30 711 +#define _DICT_MERGE_r10 712 +#define _DICT_UPDATE_r10 713 +#define _DO_CALL_r01 714 +#define _DO_CALL_FUNCTION_EX_r31 715 +#define _DO_CALL_KW_r11 716 +#define _DYNAMIC_EXIT_r00 717 +#define _DYNAMIC_EXIT_r10 718 +#define _DYNAMIC_EXIT_r20 719 +#define _DYNAMIC_EXIT_r30 720 +#define _END_FOR_r10 721 +#define _END_SEND_r21 722 +#define _ERROR_POP_N_r00 723 +#define _EXIT_INIT_CHECK_r10 724 +#define _EXIT_TRACE_r00 725 +#define _EXIT_TRACE_r10 726 +#define _EXIT_TRACE_r20 727 +#define _EXIT_TRACE_r30 728 +#define _EXPAND_METHOD_r00 729 +#define _EXPAND_METHOD_KW_r11 730 +#define _FATAL_ERROR_r00 731 +#define _FATAL_ERROR_r11 732 +#define _FATAL_ERROR_r22 733 +#define _FATAL_ERROR_r33 734 +#define _FORMAT_SIMPLE_r11 735 +#define _FORMAT_WITH_SPEC_r21 736 +#define _FOR_ITER_r23 737 +#define _FOR_ITER_GEN_FRAME_r03 738 +#define _FOR_ITER_GEN_FRAME_r13 739 +#define _FOR_ITER_GEN_FRAME_r23 740 +#define _FOR_ITER_TIER_TWO_r23 741 +#define _GET_AITER_r11 742 +#define _GET_ANEXT_r12 743 +#define _GET_AWAITABLE_r11 744 +#define _GET_ITER_r12 745 +#define _GET_LEN_r12 746 +#define _GET_YIELD_FROM_ITER_r11 747 +#define _GUARD_BINARY_OP_EXTEND_r22 748 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 749 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 750 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 751 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 752 +#define _GUARD_CALLABLE_ISINSTANCE_r03 753 +#define _GUARD_CALLABLE_ISINSTANCE_r13 754 +#define _GUARD_CALLABLE_ISINSTANCE_r23 755 +#define _GUARD_CALLABLE_ISINSTANCE_r33 756 +#define _GUARD_CALLABLE_LEN_r03 757 +#define _GUARD_CALLABLE_LEN_r13 758 +#define _GUARD_CALLABLE_LEN_r23 759 +#define _GUARD_CALLABLE_LEN_r33 760 +#define _GUARD_CALLABLE_LIST_APPEND_r03 761 +#define _GUARD_CALLABLE_LIST_APPEND_r13 762 +#define _GUARD_CALLABLE_LIST_APPEND_r23 763 +#define _GUARD_CALLABLE_LIST_APPEND_r33 764 +#define _GUARD_CALLABLE_STR_1_r03 765 +#define _GUARD_CALLABLE_STR_1_r13 766 +#define _GUARD_CALLABLE_STR_1_r23 767 +#define _GUARD_CALLABLE_STR_1_r33 768 +#define _GUARD_CALLABLE_TUPLE_1_r03 769 +#define _GUARD_CALLABLE_TUPLE_1_r13 770 +#define _GUARD_CALLABLE_TUPLE_1_r23 771 +#define _GUARD_CALLABLE_TUPLE_1_r33 772 +#define _GUARD_CALLABLE_TYPE_1_r03 773 +#define _GUARD_CALLABLE_TYPE_1_r13 774 +#define _GUARD_CALLABLE_TYPE_1_r23 775 +#define _GUARD_CALLABLE_TYPE_1_r33 776 +#define _GUARD_DORV_NO_DICT_r01 777 +#define _GUARD_DORV_NO_DICT_r11 778 +#define _GUARD_DORV_NO_DICT_r22 779 +#define _GUARD_DORV_NO_DICT_r33 780 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 781 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 782 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 783 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 784 +#define _GUARD_GLOBALS_VERSION_r00 785 +#define _GUARD_GLOBALS_VERSION_r11 786 +#define _GUARD_GLOBALS_VERSION_r22 787 +#define _GUARD_GLOBALS_VERSION_r33 788 +#define _GUARD_IP_RETURN_GENERATOR_r00 789 +#define _GUARD_IP_RETURN_GENERATOR_r11 790 +#define _GUARD_IP_RETURN_GENERATOR_r22 791 +#define _GUARD_IP_RETURN_GENERATOR_r33 792 +#define _GUARD_IP_RETURN_VALUE_r00 793 +#define _GUARD_IP_RETURN_VALUE_r11 794 +#define _GUARD_IP_RETURN_VALUE_r22 795 +#define _GUARD_IP_RETURN_VALUE_r33 796 +#define _GUARD_IP_YIELD_VALUE_r00 797 +#define _GUARD_IP_YIELD_VALUE_r11 798 +#define _GUARD_IP_YIELD_VALUE_r22 799 +#define _GUARD_IP_YIELD_VALUE_r33 800 +#define _GUARD_IP__PUSH_FRAME_r00 801 +#define _GUARD_IP__PUSH_FRAME_r11 802 +#define _GUARD_IP__PUSH_FRAME_r22 803 +#define _GUARD_IP__PUSH_FRAME_r33 804 +#define _GUARD_IS_FALSE_POP_r00 805 +#define _GUARD_IS_FALSE_POP_r10 806 +#define _GUARD_IS_FALSE_POP_r21 807 +#define _GUARD_IS_FALSE_POP_r32 808 +#define _GUARD_IS_NONE_POP_r00 809 +#define _GUARD_IS_NONE_POP_r10 810 +#define _GUARD_IS_NONE_POP_r21 811 +#define _GUARD_IS_NONE_POP_r32 812 +#define _GUARD_IS_NOT_NONE_POP_r10 813 +#define _GUARD_IS_TRUE_POP_r00 814 +#define _GUARD_IS_TRUE_POP_r10 815 +#define _GUARD_IS_TRUE_POP_r21 816 +#define _GUARD_IS_TRUE_POP_r32 817 +#define _GUARD_KEYS_VERSION_r01 818 +#define _GUARD_KEYS_VERSION_r11 819 +#define _GUARD_KEYS_VERSION_r22 820 +#define _GUARD_KEYS_VERSION_r33 821 +#define _GUARD_NOS_DICT_r02 822 +#define _GUARD_NOS_DICT_r12 823 +#define _GUARD_NOS_DICT_r22 824 +#define _GUARD_NOS_DICT_r33 825 +#define _GUARD_NOS_FLOAT_r02 826 +#define _GUARD_NOS_FLOAT_r12 827 +#define _GUARD_NOS_FLOAT_r22 828 +#define _GUARD_NOS_FLOAT_r33 829 +#define _GUARD_NOS_INT_r02 830 +#define _GUARD_NOS_INT_r12 831 +#define _GUARD_NOS_INT_r22 832 +#define _GUARD_NOS_INT_r33 833 +#define _GUARD_NOS_LIST_r02 834 +#define _GUARD_NOS_LIST_r12 835 +#define _GUARD_NOS_LIST_r22 836 +#define _GUARD_NOS_LIST_r33 837 +#define _GUARD_NOS_NOT_NULL_r02 838 +#define _GUARD_NOS_NOT_NULL_r12 839 +#define _GUARD_NOS_NOT_NULL_r22 840 +#define _GUARD_NOS_NOT_NULL_r33 841 +#define _GUARD_NOS_NULL_r02 842 +#define _GUARD_NOS_NULL_r12 843 +#define _GUARD_NOS_NULL_r22 844 +#define _GUARD_NOS_NULL_r33 845 +#define _GUARD_NOS_OVERFLOWED_r02 846 +#define _GUARD_NOS_OVERFLOWED_r12 847 +#define _GUARD_NOS_OVERFLOWED_r22 848 +#define _GUARD_NOS_OVERFLOWED_r33 849 +#define _GUARD_NOS_TUPLE_r02 850 +#define _GUARD_NOS_TUPLE_r12 851 +#define _GUARD_NOS_TUPLE_r22 852 +#define _GUARD_NOS_TUPLE_r33 853 +#define _GUARD_NOS_UNICODE_r02 854 +#define _GUARD_NOS_UNICODE_r12 855 +#define _GUARD_NOS_UNICODE_r22 856 +#define _GUARD_NOS_UNICODE_r33 857 +#define _GUARD_NOT_EXHAUSTED_LIST_r02 858 +#define _GUARD_NOT_EXHAUSTED_LIST_r12 859 +#define _GUARD_NOT_EXHAUSTED_LIST_r22 860 +#define _GUARD_NOT_EXHAUSTED_LIST_r33 861 +#define _GUARD_NOT_EXHAUSTED_RANGE_r02 862 +#define _GUARD_NOT_EXHAUSTED_RANGE_r12 863 +#define _GUARD_NOT_EXHAUSTED_RANGE_r22 864 +#define _GUARD_NOT_EXHAUSTED_RANGE_r33 865 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 866 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 867 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 868 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 869 +#define _GUARD_THIRD_NULL_r03 870 +#define _GUARD_THIRD_NULL_r13 871 +#define _GUARD_THIRD_NULL_r23 872 +#define _GUARD_THIRD_NULL_r33 873 +#define _GUARD_TOS_ANY_SET_r01 874 +#define _GUARD_TOS_ANY_SET_r11 875 +#define _GUARD_TOS_ANY_SET_r22 876 +#define _GUARD_TOS_ANY_SET_r33 877 +#define _GUARD_TOS_DICT_r01 878 +#define _GUARD_TOS_DICT_r11 879 +#define _GUARD_TOS_DICT_r22 880 +#define _GUARD_TOS_DICT_r33 881 +#define _GUARD_TOS_FLOAT_r01 882 +#define _GUARD_TOS_FLOAT_r11 883 +#define _GUARD_TOS_FLOAT_r22 884 +#define _GUARD_TOS_FLOAT_r33 885 +#define _GUARD_TOS_INT_r01 886 +#define _GUARD_TOS_INT_r11 887 +#define _GUARD_TOS_INT_r22 888 +#define _GUARD_TOS_INT_r33 889 +#define _GUARD_TOS_LIST_r01 890 +#define _GUARD_TOS_LIST_r11 891 +#define _GUARD_TOS_LIST_r22 892 +#define _GUARD_TOS_LIST_r33 893 +#define _GUARD_TOS_OVERFLOWED_r01 894 +#define _GUARD_TOS_OVERFLOWED_r11 895 +#define _GUARD_TOS_OVERFLOWED_r22 896 +#define _GUARD_TOS_OVERFLOWED_r33 897 +#define _GUARD_TOS_SLICE_r01 898 +#define _GUARD_TOS_SLICE_r11 899 +#define _GUARD_TOS_SLICE_r22 900 +#define _GUARD_TOS_SLICE_r33 901 +#define _GUARD_TOS_TUPLE_r01 902 +#define _GUARD_TOS_TUPLE_r11 903 +#define _GUARD_TOS_TUPLE_r22 904 +#define _GUARD_TOS_TUPLE_r33 905 +#define _GUARD_TOS_UNICODE_r01 906 +#define _GUARD_TOS_UNICODE_r11 907 +#define _GUARD_TOS_UNICODE_r22 908 +#define _GUARD_TOS_UNICODE_r33 909 +#define _GUARD_TYPE_VERSION_r01 910 +#define _GUARD_TYPE_VERSION_r11 911 +#define _GUARD_TYPE_VERSION_r22 912 +#define _GUARD_TYPE_VERSION_r33 913 +#define _GUARD_TYPE_VERSION_AND_LOCK_r01 914 +#define _GUARD_TYPE_VERSION_AND_LOCK_r11 915 +#define _GUARD_TYPE_VERSION_AND_LOCK_r22 916 +#define _GUARD_TYPE_VERSION_AND_LOCK_r33 917 +#define _HANDLE_PENDING_AND_DEOPT_r00 918 +#define _HANDLE_PENDING_AND_DEOPT_r10 919 +#define _HANDLE_PENDING_AND_DEOPT_r20 920 +#define _HANDLE_PENDING_AND_DEOPT_r30 921 +#define _IMPORT_FROM_r12 922 +#define _IMPORT_NAME_r21 923 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 924 +#define _INIT_CALL_PY_EXACT_ARGS_r01 925 +#define _INIT_CALL_PY_EXACT_ARGS_0_r01 926 +#define _INIT_CALL_PY_EXACT_ARGS_1_r01 927 +#define _INIT_CALL_PY_EXACT_ARGS_2_r01 928 +#define _INIT_CALL_PY_EXACT_ARGS_3_r01 929 +#define _INIT_CALL_PY_EXACT_ARGS_4_r01 930 +#define _INSERT_NULL_r10 931 +#define _INSTRUMENTED_FOR_ITER_r23 932 +#define _INSTRUMENTED_INSTRUCTION_r00 933 +#define _INSTRUMENTED_JUMP_FORWARD_r00 934 +#define _INSTRUMENTED_JUMP_FORWARD_r11 935 +#define _INSTRUMENTED_JUMP_FORWARD_r22 936 +#define _INSTRUMENTED_JUMP_FORWARD_r33 937 +#define _INSTRUMENTED_LINE_r00 938 +#define _INSTRUMENTED_NOT_TAKEN_r00 939 +#define _INSTRUMENTED_NOT_TAKEN_r11 940 +#define _INSTRUMENTED_NOT_TAKEN_r22 941 +#define _INSTRUMENTED_NOT_TAKEN_r33 942 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 943 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 944 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 945 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 946 +#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 947 +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 948 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 949 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 950 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 951 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 952 +#define _IS_NONE_r11 953 +#define _IS_OP_r03 954 +#define _IS_OP_r13 955 +#define _IS_OP_r23 956 +#define _ITER_CHECK_LIST_r02 957 +#define _ITER_CHECK_LIST_r12 958 +#define _ITER_CHECK_LIST_r22 959 +#define _ITER_CHECK_LIST_r33 960 +#define _ITER_CHECK_RANGE_r02 961 +#define _ITER_CHECK_RANGE_r12 962 +#define _ITER_CHECK_RANGE_r22 963 +#define _ITER_CHECK_RANGE_r33 964 +#define _ITER_CHECK_TUPLE_r02 965 +#define _ITER_CHECK_TUPLE_r12 966 +#define _ITER_CHECK_TUPLE_r22 967 +#define _ITER_CHECK_TUPLE_r33 968 +#define _ITER_JUMP_LIST_r02 969 +#define _ITER_JUMP_LIST_r12 970 +#define _ITER_JUMP_LIST_r22 971 +#define _ITER_JUMP_LIST_r33 972 +#define _ITER_JUMP_RANGE_r02 973 +#define _ITER_JUMP_RANGE_r12 974 +#define _ITER_JUMP_RANGE_r22 975 +#define _ITER_JUMP_RANGE_r33 976 +#define _ITER_JUMP_TUPLE_r02 977 +#define _ITER_JUMP_TUPLE_r12 978 +#define _ITER_JUMP_TUPLE_r22 979 +#define _ITER_JUMP_TUPLE_r33 980 +#define _ITER_NEXT_LIST_r23 981 +#define _ITER_NEXT_LIST_TIER_TWO_r23 982 +#define _ITER_NEXT_RANGE_r03 983 +#define _ITER_NEXT_RANGE_r13 984 +#define _ITER_NEXT_RANGE_r23 985 +#define _ITER_NEXT_TUPLE_r03 986 +#define _ITER_NEXT_TUPLE_r13 987 +#define _ITER_NEXT_TUPLE_r23 988 +#define _JUMP_BACKWARD_NO_INTERRUPT_r00 989 +#define _JUMP_BACKWARD_NO_INTERRUPT_r11 990 +#define _JUMP_BACKWARD_NO_INTERRUPT_r22 991 +#define _JUMP_BACKWARD_NO_INTERRUPT_r33 992 +#define _JUMP_TO_TOP_r00 993 +#define _LIST_APPEND_r10 994 +#define _LIST_EXTEND_r10 995 +#define _LOAD_ATTR_r10 996 +#define _LOAD_ATTR_CLASS_r11 997 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 998 +#define _LOAD_ATTR_INSTANCE_VALUE_r02 999 +#define _LOAD_ATTR_INSTANCE_VALUE_r12 1000 +#define _LOAD_ATTR_INSTANCE_VALUE_r23 1001 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1002 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1003 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1004 +#define _LOAD_ATTR_METHOD_NO_DICT_r02 1005 +#define _LOAD_ATTR_METHOD_NO_DICT_r12 1006 +#define _LOAD_ATTR_METHOD_NO_DICT_r23 1007 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1008 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1009 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1010 +#define _LOAD_ATTR_MODULE_r11 1011 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1012 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1013 +#define _LOAD_ATTR_PROPERTY_FRAME_r11 1014 +#define _LOAD_ATTR_SLOT_r11 1015 +#define _LOAD_ATTR_WITH_HINT_r12 1016 +#define _LOAD_BUILD_CLASS_r01 1017 +#define _LOAD_BYTECODE_r00 1018 +#define _LOAD_COMMON_CONSTANT_r01 1019 +#define _LOAD_COMMON_CONSTANT_r12 1020 +#define _LOAD_COMMON_CONSTANT_r23 1021 +#define _LOAD_CONST_r01 1022 +#define _LOAD_CONST_r12 1023 +#define _LOAD_CONST_r23 1024 +#define _LOAD_CONST_INLINE_r01 1025 +#define _LOAD_CONST_INLINE_r12 1026 +#define _LOAD_CONST_INLINE_r23 1027 +#define _LOAD_CONST_INLINE_BORROW_r01 1028 +#define _LOAD_CONST_INLINE_BORROW_r12 1029 +#define _LOAD_CONST_INLINE_BORROW_r23 1030 +#define _LOAD_CONST_UNDER_INLINE_r02 1031 +#define _LOAD_CONST_UNDER_INLINE_r12 1032 +#define _LOAD_CONST_UNDER_INLINE_r23 1033 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1034 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1035 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1036 +#define _LOAD_DEREF_r01 1037 +#define _LOAD_FAST_r01 1038 +#define _LOAD_FAST_r12 1039 +#define _LOAD_FAST_r23 1040 +#define _LOAD_FAST_0_r01 1041 +#define _LOAD_FAST_0_r12 1042 +#define _LOAD_FAST_0_r23 1043 +#define _LOAD_FAST_1_r01 1044 +#define _LOAD_FAST_1_r12 1045 +#define _LOAD_FAST_1_r23 1046 +#define _LOAD_FAST_2_r01 1047 +#define _LOAD_FAST_2_r12 1048 +#define _LOAD_FAST_2_r23 1049 +#define _LOAD_FAST_3_r01 1050 +#define _LOAD_FAST_3_r12 1051 +#define _LOAD_FAST_3_r23 1052 +#define _LOAD_FAST_4_r01 1053 +#define _LOAD_FAST_4_r12 1054 +#define _LOAD_FAST_4_r23 1055 +#define _LOAD_FAST_5_r01 1056 +#define _LOAD_FAST_5_r12 1057 +#define _LOAD_FAST_5_r23 1058 +#define _LOAD_FAST_6_r01 1059 +#define _LOAD_FAST_6_r12 1060 +#define _LOAD_FAST_6_r23 1061 +#define _LOAD_FAST_7_r01 1062 +#define _LOAD_FAST_7_r12 1063 +#define _LOAD_FAST_7_r23 1064 +#define _LOAD_FAST_AND_CLEAR_r01 1065 +#define _LOAD_FAST_AND_CLEAR_r12 1066 +#define _LOAD_FAST_AND_CLEAR_r23 1067 +#define _LOAD_FAST_BORROW_r01 1068 +#define _LOAD_FAST_BORROW_r12 1069 +#define _LOAD_FAST_BORROW_r23 1070 +#define _LOAD_FAST_BORROW_0_r01 1071 +#define _LOAD_FAST_BORROW_0_r12 1072 +#define _LOAD_FAST_BORROW_0_r23 1073 +#define _LOAD_FAST_BORROW_1_r01 1074 +#define _LOAD_FAST_BORROW_1_r12 1075 +#define _LOAD_FAST_BORROW_1_r23 1076 +#define _LOAD_FAST_BORROW_2_r01 1077 +#define _LOAD_FAST_BORROW_2_r12 1078 +#define _LOAD_FAST_BORROW_2_r23 1079 +#define _LOAD_FAST_BORROW_3_r01 1080 +#define _LOAD_FAST_BORROW_3_r12 1081 +#define _LOAD_FAST_BORROW_3_r23 1082 +#define _LOAD_FAST_BORROW_4_r01 1083 +#define _LOAD_FAST_BORROW_4_r12 1084 +#define _LOAD_FAST_BORROW_4_r23 1085 +#define _LOAD_FAST_BORROW_5_r01 1086 +#define _LOAD_FAST_BORROW_5_r12 1087 +#define _LOAD_FAST_BORROW_5_r23 1088 +#define _LOAD_FAST_BORROW_6_r01 1089 +#define _LOAD_FAST_BORROW_6_r12 1090 +#define _LOAD_FAST_BORROW_6_r23 1091 +#define _LOAD_FAST_BORROW_7_r01 1092 +#define _LOAD_FAST_BORROW_7_r12 1093 +#define _LOAD_FAST_BORROW_7_r23 1094 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1095 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1096 +#define _LOAD_FAST_CHECK_r01 1097 +#define _LOAD_FAST_CHECK_r12 1098 +#define _LOAD_FAST_CHECK_r23 1099 +#define _LOAD_FAST_LOAD_FAST_r02 1100 +#define _LOAD_FAST_LOAD_FAST_r13 1101 +#define _LOAD_FROM_DICT_OR_DEREF_r11 1102 +#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1103 +#define _LOAD_GLOBAL_r00 1104 +#define _LOAD_GLOBAL_BUILTINS_r01 1105 +#define _LOAD_GLOBAL_MODULE_r01 1106 +#define _LOAD_LOCALS_r01 1107 +#define _LOAD_LOCALS_r12 1108 +#define _LOAD_LOCALS_r23 1109 +#define _LOAD_NAME_r01 1110 +#define _LOAD_SMALL_INT_r01 1111 +#define _LOAD_SMALL_INT_r12 1112 +#define _LOAD_SMALL_INT_r23 1113 +#define _LOAD_SMALL_INT_0_r01 1114 +#define _LOAD_SMALL_INT_0_r12 1115 +#define _LOAD_SMALL_INT_0_r23 1116 +#define _LOAD_SMALL_INT_1_r01 1117 +#define _LOAD_SMALL_INT_1_r12 1118 +#define _LOAD_SMALL_INT_1_r23 1119 +#define _LOAD_SMALL_INT_2_r01 1120 +#define _LOAD_SMALL_INT_2_r12 1121 +#define _LOAD_SMALL_INT_2_r23 1122 +#define _LOAD_SMALL_INT_3_r01 1123 +#define _LOAD_SMALL_INT_3_r12 1124 +#define _LOAD_SMALL_INT_3_r23 1125 +#define _LOAD_SPECIAL_r00 1126 +#define _LOAD_SUPER_ATTR_ATTR_r31 1127 +#define _LOAD_SUPER_ATTR_METHOD_r32 1128 +#define _MAKE_CALLARGS_A_TUPLE_r33 1129 +#define _MAKE_CELL_r00 1130 +#define _MAKE_FUNCTION_r11 1131 +#define _MAKE_WARM_r00 1132 +#define _MAKE_WARM_r11 1133 +#define _MAKE_WARM_r22 1134 +#define _MAKE_WARM_r33 1135 +#define _MAP_ADD_r20 1136 +#define _MATCH_CLASS_r31 1137 +#define _MATCH_KEYS_r23 1138 +#define _MATCH_MAPPING_r02 1139 +#define _MATCH_MAPPING_r12 1140 +#define _MATCH_MAPPING_r23 1141 +#define _MATCH_SEQUENCE_r02 1142 +#define _MATCH_SEQUENCE_r12 1143 +#define _MATCH_SEQUENCE_r23 1144 +#define _MAYBE_EXPAND_METHOD_r00 1145 +#define _MAYBE_EXPAND_METHOD_KW_r11 1146 +#define _MONITOR_CALL_r00 1147 +#define _MONITOR_CALL_KW_r11 1148 +#define _MONITOR_JUMP_BACKWARD_r00 1149 +#define _MONITOR_JUMP_BACKWARD_r11 1150 +#define _MONITOR_JUMP_BACKWARD_r22 1151 +#define _MONITOR_JUMP_BACKWARD_r33 1152 +#define _MONITOR_RESUME_r00 1153 +#define _NOP_r00 1154 +#define _NOP_r11 1155 +#define _NOP_r22 1156 +#define _NOP_r33 1157 +#define _POP_CALL_r20 1158 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1159 +#define _POP_CALL_ONE_r30 1160 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1161 +#define _POP_CALL_TWO_r30 1162 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1163 +#define _POP_EXCEPT_r10 1164 +#define _POP_ITER_r20 1165 +#define _POP_JUMP_IF_FALSE_r00 1166 +#define _POP_JUMP_IF_FALSE_r10 1167 +#define _POP_JUMP_IF_FALSE_r21 1168 +#define _POP_JUMP_IF_FALSE_r32 1169 +#define _POP_JUMP_IF_TRUE_r00 1170 +#define _POP_JUMP_IF_TRUE_r10 1171 +#define _POP_JUMP_IF_TRUE_r21 1172 +#define _POP_JUMP_IF_TRUE_r32 1173 +#define _POP_TOP_r10 1174 +#define _POP_TOP_FLOAT_r00 1175 +#define _POP_TOP_FLOAT_r10 1176 +#define _POP_TOP_FLOAT_r21 1177 +#define _POP_TOP_FLOAT_r32 1178 +#define _POP_TOP_INT_r00 1179 +#define _POP_TOP_INT_r10 1180 +#define _POP_TOP_INT_r21 1181 +#define _POP_TOP_INT_r32 1182 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1183 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1184 +#define _POP_TOP_NOP_r00 1185 +#define _POP_TOP_NOP_r10 1186 +#define _POP_TOP_NOP_r21 1187 +#define _POP_TOP_NOP_r32 1188 +#define _POP_TOP_UNICODE_r00 1189 +#define _POP_TOP_UNICODE_r10 1190 +#define _POP_TOP_UNICODE_r21 1191 +#define _POP_TOP_UNICODE_r32 1192 +#define _POP_TWO_r20 1193 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1194 +#define _PUSH_EXC_INFO_r02 1195 +#define _PUSH_EXC_INFO_r12 1196 +#define _PUSH_EXC_INFO_r23 1197 +#define _PUSH_FRAME_r10 1198 +#define _PUSH_NULL_r01 1199 +#define _PUSH_NULL_r12 1200 +#define _PUSH_NULL_r23 1201 +#define _PUSH_NULL_CONDITIONAL_r00 1202 +#define _PY_FRAME_GENERAL_r01 1203 +#define _PY_FRAME_KW_r11 1204 +#define _REPLACE_WITH_TRUE_r11 1205 +#define _RESUME_CHECK_r00 1206 +#define _RESUME_CHECK_r11 1207 +#define _RESUME_CHECK_r22 1208 +#define _RESUME_CHECK_r33 1209 +#define _RETURN_GENERATOR_r01 1210 +#define _RETURN_VALUE_r11 1211 +#define _SAVE_RETURN_OFFSET_r00 1212 +#define _SAVE_RETURN_OFFSET_r11 1213 +#define _SAVE_RETURN_OFFSET_r22 1214 +#define _SAVE_RETURN_OFFSET_r33 1215 +#define _SEND_r22 1216 +#define _SEND_GEN_FRAME_r22 1217 +#define _SETUP_ANNOTATIONS_r00 1218 +#define _SET_ADD_r10 1219 +#define _SET_FUNCTION_ATTRIBUTE_r01 1220 +#define _SET_FUNCTION_ATTRIBUTE_r11 1221 +#define _SET_FUNCTION_ATTRIBUTE_r21 1222 +#define _SET_FUNCTION_ATTRIBUTE_r32 1223 +#define _SET_IP_r00 1224 +#define _SET_IP_r11 1225 +#define _SET_IP_r22 1226 +#define _SET_IP_r33 1227 +#define _SET_UPDATE_r10 1228 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1229 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1230 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1231 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1232 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1233 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1234 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1235 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1236 +#define _SPILL_OR_RELOAD_r01 1237 +#define _SPILL_OR_RELOAD_r02 1238 +#define _SPILL_OR_RELOAD_r03 1239 +#define _SPILL_OR_RELOAD_r10 1240 +#define _SPILL_OR_RELOAD_r12 1241 +#define _SPILL_OR_RELOAD_r13 1242 +#define _SPILL_OR_RELOAD_r20 1243 +#define _SPILL_OR_RELOAD_r21 1244 +#define _SPILL_OR_RELOAD_r23 1245 +#define _SPILL_OR_RELOAD_r30 1246 +#define _SPILL_OR_RELOAD_r31 1247 +#define _SPILL_OR_RELOAD_r32 1248 +#define _START_EXECUTOR_r00 1249 +#define _STORE_ATTR_r20 1250 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1251 +#define _STORE_ATTR_SLOT_r21 1252 +#define _STORE_ATTR_WITH_HINT_r21 1253 +#define _STORE_DEREF_r10 1254 +#define _STORE_FAST_r10 1255 +#define _STORE_FAST_0_r10 1256 +#define _STORE_FAST_1_r10 1257 +#define _STORE_FAST_2_r10 1258 +#define _STORE_FAST_3_r10 1259 +#define _STORE_FAST_4_r10 1260 +#define _STORE_FAST_5_r10 1261 +#define _STORE_FAST_6_r10 1262 +#define _STORE_FAST_7_r10 1263 +#define _STORE_FAST_LOAD_FAST_r11 1264 +#define _STORE_FAST_STORE_FAST_r20 1265 +#define _STORE_GLOBAL_r10 1266 +#define _STORE_NAME_r10 1267 +#define _STORE_SLICE_r30 1268 +#define _STORE_SUBSCR_r30 1269 +#define _STORE_SUBSCR_DICT_r31 1270 +#define _STORE_SUBSCR_LIST_INT_r32 1271 +#define _SWAP_r11 1272 +#define _SWAP_2_r02 1273 +#define _SWAP_2_r12 1274 +#define _SWAP_2_r22 1275 +#define _SWAP_2_r33 1276 +#define _SWAP_3_r03 1277 +#define _SWAP_3_r13 1278 +#define _SWAP_3_r23 1279 +#define _SWAP_3_r33 1280 +#define _TIER2_RESUME_CHECK_r00 1281 +#define _TIER2_RESUME_CHECK_r11 1282 +#define _TIER2_RESUME_CHECK_r22 1283 +#define _TIER2_RESUME_CHECK_r33 1284 +#define _TO_BOOL_r11 1285 +#define _TO_BOOL_BOOL_r01 1286 +#define _TO_BOOL_BOOL_r11 1287 +#define _TO_BOOL_BOOL_r22 1288 +#define _TO_BOOL_BOOL_r33 1289 +#define _TO_BOOL_INT_r11 1290 +#define _TO_BOOL_LIST_r11 1291 +#define _TO_BOOL_NONE_r01 1292 +#define _TO_BOOL_NONE_r11 1293 +#define _TO_BOOL_NONE_r22 1294 +#define _TO_BOOL_NONE_r33 1295 +#define _TO_BOOL_STR_r11 1296 +#define _TRACE_RECORD_r00 1297 +#define _UNARY_INVERT_r11 1298 +#define _UNARY_NEGATIVE_r11 1299 +#define _UNARY_NOT_r01 1300 +#define _UNARY_NOT_r11 1301 +#define _UNARY_NOT_r22 1302 +#define _UNARY_NOT_r33 1303 +#define _UNPACK_EX_r10 1304 +#define _UNPACK_SEQUENCE_r10 1305 +#define _UNPACK_SEQUENCE_LIST_r10 1306 +#define _UNPACK_SEQUENCE_TUPLE_r10 1307 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1308 +#define _WITH_EXCEPT_START_r33 1309 +#define _YIELD_VALUE_r11 1310 +#define MAX_UOP_REGS_ID 1310 #ifdef __cplusplus } diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index bfa2fa43dce7ea..86eb74330842d0 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -885,7 +885,7 @@ def load_test(x, y=0): return a, b dis_load_test_quickened_code = """\ -%3d RESUME_CHECK{: <6} 0 +%3d RESUME{: <6} 0 %3d LOAD_FAST_LOAD_FAST 1 (x, y) STORE_FAST_STORE_FAST 50 (b, a) @@ -902,7 +902,7 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d RESUME_CHECK{: <6} 0 +%3d RESUME{: <6} 0 %3d BUILD_LIST 0 LOAD_CONST 2 ((1, 2, 3)) @@ -1300,14 +1300,14 @@ def test_super_instructions(self): self.code_quicken(lambda: load_test(0, 0)) got = self.get_disassembly(load_test, adaptive=True) jit = sys._jit.is_enabled() - expected = dis_load_test_quickened_code.format("_JIT" if jit else "") + expected = dis_load_test_quickened_code.format("" if jit else "_CHECK") self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_load_attr_specialize(self): load_attr_quicken = """\ - 0 RESUME_CHECK{: <6} 0 + 0 RESUME{: <6} 0 1 LOAD_CONST 0 ('a') LOAD_ATTR_SLOT 0 (__class__) @@ -1317,14 +1317,14 @@ def test_load_attr_specialize(self): self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) jit = sys._jit.is_enabled() - expected = load_attr_quicken.format("_JIT" if jit else "") + expected = load_attr_quicken.format("" if jit else "_CHECK") self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_call_specialize(self): call_quicken = """\ - 0 RESUME_CHECK{: <6} 0 + 0 RESUME{: <6} 0 1 LOAD_NAME 0 (str) PUSH_NULL @@ -1336,7 +1336,7 @@ def test_call_specialize(self): self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) jit = sys._jit.is_enabled() - expected = call_quicken.format("_JIT" if jit else "") + expected = call_quicken.format("" if jit else "_CHECK") self.do_disassembly_compare(got, expected) @cpython_only @@ -1346,8 +1346,9 @@ def test_loop_quicken(self): self.code_quicken(loop_test) got = self.get_disassembly(loop_test, adaptive=True) jit = sys._jit.is_enabled() + resume_str = "" if jit else "_CHECK" jit_str = "_JIT" if jit else "NO_JIT" - expected = dis_loop_test_quickened_code.format(jit_str, jit_str) + expected = dis_loop_test_quickened_code.format(resume_str, jit_str) self.do_disassembly_compare(got, expected) @cpython_only diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 90868cabcccade..139ee350402e32 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -169,13 +169,19 @@ dummy_func( } } - op(_QUICKEN_RESUME, (--)) { - #if ENABLE_SPECIALIZATION_FT - if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - uint8_t desired = tstate->interp->jit ? RESUME_CHECK_JIT : RESUME_CHECK; - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, desired); + specializing op(_SPECIALIZE_RESUME, (counter/1 --)) { +#if ENABLE_SPECIALIZATION_FT + #if _Py_TIER2 + if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { + next_instr = this_instr; + _Py_Specialize_Resume(next_instr, tstate); + DISPATCH_SAME_OPARG(); } - #endif /* ENABLE_SPECIALIZATION_FT */ + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + #else + _Py_Specialize_Resume(next_instr, tstate); + #endif +#endif /* ENABLE_SPECIALIZATION_FT */ } tier1 op(_MAYBE_INSTRUMENT, (--)) { @@ -220,10 +226,9 @@ dummy_func( } macro(RESUME) = - unused/1 + _LOAD_BYTECODE + _MAYBE_INSTRUMENT + - _QUICKEN_RESUME + + _SPECIALIZE_RESUME + _CHECK_PERIODIC_IF_NOT_YIELD_FROM; macro(RESUME_CHECK) = @@ -2963,9 +2968,10 @@ dummy_func( tier1 op(_JIT, (--)) { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || this_instr->op.code == RESUME_CHECK_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; @@ -2985,6 +2991,13 @@ dummy_func( else { ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } + // For some reason, RESUME_CHECK_JIT is quite expensive compared to RESUME. + // For that reason, we replace it back with RESUME immediately. + // In JIT builds, we thus stick only to RESUME and wait for it to specialize to RESUME_CHECK_JIT. + // This amkes RESUME slightly slower, but since the JIT is faster it makes up for it. + if (is_resume) { + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME); + } #endif } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index e2b4e18bc88e6f..4f98f771b30413 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -93,8 +93,6 @@ break; } - /* _QUICKEN_RESUME is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ - /* _LOAD_BYTECODE is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ case _RESUME_CHECK_r00: { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index f5754c446d7a7d..4c919cd84756c7 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7304,9 +7304,10 @@ // _JIT { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || this_instr->op.code == RESUME_CHECK_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { @@ -7325,6 +7326,9 @@ else { ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } + if (is_resume) { + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME); + } #endif } DISPATCH(); @@ -9913,7 +9917,6 @@ PREDICTED_RESUME:; _Py_CODEUNIT* const this_instr = next_instr - 2; (void)this_instr; - /* Skip 1 cache entry */ // _LOAD_BYTECODE { #ifdef Py_GIL_DISABLED @@ -9957,13 +9960,25 @@ } } } - // _QUICKEN_RESUME + // _SPECIALIZE_RESUME { + uint16_t counter = read_u16(&this_instr[1].cache); + (void)counter; #if ENABLE_SPECIALIZATION_FT - if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - uint8_t desired = tstate->interp->jit ? RESUME_CHECK_JIT : RESUME_CHECK; - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, desired); + #if _Py_TIER2 + if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { + next_instr = this_instr; + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_Specialize_Resume(next_instr, tstate); + stack_pointer = _PyFrame_GetStackPointer(frame); + DISPATCH_SAME_OPARG(); } + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + #else + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_Specialize_Resume(next_instr, tstate); + stack_pointer = _PyFrame_GetStackPointer(frame); + #endif #endif /* ENABLE_SPECIALIZATION_FT */ } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM @@ -10062,9 +10077,10 @@ // _JIT { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || this_instr->op.code == RESUME_CHECK_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { @@ -10083,6 +10099,9 @@ else { ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } + if (is_resume) { + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME); + } #endif } DISPATCH(); diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index bf6af0b8bbd7a5..b4a0967170b91d 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -17,8 +17,6 @@ break; } - /* _QUICKEN_RESUME is not a viable micro-op for tier 2 */ - /* _LOAD_BYTECODE is not a viable micro-op for tier 2 */ case _RESUME_CHECK: { diff --git a/Python/specialize.c b/Python/specialize.c index 952de72c9e9a96..df2b594dfe2cc1 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -56,6 +56,7 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters adaptive_counter = initial_unreachable_backoff_counter(); resume_counter = initial_unreachable_backoff_counter(); } + (void)resume_counter; int opcode = 0; int oparg = 0; /* The last code unit cannot have a cache, so we don't need to check it */ @@ -69,9 +70,11 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters case JUMP_BACKWARD: instructions[i + 1].counter = jump_counter; break; + #ifdef _Py_TIER2 case RESUME: instructions[i + 1].counter = resume_counter; break; + #endif case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: case POP_JUMP_IF_NONE: @@ -2724,6 +2727,23 @@ _Py_Specialize_ContainsOp(_PyStackRef value_st, _Py_CODEUNIT *instr) return; } + +void +_Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate) +{ + if (tstate->tracing == 0 && instr->op.code == RESUME) { + if (tstate->interp->jit) { + specialize(instr, RESUME_CHECK_JIT); + set_counter((_Py_BackoffCounter *)instr + 1, trigger_backoff_counter()); + return; + } + specialize(instr, RESUME_CHECK); + return; + } + unspecialize(instr); + return; +} + #ifdef Py_STATS void _Py_GatherStats_GetIter(_PyStackRef iterable) From 2e5e9e6c0c97f7c5b4ae5594ebdb6e1407e0e716 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 00:19:45 +0000 Subject: [PATCH 25/43] fix infinite deopt involving monitoring --- Python/bytecodes.c | 8 +++++--- Python/executor_cases.c.h | 30 ++++-------------------------- Python/generated_cases.c.h | 4 +++- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 139ee350402e32..c736118e794cd4 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3051,7 +3051,9 @@ dummy_func( /* If the eval breaker is set then stay in tier 1. * This avoids any potentially infinite loops * involving _RESUME_CHECK */ - if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + int dont_enter = !(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + if (dont_enter || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; @@ -5376,7 +5378,7 @@ dummy_func( } /* Progress is guaranteed if we DEOPT on the eval breaker, because - * ENTER_EXECUTOR will not re-enter tier 2 with the eval breaker set. */ + * ENTER_EXECUTOR will not re-enter tier 2 wiFth the eval breaker set. */ tier2 op(_TIER2_RESUME_CHECK, (--)) { #if defined(__EMSCRIPTEN__) HANDLE_PENDING_AND_DEOPT_IF(_Py_emscripten_signal_clock == 0); @@ -5384,7 +5386,7 @@ dummy_func( #endif uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); HANDLE_PENDING_AND_DEOPT_IF(eval_breaker & _PY_EVAL_EVENTS_MASK); - HANDLE_PENDING_AND_DEOPT_IF(!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))); + assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); } tier2 op(_COLD_EXIT, ( -- )) { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 4f98f771b30413..8df6f450f03cc3 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -17623,11 +17623,7 @@ SET_CURRENT_CACHED_VALUES(0); JUMP_TO_JUMP_TARGET(); } - if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { - UOP_STAT_INC(uopcode, miss); - SET_CURRENT_CACHED_VALUES(0); - JUMP_TO_JUMP_TARGET(); - } + assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); SET_CURRENT_CACHED_VALUES(0); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); break; @@ -17653,12 +17649,7 @@ SET_CURRENT_CACHED_VALUES(1); JUMP_TO_JUMP_TARGET(); } - if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { - UOP_STAT_INC(uopcode, miss); - _tos_cache0 = _stack_item_0; - SET_CURRENT_CACHED_VALUES(1); - JUMP_TO_JUMP_TARGET(); - } + assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); _tos_cache0 = _stack_item_0; SET_CURRENT_CACHED_VALUES(1); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); @@ -17688,13 +17679,7 @@ SET_CURRENT_CACHED_VALUES(2); JUMP_TO_JUMP_TARGET(); } - if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { - UOP_STAT_INC(uopcode, miss); - _tos_cache1 = _stack_item_1; - _tos_cache0 = _stack_item_0; - SET_CURRENT_CACHED_VALUES(2); - JUMP_TO_JUMP_TARGET(); - } + assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); _tos_cache1 = _stack_item_1; _tos_cache0 = _stack_item_0; SET_CURRENT_CACHED_VALUES(2); @@ -17728,14 +17713,7 @@ SET_CURRENT_CACHED_VALUES(3); JUMP_TO_JUMP_TARGET(); } - if (!(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version))) { - UOP_STAT_INC(uopcode, miss); - _tos_cache2 = _stack_item_2; - _tos_cache1 = _stack_item_1; - _tos_cache0 = _stack_item_0; - SET_CURRENT_CACHED_VALUES(3); - JUMP_TO_JUMP_TARGET(); - } + assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); _tos_cache2 = _stack_item_2; _tos_cache1 = _stack_item_1; _tos_cache0 = _stack_item_0; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 4c919cd84756c7..c938a9032f4480 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5255,7 +5255,9 @@ assert(executor->vm_data.code == code); assert(executor->vm_data.valid); assert(tstate->current_executor == NULL); - if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + int dont_enter = !(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version)); + if (dont_enter || _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) { opcode = executor->vm_data.opcode; oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; From 96ea93accc70b1215a822b8ebd0bd0eb22258f7f Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 00:49:35 +0000 Subject: [PATCH 26/43] edit comment --- Python/bytecodes.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index c736118e794cd4..2ccef9e2ea9f2d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2992,6 +2992,7 @@ dummy_func( ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } // For some reason, RESUME_CHECK_JIT is quite expensive compared to RESUME. + // It's enough to show up as a 10-20% slowdown in some benchmarks! // For that reason, we replace it back with RESUME immediately. // In JIT builds, we thus stick only to RESUME and wait for it to specialize to RESUME_CHECK_JIT. // This amkes RESUME slightly slower, but since the JIT is faster it makes up for it. From 5cec1309317bd18f320da98b66fb13ccbfe48566 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 01:57:21 +0000 Subject: [PATCH 27/43] trace over RESUME/RESUME_CHECK_JIT --- Python/bytecodes.c | 13 +++++++++++-- Python/generated_cases.c.h | 12 ++++++++++-- Python/opcode_targets.h | 2 +- Python/optimizer.c | 36 +++++++++++++++++++++++------------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 2ccef9e2ea9f2d..98c933cca4f9d2 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3041,7 +3041,7 @@ dummy_func( #ifdef _Py_TIER2 if (IS_JIT_TRACING()) { next_instr = this_instr; - goto stop_tracing; + goto consider_stop_tracing; } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; @@ -5659,10 +5659,19 @@ dummy_func( #endif } - label(stop_tracing) { + label(consider_stop_tracing) { #if _Py_TIER2 assert(IS_JIT_TRACING()); int opcode = next_instr->op.code; + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; + int orig_opcode = executor->vm_data.opcode; + // Function entry, trace over it to form a longer trace. + if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { + oparg = (oparg & ~255) | executor->vm_data.oparg; + opcode = orig_opcode; + DISPATCH_GOTO_NON_TRACING(); + } _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); LEAVE_TRACING(); int err = stop_tracing_and_jit(tstate, frame); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index c938a9032f4480..533e1c2150fbc0 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5247,7 +5247,7 @@ #ifdef _Py_TIER2 if (IS_JIT_TRACING()) { next_instr = this_instr; - JUMP_TO_LABEL(stop_tracing); + JUMP_TO_LABEL(consider_stop_tracing); } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; @@ -12159,11 +12159,19 @@ JUMP_TO_LABEL(error); DISPATCH(); } - LABEL(stop_tracing) + LABEL(consider_stop_tracing) { #if _Py_TIER2 assert(IS_JIT_TRACING()); int opcode = next_instr->op.code; + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; + int orig_opcode = executor->vm_data.opcode; + if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { + oparg = (oparg & ~255) | executor->vm_data.oparg; + opcode = orig_opcode; + DISPATCH_GOTO_NON_TRACING(); + } _PyFrame_SetStackPointer(frame, stack_pointer); _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); stack_pointer = _PyFrame_GetStackPointer(frame); diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index ac85b96c64141f..7432576429285a 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -528,7 +528,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_error(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_start_frame(TAIL_CALL_PARAMS); -static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_consider_stop_tracing(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(TAIL_CALL_PARAMS); diff --git a/Python/optimizer.c b/Python/optimizer.c index 859077be25bedc..84a758275b98e7 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -646,6 +646,29 @@ _PyJit_translate_single_bytecode_to_trace( int oparg = _tstate->jit_tracer_state.prev_state.instr_oparg; int opcode = this_instr->op.code; + if (stop_tracing_opcode == _DEOPT) { + // gh-143183: It's important we rewind to the last known proper target. + // The current target might be garbage as stop tracing usually indicates + // we are in something that we can't trace. + DPRINTF(2, "Told to stop tracing\n"); + goto unsupported; + } + else if (stop_tracing_opcode != 0) { + assert(stop_tracing_opcode == _EXIT_TRACE); + ADD_TO_TRACE(stop_tracing_opcode, 0, 0, target); + goto done; + } + + // Function entry executor, trace over it to form a longer trace. + // Otherwise, we end up with fragmented loop traces that have bad performance. + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; + int orig_opcode = executor->vm_data.opcode; + assert(orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME); + oparg = (oparg & ~255) | executor->vm_data.oparg; + opcode = orig_opcode; + } + int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; @@ -699,19 +722,6 @@ _PyJit_translate_single_bytecode_to_trace( goto full; } - if (stop_tracing_opcode == _DEOPT) { - // gh-143183: It's important we rewind to the last known proper target. - // The current target might be garbage as stop tracing usually indicates - // we are in something that we can't trace. - DPRINTF(2, "Told to stop tracing\n"); - goto unsupported; - } - else if (stop_tracing_opcode != 0) { - assert(stop_tracing_opcode == _EXIT_TRACE); - ADD_TO_TRACE(stop_tracing_opcode, 0, 0, target); - goto done; - } - assert(stop_tracing_opcode == 0); #ifdef Py_DEBUG From 2373aee589066a8503d35f3148eef86feb7f9e5e Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 14:49:21 +0000 Subject: [PATCH 28/43] trace over everything except backwards jumps --- Python/bytecodes.c | 13 +++++++++++-- Python/generated_cases.c.h | 11 ++++++++++- Python/optimizer.c | 29 +++++++++++++++++++---------- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 98c933cca4f9d2..04ff36ec8811bd 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5666,10 +5666,19 @@ dummy_func( PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; int orig_opcode = executor->vm_data.opcode; - // Function entry, trace over it to form a longer trace. - if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { + // Not backwards jump, trace over it to form a longer trace. + if (orig_opcode != JUMP_BACKWARD_JIT && + orig_opcode != JUMP_BACKWARD && + orig_opcode != JUMP_BACKWARD_NO_INTERRUPT && + orig_opcode != JUMP_BACKWARD_NO_JIT) { + assert(executor->vm_data.index == INSTR_OFFSET()); + assert(executor->vm_data.code == code); + assert(executor->vm_data.valid); oparg = (oparg & ~255) | executor->vm_data.oparg; opcode = orig_opcode; + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(next_instr[1].counter); + } DISPATCH_GOTO_NON_TRACING(); } _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 533e1c2150fbc0..2c39132d17d035 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -12167,9 +12167,18 @@ JUMP_TO_LABEL(error); PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; int orig_opcode = executor->vm_data.opcode; - if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { + if (orig_opcode != JUMP_BACKWARD_JIT && + orig_opcode != JUMP_BACKWARD && + orig_opcode != JUMP_BACKWARD_NO_INTERRUPT && + orig_opcode != JUMP_BACKWARD_NO_JIT) { + assert(executor->vm_data.index == INSTR_OFFSET()); + assert(executor->vm_data.code == code); + assert(executor->vm_data.valid); oparg = (oparg & ~255) | executor->vm_data.oparg; opcode = orig_opcode; + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(next_instr[1].counter); + } DISPATCH_GOTO_NON_TRACING(); } _PyFrame_SetStackPointer(frame, stack_pointer); diff --git a/Python/optimizer.c b/Python/optimizer.c index 84a758275b98e7..9709cd997975b2 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -646,25 +646,38 @@ _PyJit_translate_single_bytecode_to_trace( int oparg = _tstate->jit_tracer_state.prev_state.instr_oparg; int opcode = this_instr->op.code; + // Loop back to the start + int is_first_instr = _tstate->jit_tracer_state.initial_state.close_loop_instr == next_instr || + _tstate->jit_tracer_state.initial_state.start_instr == next_instr; if (stop_tracing_opcode == _DEOPT) { // gh-143183: It's important we rewind to the last known proper target. // The current target might be garbage as stop tracing usually indicates // we are in something that we can't trace. - DPRINTF(2, "Told to stop tracing\n"); + DPRINTF(2, "Told to stop tracing. Reason: %s\n", _PyOpcode_OpName[next_instr->op.code]); goto unsupported; } - else if (stop_tracing_opcode != 0) { + if (stop_tracing_opcode != 0) { assert(stop_tracing_opcode == _EXIT_TRACE); - ADD_TO_TRACE(stop_tracing_opcode, 0, 0, target); + if (is_first_instr) { + ADD_TO_TRACE(_JUMP_TO_TOP, 0, 0, target); + } + else { + ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); + } goto done; } - // Function entry executor, trace over it to form a longer trace. + // Executor, trace over it to form a longer trace. // Otherwise, we end up with fragmented loop traces that have bad performance. + // The only exception is if we see another loop trace. In that case, we link to it. if (opcode == ENTER_EXECUTOR) { + DPRINTF(2, "ENTER_EXECUTOR seen\n"); _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; int orig_opcode = executor->vm_data.opcode; - assert(orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME); + assert(orig_opcode != JUMP_BACKWARD_JIT && + orig_opcode != JUMP_BACKWARD && + orig_opcode != JUMP_BACKWARD_NO_INTERRUPT && + orig_opcode != JUMP_BACKWARD_NO_JIT); oparg = (oparg & ~255) | executor->vm_data.oparg; opcode = orig_opcode; } @@ -822,7 +835,6 @@ _PyJit_translate_single_bytecode_to_trace( _Py_CODEUNIT *computed_jump_instr = computed_next_instr_without_modifiers + oparg; assert(next_instr == computed_next_instr || next_instr == computed_jump_instr); int jump_happened = computed_jump_instr == next_instr; - assert(jump_happened == (target_instr[1].cache & 1)); uint32_t uopcode = BRANCH_TO_GUARD[opcode - POP_JUMP_IF_FALSE][jump_happened]; ADD_TO_TRACE(uopcode, 0, 0, INSTR_IP(jump_happened ? computed_next_instr : computed_jump_instr, old_code)); break; @@ -993,9 +1005,6 @@ _PyJit_translate_single_bytecode_to_trace( } ADD_TO_TRACE(guard_ip, 0, (uintptr_t)next_instr, 0); } - // Loop back to the start - int is_first_instr = _tstate->jit_tracer_state.initial_state.close_loop_instr == next_instr || - _tstate->jit_tracer_state.initial_state.start_instr == next_instr; if (is_first_instr && _tstate->jit_tracer_state.prev_state.code_curr_size > CODE_SIZE_NO_PROGRESS) { if (needs_guard_ip) { ADD_TO_TRACE(_SET_IP, 0, (uintptr_t)next_instr, 0); @@ -1764,7 +1773,7 @@ _Py_ExecutorDetach(_PyExecutorObject *executor) assert(instruction->op.code == ENTER_EXECUTOR); int index = instruction->op.arg; assert(code->co_executors->executors[index] == executor); - instruction->op.code = executor->vm_data.opcode; + instruction->op.code = _PyOpcode_Deopt[executor->vm_data.opcode]; instruction->op.arg = executor->vm_data.oparg; executor->vm_data.code = NULL; code->co_executors->executors[index] = NULL; From fafd6c011d2af89774499c2bcfeb5e4ffeced394 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 16:03:16 +0000 Subject: [PATCH 29/43] make RESUME tracing a single attempt --- Include/internal/pycore_opcode_metadata.h | 2 +- Python/bytecodes.c | 8 +++++--- Python/ceval.c | 20 ++++++++++---------- Python/generated_cases.c.h | 10 ++++++++-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index e27c261cf2653d..dc7d7c4decd7e0 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1267,7 +1267,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RESERVED] = { true, INSTR_FMT_IX, 0 }, [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, - [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, + [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 04ff36ec8811bd..17fc061cc7081d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -2993,11 +2993,13 @@ dummy_func( } // For some reason, RESUME_CHECK_JIT is quite expensive compared to RESUME. // It's enough to show up as a 10-20% slowdown in some benchmarks! - // For that reason, we replace it back with RESUME immediately. + // For that reason, we replace it back with RESUME_CHECK immediately. + // This also means that function entry tracing is practically a single attempt. // In JIT builds, we thus stick only to RESUME and wait for it to specialize to RESUME_CHECK_JIT. - // This amkes RESUME slightly slower, but since the JIT is faster it makes up for it. + // This makes RESUME slightly slower on JIT builds, but since the JIT is faster it makes up for it. if (is_resume) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME); + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_resume_backoff_counter()); } #endif } diff --git a/Python/ceval.c b/Python/ceval.c index 8ca46fc627a3d8..3ecbc6e8c2aae6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1468,16 +1468,16 @@ stop_tracing_and_jit(PyThreadState *tstate, _PyInterpreterFrame *frame) // Deal with backoffs _PyExitData *exit = _tstate->jit_tracer_state.initial_state.exit; if (exit == NULL) { - // We hold a strong reference to the code object, so the instruction won't be freed. - if (err <= 0) { - _Py_BackoffCounter counter = _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter; - _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter = restart_backoff_counter(counter); - } - else { - int origin_opcode = _tstate->jit_tracer_state.initial_state.trace_origin_opcode; - assert(origin_opcode == JUMP_BACKWARD_JIT || origin_opcode == RESUME_CHECK_JIT); - _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter = origin_opcode == JUMP_BACKWARD_JIT - ? initial_jump_backoff_counter() : initial_resume_backoff_counter(); + int origin_opcode = _tstate->jit_tracer_state.initial_state.trace_origin_opcode; + if (origin_opcode == JUMP_BACKWARD_JIT) { + // We hold a strong reference to the code object, so the instruction won't be freed. + if (err <= 0) { + _Py_BackoffCounter counter = _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter; + _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter = restart_backoff_counter(counter); + } + else { + _tstate->jit_tracer_state.initial_state.trace_enter_instr[1].counter = initial_jump_backoff_counter(); + } } } else { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 2c39132d17d035..e91bc3f845cb76 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7329,7 +7329,10 @@ ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } if (is_resume) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME); + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + _PyFrame_SetStackPointer(frame, stack_pointer); + FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_resume_backoff_counter()); + stack_pointer = _PyFrame_GetStackPointer(frame); } #endif } @@ -10102,7 +10105,10 @@ ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } if (is_resume) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME); + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + _PyFrame_SetStackPointer(frame, stack_pointer); + FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_resume_backoff_counter()); + stack_pointer = _PyFrame_GetStackPointer(frame); } #endif } From 564677c1a3a37a0b06b6b6689c7e103eb3df9077 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 16:22:40 +0000 Subject: [PATCH 30/43] fix recursive generators slowdown --- Python/optimizer.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Python/optimizer.c b/Python/optimizer.c index 9709cd997975b2..19d00b9bc94183 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1006,6 +1006,15 @@ _PyJit_translate_single_bytecode_to_trace( ADD_TO_TRACE(guard_ip, 0, (uintptr_t)next_instr, 0); } if (is_first_instr && _tstate->jit_tracer_state.prev_state.code_curr_size > CODE_SIZE_NO_PROGRESS) { + // If this is a trunk function trace and we end with a _JUMP_TO_TOP, and + // we push a frame at the end, that indicates we are unrolling recursion which is bad news. + // We need dynamic exit stitching to support such cases, but for now, this is disabled. + if (_PyOpcode_Deopt[_tstate->jit_tracer_state.initial_state.trace_origin_opcode] == RESUME && + _tstate->jit_tracer_state.initial_state.exit == NULL && needs_guard_ip) { + trace_length = 0; + DPRINTF(2, "Trace is a function trace and heuristics indicate it's not likely worth it.\n"); + goto done; + } if (needs_guard_ip) { ADD_TO_TRACE(_SET_IP, 0, (uintptr_t)next_instr, 0); } From 176e78b99a091df396b6980cc530980e80b766a0 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Wed, 31 Dec 2025 23:41:40 +0000 Subject: [PATCH 31/43] Don't trace underflows for RESUMEs --- Include/internal/pycore_tstate.h | 1 + Include/internal/pycore_uop_ids.h | 1586 +++++++++++++++-------------- Python/bytecodes.c | 48 +- Python/executor_cases.c.h | 2 + Python/generated_cases.c.h | 59 +- Python/optimizer.c | 28 +- Python/optimizer_cases.c.h | 2 + 7 files changed, 873 insertions(+), 853 deletions(-) diff --git a/Include/internal/pycore_tstate.h b/Include/internal/pycore_tstate.h index 3cce68e366e4c7..18d3c9095051ba 100644 --- a/Include/internal/pycore_tstate.h +++ b/Include/internal/pycore_tstate.h @@ -36,6 +36,7 @@ typedef struct _PyJitTracerInitialState { _Py_CODEUNIT *start_instr; _Py_CODEUNIT *close_loop_instr; _Py_CODEUNIT *trace_enter_instr; + struct _PyInterpreterFrame *frame; } _PyJitTracerInitialState; typedef struct _PyJitTracerPreviousState { diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index cbd8511d93d009..4cff3ae6cf090a 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -303,817 +303,819 @@ extern "C" { #define _PUSH_NULL_CONDITIONAL 518 #define _PY_FRAME_GENERAL 519 #define _PY_FRAME_KW 520 -#define _REPLACE_WITH_TRUE 521 -#define _RESUME_CHECK 522 +#define _QUICKEN_TO_RESUME_CHECK 521 +#define _REPLACE_WITH_TRUE 522 +#define _RESUME_CHECK 523 #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 523 -#define _SEND 524 -#define _SEND_GEN_FRAME 525 +#define _SAVE_RETURN_OFFSET 524 +#define _SEND 525 +#define _SEND_GEN_FRAME 526 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 526 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 527 -#define _SPILL_OR_RELOAD 528 -#define _START_EXECUTOR 529 -#define _STORE_ATTR 530 -#define _STORE_ATTR_INSTANCE_VALUE 531 -#define _STORE_ATTR_SLOT 532 -#define _STORE_ATTR_WITH_HINT 533 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 527 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 528 +#define _SPILL_OR_RELOAD 529 +#define _START_EXECUTOR 530 +#define _STORE_ATTR 531 +#define _STORE_ATTR_INSTANCE_VALUE 532 +#define _STORE_ATTR_SLOT 533 +#define _STORE_ATTR_WITH_HINT 534 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 534 -#define _STORE_FAST_0 535 -#define _STORE_FAST_1 536 -#define _STORE_FAST_2 537 -#define _STORE_FAST_3 538 -#define _STORE_FAST_4 539 -#define _STORE_FAST_5 540 -#define _STORE_FAST_6 541 -#define _STORE_FAST_7 542 +#define _STORE_FAST 535 +#define _STORE_FAST_0 536 +#define _STORE_FAST_1 537 +#define _STORE_FAST_2 538 +#define _STORE_FAST_3 539 +#define _STORE_FAST_4 540 +#define _STORE_FAST_5 541 +#define _STORE_FAST_6 542 +#define _STORE_FAST_7 543 #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 543 -#define _STORE_SUBSCR 544 -#define _STORE_SUBSCR_DICT 545 -#define _STORE_SUBSCR_LIST_INT 546 -#define _SWAP 547 -#define _SWAP_2 548 -#define _SWAP_3 549 -#define _TIER2_RESUME_CHECK 550 -#define _TO_BOOL 551 +#define _STORE_SLICE 544 +#define _STORE_SUBSCR 545 +#define _STORE_SUBSCR_DICT 546 +#define _STORE_SUBSCR_LIST_INT 547 +#define _SWAP 548 +#define _SWAP_2 549 +#define _SWAP_3 550 +#define _TIER2_RESUME_CHECK 551 +#define _TO_BOOL 552 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 552 +#define _TO_BOOL_LIST 553 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 553 +#define _TO_BOOL_STR 554 #define _TRACE_RECORD TRACE_RECORD #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 554 -#define _UNPACK_SEQUENCE_LIST 555 -#define _UNPACK_SEQUENCE_TUPLE 556 -#define _UNPACK_SEQUENCE_TWO_TUPLE 557 +#define _UNPACK_SEQUENCE 555 +#define _UNPACK_SEQUENCE_LIST 556 +#define _UNPACK_SEQUENCE_TUPLE 557 +#define _UNPACK_SEQUENCE_TWO_TUPLE 558 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 557 -#define _BINARY_OP_r21 558 -#define _BINARY_OP_ADD_FLOAT_r03 559 -#define _BINARY_OP_ADD_FLOAT_r13 560 -#define _BINARY_OP_ADD_FLOAT_r23 561 -#define _BINARY_OP_ADD_INT_r03 562 -#define _BINARY_OP_ADD_INT_r13 563 -#define _BINARY_OP_ADD_INT_r23 564 -#define _BINARY_OP_ADD_UNICODE_r03 565 -#define _BINARY_OP_ADD_UNICODE_r13 566 -#define _BINARY_OP_ADD_UNICODE_r23 567 -#define _BINARY_OP_EXTEND_r21 568 -#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 569 -#define _BINARY_OP_MULTIPLY_FLOAT_r03 570 -#define _BINARY_OP_MULTIPLY_FLOAT_r13 571 -#define _BINARY_OP_MULTIPLY_FLOAT_r23 572 -#define _BINARY_OP_MULTIPLY_INT_r03 573 -#define _BINARY_OP_MULTIPLY_INT_r13 574 -#define _BINARY_OP_MULTIPLY_INT_r23 575 -#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 576 -#define _BINARY_OP_SUBSCR_DICT_r21 577 -#define _BINARY_OP_SUBSCR_INIT_CALL_r01 578 -#define _BINARY_OP_SUBSCR_INIT_CALL_r11 579 -#define _BINARY_OP_SUBSCR_INIT_CALL_r21 580 -#define _BINARY_OP_SUBSCR_INIT_CALL_r31 581 -#define _BINARY_OP_SUBSCR_LIST_INT_r23 582 -#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 583 -#define _BINARY_OP_SUBSCR_STR_INT_r23 584 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 585 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 586 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 587 -#define _BINARY_OP_SUBTRACT_FLOAT_r03 588 -#define _BINARY_OP_SUBTRACT_FLOAT_r13 589 -#define _BINARY_OP_SUBTRACT_FLOAT_r23 590 -#define _BINARY_OP_SUBTRACT_INT_r03 591 -#define _BINARY_OP_SUBTRACT_INT_r13 592 -#define _BINARY_OP_SUBTRACT_INT_r23 593 -#define _BINARY_SLICE_r31 594 -#define _BUILD_INTERPOLATION_r01 595 -#define _BUILD_LIST_r01 596 -#define _BUILD_MAP_r01 597 -#define _BUILD_SET_r01 598 -#define _BUILD_SLICE_r01 599 -#define _BUILD_STRING_r01 600 -#define _BUILD_TEMPLATE_r21 601 -#define _BUILD_TUPLE_r01 602 -#define _CALL_BUILTIN_CLASS_r01 603 -#define _CALL_BUILTIN_FAST_r01 604 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 605 -#define _CALL_BUILTIN_O_r03 606 -#define _CALL_INTRINSIC_1_r11 607 -#define _CALL_INTRINSIC_2_r21 608 -#define _CALL_ISINSTANCE_r31 609 -#define _CALL_KW_NON_PY_r11 610 -#define _CALL_LEN_r33 611 -#define _CALL_LIST_APPEND_r03 612 -#define _CALL_LIST_APPEND_r13 613 -#define _CALL_LIST_APPEND_r23 614 -#define _CALL_LIST_APPEND_r33 615 -#define _CALL_METHOD_DESCRIPTOR_FAST_r01 616 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 617 -#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 618 -#define _CALL_METHOD_DESCRIPTOR_O_r01 619 -#define _CALL_NON_PY_GENERAL_r01 620 -#define _CALL_STR_1_r32 621 -#define _CALL_TUPLE_1_r32 622 -#define _CALL_TYPE_1_r02 623 -#define _CALL_TYPE_1_r12 624 -#define _CALL_TYPE_1_r22 625 -#define _CALL_TYPE_1_r32 626 -#define _CHECK_AND_ALLOCATE_OBJECT_r00 627 -#define _CHECK_ATTR_CLASS_r01 628 -#define _CHECK_ATTR_CLASS_r11 629 -#define _CHECK_ATTR_CLASS_r22 630 -#define _CHECK_ATTR_CLASS_r33 631 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 632 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 633 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 634 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 635 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 636 -#define _CHECK_EG_MATCH_r22 637 -#define _CHECK_EXC_MATCH_r22 638 -#define _CHECK_FUNCTION_EXACT_ARGS_r00 639 -#define _CHECK_FUNCTION_VERSION_r00 640 -#define _CHECK_FUNCTION_VERSION_INLINE_r00 641 -#define _CHECK_FUNCTION_VERSION_INLINE_r11 642 -#define _CHECK_FUNCTION_VERSION_INLINE_r22 643 -#define _CHECK_FUNCTION_VERSION_INLINE_r33 644 -#define _CHECK_FUNCTION_VERSION_KW_r11 645 -#define _CHECK_IS_NOT_PY_CALLABLE_r00 646 -#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 647 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 648 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 649 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 650 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 651 -#define _CHECK_METHOD_VERSION_r00 652 -#define _CHECK_METHOD_VERSION_KW_r11 653 -#define _CHECK_PEP_523_r00 654 -#define _CHECK_PEP_523_r11 655 -#define _CHECK_PEP_523_r22 656 -#define _CHECK_PEP_523_r33 657 -#define _CHECK_PERIODIC_r00 658 -#define _CHECK_PERIODIC_AT_END_r00 659 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 660 -#define _CHECK_RECURSION_REMAINING_r00 661 -#define _CHECK_RECURSION_REMAINING_r11 662 -#define _CHECK_RECURSION_REMAINING_r22 663 -#define _CHECK_RECURSION_REMAINING_r33 664 -#define _CHECK_STACK_SPACE_r00 665 -#define _CHECK_STACK_SPACE_OPERAND_r00 666 -#define _CHECK_STACK_SPACE_OPERAND_r11 667 -#define _CHECK_STACK_SPACE_OPERAND_r22 668 -#define _CHECK_STACK_SPACE_OPERAND_r33 669 -#define _CHECK_VALIDITY_r00 670 -#define _CHECK_VALIDITY_r11 671 -#define _CHECK_VALIDITY_r22 672 -#define _CHECK_VALIDITY_r33 673 -#define _COLD_DYNAMIC_EXIT_r00 674 -#define _COLD_EXIT_r00 675 -#define _COMPARE_OP_r21 676 -#define _COMPARE_OP_FLOAT_r03 677 -#define _COMPARE_OP_FLOAT_r13 678 -#define _COMPARE_OP_FLOAT_r23 679 -#define _COMPARE_OP_INT_r23 680 -#define _COMPARE_OP_STR_r23 681 -#define _CONTAINS_OP_r21 682 -#define _CONTAINS_OP_DICT_r21 683 -#define _CONTAINS_OP_SET_r21 684 -#define _CONVERT_VALUE_r11 685 -#define _COPY_r01 686 -#define _COPY_1_r02 687 -#define _COPY_1_r12 688 -#define _COPY_1_r23 689 -#define _COPY_2_r03 690 -#define _COPY_2_r13 691 -#define _COPY_2_r23 692 -#define _COPY_3_r03 693 -#define _COPY_3_r13 694 -#define _COPY_3_r23 695 -#define _COPY_3_r33 696 -#define _COPY_FREE_VARS_r00 697 -#define _COPY_FREE_VARS_r11 698 -#define _COPY_FREE_VARS_r22 699 -#define _COPY_FREE_VARS_r33 700 -#define _CREATE_INIT_FRAME_r01 701 -#define _DELETE_ATTR_r10 702 -#define _DELETE_DEREF_r00 703 -#define _DELETE_FAST_r00 704 -#define _DELETE_GLOBAL_r00 705 -#define _DELETE_NAME_r00 706 -#define _DELETE_SUBSCR_r20 707 -#define _DEOPT_r00 708 -#define _DEOPT_r10 709 -#define _DEOPT_r20 710 -#define _DEOPT_r30 711 -#define _DICT_MERGE_r10 712 -#define _DICT_UPDATE_r10 713 -#define _DO_CALL_r01 714 -#define _DO_CALL_FUNCTION_EX_r31 715 -#define _DO_CALL_KW_r11 716 -#define _DYNAMIC_EXIT_r00 717 -#define _DYNAMIC_EXIT_r10 718 -#define _DYNAMIC_EXIT_r20 719 -#define _DYNAMIC_EXIT_r30 720 -#define _END_FOR_r10 721 -#define _END_SEND_r21 722 -#define _ERROR_POP_N_r00 723 -#define _EXIT_INIT_CHECK_r10 724 -#define _EXIT_TRACE_r00 725 -#define _EXIT_TRACE_r10 726 -#define _EXIT_TRACE_r20 727 -#define _EXIT_TRACE_r30 728 -#define _EXPAND_METHOD_r00 729 -#define _EXPAND_METHOD_KW_r11 730 -#define _FATAL_ERROR_r00 731 -#define _FATAL_ERROR_r11 732 -#define _FATAL_ERROR_r22 733 -#define _FATAL_ERROR_r33 734 -#define _FORMAT_SIMPLE_r11 735 -#define _FORMAT_WITH_SPEC_r21 736 -#define _FOR_ITER_r23 737 -#define _FOR_ITER_GEN_FRAME_r03 738 -#define _FOR_ITER_GEN_FRAME_r13 739 -#define _FOR_ITER_GEN_FRAME_r23 740 -#define _FOR_ITER_TIER_TWO_r23 741 -#define _GET_AITER_r11 742 -#define _GET_ANEXT_r12 743 -#define _GET_AWAITABLE_r11 744 -#define _GET_ITER_r12 745 -#define _GET_LEN_r12 746 -#define _GET_YIELD_FROM_ITER_r11 747 -#define _GUARD_BINARY_OP_EXTEND_r22 748 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 749 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 750 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 751 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 752 -#define _GUARD_CALLABLE_ISINSTANCE_r03 753 -#define _GUARD_CALLABLE_ISINSTANCE_r13 754 -#define _GUARD_CALLABLE_ISINSTANCE_r23 755 -#define _GUARD_CALLABLE_ISINSTANCE_r33 756 -#define _GUARD_CALLABLE_LEN_r03 757 -#define _GUARD_CALLABLE_LEN_r13 758 -#define _GUARD_CALLABLE_LEN_r23 759 -#define _GUARD_CALLABLE_LEN_r33 760 -#define _GUARD_CALLABLE_LIST_APPEND_r03 761 -#define _GUARD_CALLABLE_LIST_APPEND_r13 762 -#define _GUARD_CALLABLE_LIST_APPEND_r23 763 -#define _GUARD_CALLABLE_LIST_APPEND_r33 764 -#define _GUARD_CALLABLE_STR_1_r03 765 -#define _GUARD_CALLABLE_STR_1_r13 766 -#define _GUARD_CALLABLE_STR_1_r23 767 -#define _GUARD_CALLABLE_STR_1_r33 768 -#define _GUARD_CALLABLE_TUPLE_1_r03 769 -#define _GUARD_CALLABLE_TUPLE_1_r13 770 -#define _GUARD_CALLABLE_TUPLE_1_r23 771 -#define _GUARD_CALLABLE_TUPLE_1_r33 772 -#define _GUARD_CALLABLE_TYPE_1_r03 773 -#define _GUARD_CALLABLE_TYPE_1_r13 774 -#define _GUARD_CALLABLE_TYPE_1_r23 775 -#define _GUARD_CALLABLE_TYPE_1_r33 776 -#define _GUARD_DORV_NO_DICT_r01 777 -#define _GUARD_DORV_NO_DICT_r11 778 -#define _GUARD_DORV_NO_DICT_r22 779 -#define _GUARD_DORV_NO_DICT_r33 780 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 781 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 782 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 783 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 784 -#define _GUARD_GLOBALS_VERSION_r00 785 -#define _GUARD_GLOBALS_VERSION_r11 786 -#define _GUARD_GLOBALS_VERSION_r22 787 -#define _GUARD_GLOBALS_VERSION_r33 788 -#define _GUARD_IP_RETURN_GENERATOR_r00 789 -#define _GUARD_IP_RETURN_GENERATOR_r11 790 -#define _GUARD_IP_RETURN_GENERATOR_r22 791 -#define _GUARD_IP_RETURN_GENERATOR_r33 792 -#define _GUARD_IP_RETURN_VALUE_r00 793 -#define _GUARD_IP_RETURN_VALUE_r11 794 -#define _GUARD_IP_RETURN_VALUE_r22 795 -#define _GUARD_IP_RETURN_VALUE_r33 796 -#define _GUARD_IP_YIELD_VALUE_r00 797 -#define _GUARD_IP_YIELD_VALUE_r11 798 -#define _GUARD_IP_YIELD_VALUE_r22 799 -#define _GUARD_IP_YIELD_VALUE_r33 800 -#define _GUARD_IP__PUSH_FRAME_r00 801 -#define _GUARD_IP__PUSH_FRAME_r11 802 -#define _GUARD_IP__PUSH_FRAME_r22 803 -#define _GUARD_IP__PUSH_FRAME_r33 804 -#define _GUARD_IS_FALSE_POP_r00 805 -#define _GUARD_IS_FALSE_POP_r10 806 -#define _GUARD_IS_FALSE_POP_r21 807 -#define _GUARD_IS_FALSE_POP_r32 808 -#define _GUARD_IS_NONE_POP_r00 809 -#define _GUARD_IS_NONE_POP_r10 810 -#define _GUARD_IS_NONE_POP_r21 811 -#define _GUARD_IS_NONE_POP_r32 812 -#define _GUARD_IS_NOT_NONE_POP_r10 813 -#define _GUARD_IS_TRUE_POP_r00 814 -#define _GUARD_IS_TRUE_POP_r10 815 -#define _GUARD_IS_TRUE_POP_r21 816 -#define _GUARD_IS_TRUE_POP_r32 817 -#define _GUARD_KEYS_VERSION_r01 818 -#define _GUARD_KEYS_VERSION_r11 819 -#define _GUARD_KEYS_VERSION_r22 820 -#define _GUARD_KEYS_VERSION_r33 821 -#define _GUARD_NOS_DICT_r02 822 -#define _GUARD_NOS_DICT_r12 823 -#define _GUARD_NOS_DICT_r22 824 -#define _GUARD_NOS_DICT_r33 825 -#define _GUARD_NOS_FLOAT_r02 826 -#define _GUARD_NOS_FLOAT_r12 827 -#define _GUARD_NOS_FLOAT_r22 828 -#define _GUARD_NOS_FLOAT_r33 829 -#define _GUARD_NOS_INT_r02 830 -#define _GUARD_NOS_INT_r12 831 -#define _GUARD_NOS_INT_r22 832 -#define _GUARD_NOS_INT_r33 833 -#define _GUARD_NOS_LIST_r02 834 -#define _GUARD_NOS_LIST_r12 835 -#define _GUARD_NOS_LIST_r22 836 -#define _GUARD_NOS_LIST_r33 837 -#define _GUARD_NOS_NOT_NULL_r02 838 -#define _GUARD_NOS_NOT_NULL_r12 839 -#define _GUARD_NOS_NOT_NULL_r22 840 -#define _GUARD_NOS_NOT_NULL_r33 841 -#define _GUARD_NOS_NULL_r02 842 -#define _GUARD_NOS_NULL_r12 843 -#define _GUARD_NOS_NULL_r22 844 -#define _GUARD_NOS_NULL_r33 845 -#define _GUARD_NOS_OVERFLOWED_r02 846 -#define _GUARD_NOS_OVERFLOWED_r12 847 -#define _GUARD_NOS_OVERFLOWED_r22 848 -#define _GUARD_NOS_OVERFLOWED_r33 849 -#define _GUARD_NOS_TUPLE_r02 850 -#define _GUARD_NOS_TUPLE_r12 851 -#define _GUARD_NOS_TUPLE_r22 852 -#define _GUARD_NOS_TUPLE_r33 853 -#define _GUARD_NOS_UNICODE_r02 854 -#define _GUARD_NOS_UNICODE_r12 855 -#define _GUARD_NOS_UNICODE_r22 856 -#define _GUARD_NOS_UNICODE_r33 857 -#define _GUARD_NOT_EXHAUSTED_LIST_r02 858 -#define _GUARD_NOT_EXHAUSTED_LIST_r12 859 -#define _GUARD_NOT_EXHAUSTED_LIST_r22 860 -#define _GUARD_NOT_EXHAUSTED_LIST_r33 861 -#define _GUARD_NOT_EXHAUSTED_RANGE_r02 862 -#define _GUARD_NOT_EXHAUSTED_RANGE_r12 863 -#define _GUARD_NOT_EXHAUSTED_RANGE_r22 864 -#define _GUARD_NOT_EXHAUSTED_RANGE_r33 865 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 866 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 867 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 868 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 869 -#define _GUARD_THIRD_NULL_r03 870 -#define _GUARD_THIRD_NULL_r13 871 -#define _GUARD_THIRD_NULL_r23 872 -#define _GUARD_THIRD_NULL_r33 873 -#define _GUARD_TOS_ANY_SET_r01 874 -#define _GUARD_TOS_ANY_SET_r11 875 -#define _GUARD_TOS_ANY_SET_r22 876 -#define _GUARD_TOS_ANY_SET_r33 877 -#define _GUARD_TOS_DICT_r01 878 -#define _GUARD_TOS_DICT_r11 879 -#define _GUARD_TOS_DICT_r22 880 -#define _GUARD_TOS_DICT_r33 881 -#define _GUARD_TOS_FLOAT_r01 882 -#define _GUARD_TOS_FLOAT_r11 883 -#define _GUARD_TOS_FLOAT_r22 884 -#define _GUARD_TOS_FLOAT_r33 885 -#define _GUARD_TOS_INT_r01 886 -#define _GUARD_TOS_INT_r11 887 -#define _GUARD_TOS_INT_r22 888 -#define _GUARD_TOS_INT_r33 889 -#define _GUARD_TOS_LIST_r01 890 -#define _GUARD_TOS_LIST_r11 891 -#define _GUARD_TOS_LIST_r22 892 -#define _GUARD_TOS_LIST_r33 893 -#define _GUARD_TOS_OVERFLOWED_r01 894 -#define _GUARD_TOS_OVERFLOWED_r11 895 -#define _GUARD_TOS_OVERFLOWED_r22 896 -#define _GUARD_TOS_OVERFLOWED_r33 897 -#define _GUARD_TOS_SLICE_r01 898 -#define _GUARD_TOS_SLICE_r11 899 -#define _GUARD_TOS_SLICE_r22 900 -#define _GUARD_TOS_SLICE_r33 901 -#define _GUARD_TOS_TUPLE_r01 902 -#define _GUARD_TOS_TUPLE_r11 903 -#define _GUARD_TOS_TUPLE_r22 904 -#define _GUARD_TOS_TUPLE_r33 905 -#define _GUARD_TOS_UNICODE_r01 906 -#define _GUARD_TOS_UNICODE_r11 907 -#define _GUARD_TOS_UNICODE_r22 908 -#define _GUARD_TOS_UNICODE_r33 909 -#define _GUARD_TYPE_VERSION_r01 910 -#define _GUARD_TYPE_VERSION_r11 911 -#define _GUARD_TYPE_VERSION_r22 912 -#define _GUARD_TYPE_VERSION_r33 913 -#define _GUARD_TYPE_VERSION_AND_LOCK_r01 914 -#define _GUARD_TYPE_VERSION_AND_LOCK_r11 915 -#define _GUARD_TYPE_VERSION_AND_LOCK_r22 916 -#define _GUARD_TYPE_VERSION_AND_LOCK_r33 917 -#define _HANDLE_PENDING_AND_DEOPT_r00 918 -#define _HANDLE_PENDING_AND_DEOPT_r10 919 -#define _HANDLE_PENDING_AND_DEOPT_r20 920 -#define _HANDLE_PENDING_AND_DEOPT_r30 921 -#define _IMPORT_FROM_r12 922 -#define _IMPORT_NAME_r21 923 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 924 -#define _INIT_CALL_PY_EXACT_ARGS_r01 925 -#define _INIT_CALL_PY_EXACT_ARGS_0_r01 926 -#define _INIT_CALL_PY_EXACT_ARGS_1_r01 927 -#define _INIT_CALL_PY_EXACT_ARGS_2_r01 928 -#define _INIT_CALL_PY_EXACT_ARGS_3_r01 929 -#define _INIT_CALL_PY_EXACT_ARGS_4_r01 930 -#define _INSERT_NULL_r10 931 -#define _INSTRUMENTED_FOR_ITER_r23 932 -#define _INSTRUMENTED_INSTRUCTION_r00 933 -#define _INSTRUMENTED_JUMP_FORWARD_r00 934 -#define _INSTRUMENTED_JUMP_FORWARD_r11 935 -#define _INSTRUMENTED_JUMP_FORWARD_r22 936 -#define _INSTRUMENTED_JUMP_FORWARD_r33 937 -#define _INSTRUMENTED_LINE_r00 938 -#define _INSTRUMENTED_NOT_TAKEN_r00 939 -#define _INSTRUMENTED_NOT_TAKEN_r11 940 -#define _INSTRUMENTED_NOT_TAKEN_r22 941 -#define _INSTRUMENTED_NOT_TAKEN_r33 942 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 943 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 944 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 945 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 946 -#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 947 -#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 948 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 949 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 950 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 951 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 952 -#define _IS_NONE_r11 953 -#define _IS_OP_r03 954 -#define _IS_OP_r13 955 -#define _IS_OP_r23 956 -#define _ITER_CHECK_LIST_r02 957 -#define _ITER_CHECK_LIST_r12 958 -#define _ITER_CHECK_LIST_r22 959 -#define _ITER_CHECK_LIST_r33 960 -#define _ITER_CHECK_RANGE_r02 961 -#define _ITER_CHECK_RANGE_r12 962 -#define _ITER_CHECK_RANGE_r22 963 -#define _ITER_CHECK_RANGE_r33 964 -#define _ITER_CHECK_TUPLE_r02 965 -#define _ITER_CHECK_TUPLE_r12 966 -#define _ITER_CHECK_TUPLE_r22 967 -#define _ITER_CHECK_TUPLE_r33 968 -#define _ITER_JUMP_LIST_r02 969 -#define _ITER_JUMP_LIST_r12 970 -#define _ITER_JUMP_LIST_r22 971 -#define _ITER_JUMP_LIST_r33 972 -#define _ITER_JUMP_RANGE_r02 973 -#define _ITER_JUMP_RANGE_r12 974 -#define _ITER_JUMP_RANGE_r22 975 -#define _ITER_JUMP_RANGE_r33 976 -#define _ITER_JUMP_TUPLE_r02 977 -#define _ITER_JUMP_TUPLE_r12 978 -#define _ITER_JUMP_TUPLE_r22 979 -#define _ITER_JUMP_TUPLE_r33 980 -#define _ITER_NEXT_LIST_r23 981 -#define _ITER_NEXT_LIST_TIER_TWO_r23 982 -#define _ITER_NEXT_RANGE_r03 983 -#define _ITER_NEXT_RANGE_r13 984 -#define _ITER_NEXT_RANGE_r23 985 -#define _ITER_NEXT_TUPLE_r03 986 -#define _ITER_NEXT_TUPLE_r13 987 -#define _ITER_NEXT_TUPLE_r23 988 -#define _JUMP_BACKWARD_NO_INTERRUPT_r00 989 -#define _JUMP_BACKWARD_NO_INTERRUPT_r11 990 -#define _JUMP_BACKWARD_NO_INTERRUPT_r22 991 -#define _JUMP_BACKWARD_NO_INTERRUPT_r33 992 -#define _JUMP_TO_TOP_r00 993 -#define _LIST_APPEND_r10 994 -#define _LIST_EXTEND_r10 995 -#define _LOAD_ATTR_r10 996 -#define _LOAD_ATTR_CLASS_r11 997 -#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 998 -#define _LOAD_ATTR_INSTANCE_VALUE_r02 999 -#define _LOAD_ATTR_INSTANCE_VALUE_r12 1000 -#define _LOAD_ATTR_INSTANCE_VALUE_r23 1001 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1002 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1003 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1004 -#define _LOAD_ATTR_METHOD_NO_DICT_r02 1005 -#define _LOAD_ATTR_METHOD_NO_DICT_r12 1006 -#define _LOAD_ATTR_METHOD_NO_DICT_r23 1007 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1008 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1009 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1010 -#define _LOAD_ATTR_MODULE_r11 1011 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1012 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1013 -#define _LOAD_ATTR_PROPERTY_FRAME_r11 1014 -#define _LOAD_ATTR_SLOT_r11 1015 -#define _LOAD_ATTR_WITH_HINT_r12 1016 -#define _LOAD_BUILD_CLASS_r01 1017 -#define _LOAD_BYTECODE_r00 1018 -#define _LOAD_COMMON_CONSTANT_r01 1019 -#define _LOAD_COMMON_CONSTANT_r12 1020 -#define _LOAD_COMMON_CONSTANT_r23 1021 -#define _LOAD_CONST_r01 1022 -#define _LOAD_CONST_r12 1023 -#define _LOAD_CONST_r23 1024 -#define _LOAD_CONST_INLINE_r01 1025 -#define _LOAD_CONST_INLINE_r12 1026 -#define _LOAD_CONST_INLINE_r23 1027 -#define _LOAD_CONST_INLINE_BORROW_r01 1028 -#define _LOAD_CONST_INLINE_BORROW_r12 1029 -#define _LOAD_CONST_INLINE_BORROW_r23 1030 -#define _LOAD_CONST_UNDER_INLINE_r02 1031 -#define _LOAD_CONST_UNDER_INLINE_r12 1032 -#define _LOAD_CONST_UNDER_INLINE_r23 1033 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1034 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1035 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1036 -#define _LOAD_DEREF_r01 1037 -#define _LOAD_FAST_r01 1038 -#define _LOAD_FAST_r12 1039 -#define _LOAD_FAST_r23 1040 -#define _LOAD_FAST_0_r01 1041 -#define _LOAD_FAST_0_r12 1042 -#define _LOAD_FAST_0_r23 1043 -#define _LOAD_FAST_1_r01 1044 -#define _LOAD_FAST_1_r12 1045 -#define _LOAD_FAST_1_r23 1046 -#define _LOAD_FAST_2_r01 1047 -#define _LOAD_FAST_2_r12 1048 -#define _LOAD_FAST_2_r23 1049 -#define _LOAD_FAST_3_r01 1050 -#define _LOAD_FAST_3_r12 1051 -#define _LOAD_FAST_3_r23 1052 -#define _LOAD_FAST_4_r01 1053 -#define _LOAD_FAST_4_r12 1054 -#define _LOAD_FAST_4_r23 1055 -#define _LOAD_FAST_5_r01 1056 -#define _LOAD_FAST_5_r12 1057 -#define _LOAD_FAST_5_r23 1058 -#define _LOAD_FAST_6_r01 1059 -#define _LOAD_FAST_6_r12 1060 -#define _LOAD_FAST_6_r23 1061 -#define _LOAD_FAST_7_r01 1062 -#define _LOAD_FAST_7_r12 1063 -#define _LOAD_FAST_7_r23 1064 -#define _LOAD_FAST_AND_CLEAR_r01 1065 -#define _LOAD_FAST_AND_CLEAR_r12 1066 -#define _LOAD_FAST_AND_CLEAR_r23 1067 -#define _LOAD_FAST_BORROW_r01 1068 -#define _LOAD_FAST_BORROW_r12 1069 -#define _LOAD_FAST_BORROW_r23 1070 -#define _LOAD_FAST_BORROW_0_r01 1071 -#define _LOAD_FAST_BORROW_0_r12 1072 -#define _LOAD_FAST_BORROW_0_r23 1073 -#define _LOAD_FAST_BORROW_1_r01 1074 -#define _LOAD_FAST_BORROW_1_r12 1075 -#define _LOAD_FAST_BORROW_1_r23 1076 -#define _LOAD_FAST_BORROW_2_r01 1077 -#define _LOAD_FAST_BORROW_2_r12 1078 -#define _LOAD_FAST_BORROW_2_r23 1079 -#define _LOAD_FAST_BORROW_3_r01 1080 -#define _LOAD_FAST_BORROW_3_r12 1081 -#define _LOAD_FAST_BORROW_3_r23 1082 -#define _LOAD_FAST_BORROW_4_r01 1083 -#define _LOAD_FAST_BORROW_4_r12 1084 -#define _LOAD_FAST_BORROW_4_r23 1085 -#define _LOAD_FAST_BORROW_5_r01 1086 -#define _LOAD_FAST_BORROW_5_r12 1087 -#define _LOAD_FAST_BORROW_5_r23 1088 -#define _LOAD_FAST_BORROW_6_r01 1089 -#define _LOAD_FAST_BORROW_6_r12 1090 -#define _LOAD_FAST_BORROW_6_r23 1091 -#define _LOAD_FAST_BORROW_7_r01 1092 -#define _LOAD_FAST_BORROW_7_r12 1093 -#define _LOAD_FAST_BORROW_7_r23 1094 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1095 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1096 -#define _LOAD_FAST_CHECK_r01 1097 -#define _LOAD_FAST_CHECK_r12 1098 -#define _LOAD_FAST_CHECK_r23 1099 -#define _LOAD_FAST_LOAD_FAST_r02 1100 -#define _LOAD_FAST_LOAD_FAST_r13 1101 -#define _LOAD_FROM_DICT_OR_DEREF_r11 1102 -#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1103 -#define _LOAD_GLOBAL_r00 1104 -#define _LOAD_GLOBAL_BUILTINS_r01 1105 -#define _LOAD_GLOBAL_MODULE_r01 1106 -#define _LOAD_LOCALS_r01 1107 -#define _LOAD_LOCALS_r12 1108 -#define _LOAD_LOCALS_r23 1109 -#define _LOAD_NAME_r01 1110 -#define _LOAD_SMALL_INT_r01 1111 -#define _LOAD_SMALL_INT_r12 1112 -#define _LOAD_SMALL_INT_r23 1113 -#define _LOAD_SMALL_INT_0_r01 1114 -#define _LOAD_SMALL_INT_0_r12 1115 -#define _LOAD_SMALL_INT_0_r23 1116 -#define _LOAD_SMALL_INT_1_r01 1117 -#define _LOAD_SMALL_INT_1_r12 1118 -#define _LOAD_SMALL_INT_1_r23 1119 -#define _LOAD_SMALL_INT_2_r01 1120 -#define _LOAD_SMALL_INT_2_r12 1121 -#define _LOAD_SMALL_INT_2_r23 1122 -#define _LOAD_SMALL_INT_3_r01 1123 -#define _LOAD_SMALL_INT_3_r12 1124 -#define _LOAD_SMALL_INT_3_r23 1125 -#define _LOAD_SPECIAL_r00 1126 -#define _LOAD_SUPER_ATTR_ATTR_r31 1127 -#define _LOAD_SUPER_ATTR_METHOD_r32 1128 -#define _MAKE_CALLARGS_A_TUPLE_r33 1129 -#define _MAKE_CELL_r00 1130 -#define _MAKE_FUNCTION_r11 1131 -#define _MAKE_WARM_r00 1132 -#define _MAKE_WARM_r11 1133 -#define _MAKE_WARM_r22 1134 -#define _MAKE_WARM_r33 1135 -#define _MAP_ADD_r20 1136 -#define _MATCH_CLASS_r31 1137 -#define _MATCH_KEYS_r23 1138 -#define _MATCH_MAPPING_r02 1139 -#define _MATCH_MAPPING_r12 1140 -#define _MATCH_MAPPING_r23 1141 -#define _MATCH_SEQUENCE_r02 1142 -#define _MATCH_SEQUENCE_r12 1143 -#define _MATCH_SEQUENCE_r23 1144 -#define _MAYBE_EXPAND_METHOD_r00 1145 -#define _MAYBE_EXPAND_METHOD_KW_r11 1146 -#define _MONITOR_CALL_r00 1147 -#define _MONITOR_CALL_KW_r11 1148 -#define _MONITOR_JUMP_BACKWARD_r00 1149 -#define _MONITOR_JUMP_BACKWARD_r11 1150 -#define _MONITOR_JUMP_BACKWARD_r22 1151 -#define _MONITOR_JUMP_BACKWARD_r33 1152 -#define _MONITOR_RESUME_r00 1153 -#define _NOP_r00 1154 -#define _NOP_r11 1155 -#define _NOP_r22 1156 -#define _NOP_r33 1157 -#define _POP_CALL_r20 1158 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1159 -#define _POP_CALL_ONE_r30 1160 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1161 -#define _POP_CALL_TWO_r30 1162 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1163 -#define _POP_EXCEPT_r10 1164 -#define _POP_ITER_r20 1165 -#define _POP_JUMP_IF_FALSE_r00 1166 -#define _POP_JUMP_IF_FALSE_r10 1167 -#define _POP_JUMP_IF_FALSE_r21 1168 -#define _POP_JUMP_IF_FALSE_r32 1169 -#define _POP_JUMP_IF_TRUE_r00 1170 -#define _POP_JUMP_IF_TRUE_r10 1171 -#define _POP_JUMP_IF_TRUE_r21 1172 -#define _POP_JUMP_IF_TRUE_r32 1173 -#define _POP_TOP_r10 1174 -#define _POP_TOP_FLOAT_r00 1175 -#define _POP_TOP_FLOAT_r10 1176 -#define _POP_TOP_FLOAT_r21 1177 -#define _POP_TOP_FLOAT_r32 1178 -#define _POP_TOP_INT_r00 1179 -#define _POP_TOP_INT_r10 1180 -#define _POP_TOP_INT_r21 1181 -#define _POP_TOP_INT_r32 1182 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1183 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1184 -#define _POP_TOP_NOP_r00 1185 -#define _POP_TOP_NOP_r10 1186 -#define _POP_TOP_NOP_r21 1187 -#define _POP_TOP_NOP_r32 1188 -#define _POP_TOP_UNICODE_r00 1189 -#define _POP_TOP_UNICODE_r10 1190 -#define _POP_TOP_UNICODE_r21 1191 -#define _POP_TOP_UNICODE_r32 1192 -#define _POP_TWO_r20 1193 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1194 -#define _PUSH_EXC_INFO_r02 1195 -#define _PUSH_EXC_INFO_r12 1196 -#define _PUSH_EXC_INFO_r23 1197 -#define _PUSH_FRAME_r10 1198 -#define _PUSH_NULL_r01 1199 -#define _PUSH_NULL_r12 1200 -#define _PUSH_NULL_r23 1201 -#define _PUSH_NULL_CONDITIONAL_r00 1202 -#define _PY_FRAME_GENERAL_r01 1203 -#define _PY_FRAME_KW_r11 1204 -#define _REPLACE_WITH_TRUE_r11 1205 -#define _RESUME_CHECK_r00 1206 -#define _RESUME_CHECK_r11 1207 -#define _RESUME_CHECK_r22 1208 -#define _RESUME_CHECK_r33 1209 -#define _RETURN_GENERATOR_r01 1210 -#define _RETURN_VALUE_r11 1211 -#define _SAVE_RETURN_OFFSET_r00 1212 -#define _SAVE_RETURN_OFFSET_r11 1213 -#define _SAVE_RETURN_OFFSET_r22 1214 -#define _SAVE_RETURN_OFFSET_r33 1215 -#define _SEND_r22 1216 -#define _SEND_GEN_FRAME_r22 1217 -#define _SETUP_ANNOTATIONS_r00 1218 -#define _SET_ADD_r10 1219 -#define _SET_FUNCTION_ATTRIBUTE_r01 1220 -#define _SET_FUNCTION_ATTRIBUTE_r11 1221 -#define _SET_FUNCTION_ATTRIBUTE_r21 1222 -#define _SET_FUNCTION_ATTRIBUTE_r32 1223 -#define _SET_IP_r00 1224 -#define _SET_IP_r11 1225 -#define _SET_IP_r22 1226 -#define _SET_IP_r33 1227 -#define _SET_UPDATE_r10 1228 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1229 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1230 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1231 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1232 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1233 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1234 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1235 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1236 -#define _SPILL_OR_RELOAD_r01 1237 -#define _SPILL_OR_RELOAD_r02 1238 -#define _SPILL_OR_RELOAD_r03 1239 -#define _SPILL_OR_RELOAD_r10 1240 -#define _SPILL_OR_RELOAD_r12 1241 -#define _SPILL_OR_RELOAD_r13 1242 -#define _SPILL_OR_RELOAD_r20 1243 -#define _SPILL_OR_RELOAD_r21 1244 -#define _SPILL_OR_RELOAD_r23 1245 -#define _SPILL_OR_RELOAD_r30 1246 -#define _SPILL_OR_RELOAD_r31 1247 -#define _SPILL_OR_RELOAD_r32 1248 -#define _START_EXECUTOR_r00 1249 -#define _STORE_ATTR_r20 1250 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1251 -#define _STORE_ATTR_SLOT_r21 1252 -#define _STORE_ATTR_WITH_HINT_r21 1253 -#define _STORE_DEREF_r10 1254 -#define _STORE_FAST_r10 1255 -#define _STORE_FAST_0_r10 1256 -#define _STORE_FAST_1_r10 1257 -#define _STORE_FAST_2_r10 1258 -#define _STORE_FAST_3_r10 1259 -#define _STORE_FAST_4_r10 1260 -#define _STORE_FAST_5_r10 1261 -#define _STORE_FAST_6_r10 1262 -#define _STORE_FAST_7_r10 1263 -#define _STORE_FAST_LOAD_FAST_r11 1264 -#define _STORE_FAST_STORE_FAST_r20 1265 -#define _STORE_GLOBAL_r10 1266 -#define _STORE_NAME_r10 1267 -#define _STORE_SLICE_r30 1268 -#define _STORE_SUBSCR_r30 1269 -#define _STORE_SUBSCR_DICT_r31 1270 -#define _STORE_SUBSCR_LIST_INT_r32 1271 -#define _SWAP_r11 1272 -#define _SWAP_2_r02 1273 -#define _SWAP_2_r12 1274 -#define _SWAP_2_r22 1275 -#define _SWAP_2_r33 1276 -#define _SWAP_3_r03 1277 -#define _SWAP_3_r13 1278 -#define _SWAP_3_r23 1279 -#define _SWAP_3_r33 1280 -#define _TIER2_RESUME_CHECK_r00 1281 -#define _TIER2_RESUME_CHECK_r11 1282 -#define _TIER2_RESUME_CHECK_r22 1283 -#define _TIER2_RESUME_CHECK_r33 1284 -#define _TO_BOOL_r11 1285 -#define _TO_BOOL_BOOL_r01 1286 -#define _TO_BOOL_BOOL_r11 1287 -#define _TO_BOOL_BOOL_r22 1288 -#define _TO_BOOL_BOOL_r33 1289 -#define _TO_BOOL_INT_r11 1290 -#define _TO_BOOL_LIST_r11 1291 -#define _TO_BOOL_NONE_r01 1292 -#define _TO_BOOL_NONE_r11 1293 -#define _TO_BOOL_NONE_r22 1294 -#define _TO_BOOL_NONE_r33 1295 -#define _TO_BOOL_STR_r11 1296 -#define _TRACE_RECORD_r00 1297 -#define _UNARY_INVERT_r11 1298 -#define _UNARY_NEGATIVE_r11 1299 -#define _UNARY_NOT_r01 1300 -#define _UNARY_NOT_r11 1301 -#define _UNARY_NOT_r22 1302 -#define _UNARY_NOT_r33 1303 -#define _UNPACK_EX_r10 1304 -#define _UNPACK_SEQUENCE_r10 1305 -#define _UNPACK_SEQUENCE_LIST_r10 1306 -#define _UNPACK_SEQUENCE_TUPLE_r10 1307 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1308 -#define _WITH_EXCEPT_START_r33 1309 -#define _YIELD_VALUE_r11 1310 -#define MAX_UOP_REGS_ID 1310 +#define MAX_UOP_ID 558 +#define _BINARY_OP_r21 559 +#define _BINARY_OP_ADD_FLOAT_r03 560 +#define _BINARY_OP_ADD_FLOAT_r13 561 +#define _BINARY_OP_ADD_FLOAT_r23 562 +#define _BINARY_OP_ADD_INT_r03 563 +#define _BINARY_OP_ADD_INT_r13 564 +#define _BINARY_OP_ADD_INT_r23 565 +#define _BINARY_OP_ADD_UNICODE_r03 566 +#define _BINARY_OP_ADD_UNICODE_r13 567 +#define _BINARY_OP_ADD_UNICODE_r23 568 +#define _BINARY_OP_EXTEND_r21 569 +#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 570 +#define _BINARY_OP_MULTIPLY_FLOAT_r03 571 +#define _BINARY_OP_MULTIPLY_FLOAT_r13 572 +#define _BINARY_OP_MULTIPLY_FLOAT_r23 573 +#define _BINARY_OP_MULTIPLY_INT_r03 574 +#define _BINARY_OP_MULTIPLY_INT_r13 575 +#define _BINARY_OP_MULTIPLY_INT_r23 576 +#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 577 +#define _BINARY_OP_SUBSCR_DICT_r21 578 +#define _BINARY_OP_SUBSCR_INIT_CALL_r01 579 +#define _BINARY_OP_SUBSCR_INIT_CALL_r11 580 +#define _BINARY_OP_SUBSCR_INIT_CALL_r21 581 +#define _BINARY_OP_SUBSCR_INIT_CALL_r31 582 +#define _BINARY_OP_SUBSCR_LIST_INT_r23 583 +#define _BINARY_OP_SUBSCR_LIST_SLICE_r21 584 +#define _BINARY_OP_SUBSCR_STR_INT_r23 585 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 586 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 587 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 588 +#define _BINARY_OP_SUBTRACT_FLOAT_r03 589 +#define _BINARY_OP_SUBTRACT_FLOAT_r13 590 +#define _BINARY_OP_SUBTRACT_FLOAT_r23 591 +#define _BINARY_OP_SUBTRACT_INT_r03 592 +#define _BINARY_OP_SUBTRACT_INT_r13 593 +#define _BINARY_OP_SUBTRACT_INT_r23 594 +#define _BINARY_SLICE_r31 595 +#define _BUILD_INTERPOLATION_r01 596 +#define _BUILD_LIST_r01 597 +#define _BUILD_MAP_r01 598 +#define _BUILD_SET_r01 599 +#define _BUILD_SLICE_r01 600 +#define _BUILD_STRING_r01 601 +#define _BUILD_TEMPLATE_r21 602 +#define _BUILD_TUPLE_r01 603 +#define _CALL_BUILTIN_CLASS_r01 604 +#define _CALL_BUILTIN_FAST_r01 605 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 606 +#define _CALL_BUILTIN_O_r03 607 +#define _CALL_INTRINSIC_1_r11 608 +#define _CALL_INTRINSIC_2_r21 609 +#define _CALL_ISINSTANCE_r31 610 +#define _CALL_KW_NON_PY_r11 611 +#define _CALL_LEN_r33 612 +#define _CALL_LIST_APPEND_r03 613 +#define _CALL_LIST_APPEND_r13 614 +#define _CALL_LIST_APPEND_r23 615 +#define _CALL_LIST_APPEND_r33 616 +#define _CALL_METHOD_DESCRIPTOR_FAST_r01 617 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 618 +#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 619 +#define _CALL_METHOD_DESCRIPTOR_O_r01 620 +#define _CALL_NON_PY_GENERAL_r01 621 +#define _CALL_STR_1_r32 622 +#define _CALL_TUPLE_1_r32 623 +#define _CALL_TYPE_1_r02 624 +#define _CALL_TYPE_1_r12 625 +#define _CALL_TYPE_1_r22 626 +#define _CALL_TYPE_1_r32 627 +#define _CHECK_AND_ALLOCATE_OBJECT_r00 628 +#define _CHECK_ATTR_CLASS_r01 629 +#define _CHECK_ATTR_CLASS_r11 630 +#define _CHECK_ATTR_CLASS_r22 631 +#define _CHECK_ATTR_CLASS_r33 632 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 633 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 634 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 635 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 636 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 637 +#define _CHECK_EG_MATCH_r22 638 +#define _CHECK_EXC_MATCH_r22 639 +#define _CHECK_FUNCTION_EXACT_ARGS_r00 640 +#define _CHECK_FUNCTION_VERSION_r00 641 +#define _CHECK_FUNCTION_VERSION_INLINE_r00 642 +#define _CHECK_FUNCTION_VERSION_INLINE_r11 643 +#define _CHECK_FUNCTION_VERSION_INLINE_r22 644 +#define _CHECK_FUNCTION_VERSION_INLINE_r33 645 +#define _CHECK_FUNCTION_VERSION_KW_r11 646 +#define _CHECK_IS_NOT_PY_CALLABLE_r00 647 +#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 648 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 649 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 650 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 651 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 652 +#define _CHECK_METHOD_VERSION_r00 653 +#define _CHECK_METHOD_VERSION_KW_r11 654 +#define _CHECK_PEP_523_r00 655 +#define _CHECK_PEP_523_r11 656 +#define _CHECK_PEP_523_r22 657 +#define _CHECK_PEP_523_r33 658 +#define _CHECK_PERIODIC_r00 659 +#define _CHECK_PERIODIC_AT_END_r00 660 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 661 +#define _CHECK_RECURSION_REMAINING_r00 662 +#define _CHECK_RECURSION_REMAINING_r11 663 +#define _CHECK_RECURSION_REMAINING_r22 664 +#define _CHECK_RECURSION_REMAINING_r33 665 +#define _CHECK_STACK_SPACE_r00 666 +#define _CHECK_STACK_SPACE_OPERAND_r00 667 +#define _CHECK_STACK_SPACE_OPERAND_r11 668 +#define _CHECK_STACK_SPACE_OPERAND_r22 669 +#define _CHECK_STACK_SPACE_OPERAND_r33 670 +#define _CHECK_VALIDITY_r00 671 +#define _CHECK_VALIDITY_r11 672 +#define _CHECK_VALIDITY_r22 673 +#define _CHECK_VALIDITY_r33 674 +#define _COLD_DYNAMIC_EXIT_r00 675 +#define _COLD_EXIT_r00 676 +#define _COMPARE_OP_r21 677 +#define _COMPARE_OP_FLOAT_r03 678 +#define _COMPARE_OP_FLOAT_r13 679 +#define _COMPARE_OP_FLOAT_r23 680 +#define _COMPARE_OP_INT_r23 681 +#define _COMPARE_OP_STR_r23 682 +#define _CONTAINS_OP_r21 683 +#define _CONTAINS_OP_DICT_r21 684 +#define _CONTAINS_OP_SET_r21 685 +#define _CONVERT_VALUE_r11 686 +#define _COPY_r01 687 +#define _COPY_1_r02 688 +#define _COPY_1_r12 689 +#define _COPY_1_r23 690 +#define _COPY_2_r03 691 +#define _COPY_2_r13 692 +#define _COPY_2_r23 693 +#define _COPY_3_r03 694 +#define _COPY_3_r13 695 +#define _COPY_3_r23 696 +#define _COPY_3_r33 697 +#define _COPY_FREE_VARS_r00 698 +#define _COPY_FREE_VARS_r11 699 +#define _COPY_FREE_VARS_r22 700 +#define _COPY_FREE_VARS_r33 701 +#define _CREATE_INIT_FRAME_r01 702 +#define _DELETE_ATTR_r10 703 +#define _DELETE_DEREF_r00 704 +#define _DELETE_FAST_r00 705 +#define _DELETE_GLOBAL_r00 706 +#define _DELETE_NAME_r00 707 +#define _DELETE_SUBSCR_r20 708 +#define _DEOPT_r00 709 +#define _DEOPT_r10 710 +#define _DEOPT_r20 711 +#define _DEOPT_r30 712 +#define _DICT_MERGE_r10 713 +#define _DICT_UPDATE_r10 714 +#define _DO_CALL_r01 715 +#define _DO_CALL_FUNCTION_EX_r31 716 +#define _DO_CALL_KW_r11 717 +#define _DYNAMIC_EXIT_r00 718 +#define _DYNAMIC_EXIT_r10 719 +#define _DYNAMIC_EXIT_r20 720 +#define _DYNAMIC_EXIT_r30 721 +#define _END_FOR_r10 722 +#define _END_SEND_r21 723 +#define _ERROR_POP_N_r00 724 +#define _EXIT_INIT_CHECK_r10 725 +#define _EXIT_TRACE_r00 726 +#define _EXIT_TRACE_r10 727 +#define _EXIT_TRACE_r20 728 +#define _EXIT_TRACE_r30 729 +#define _EXPAND_METHOD_r00 730 +#define _EXPAND_METHOD_KW_r11 731 +#define _FATAL_ERROR_r00 732 +#define _FATAL_ERROR_r11 733 +#define _FATAL_ERROR_r22 734 +#define _FATAL_ERROR_r33 735 +#define _FORMAT_SIMPLE_r11 736 +#define _FORMAT_WITH_SPEC_r21 737 +#define _FOR_ITER_r23 738 +#define _FOR_ITER_GEN_FRAME_r03 739 +#define _FOR_ITER_GEN_FRAME_r13 740 +#define _FOR_ITER_GEN_FRAME_r23 741 +#define _FOR_ITER_TIER_TWO_r23 742 +#define _GET_AITER_r11 743 +#define _GET_ANEXT_r12 744 +#define _GET_AWAITABLE_r11 745 +#define _GET_ITER_r12 746 +#define _GET_LEN_r12 747 +#define _GET_YIELD_FROM_ITER_r11 748 +#define _GUARD_BINARY_OP_EXTEND_r22 749 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 750 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 751 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 752 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 753 +#define _GUARD_CALLABLE_ISINSTANCE_r03 754 +#define _GUARD_CALLABLE_ISINSTANCE_r13 755 +#define _GUARD_CALLABLE_ISINSTANCE_r23 756 +#define _GUARD_CALLABLE_ISINSTANCE_r33 757 +#define _GUARD_CALLABLE_LEN_r03 758 +#define _GUARD_CALLABLE_LEN_r13 759 +#define _GUARD_CALLABLE_LEN_r23 760 +#define _GUARD_CALLABLE_LEN_r33 761 +#define _GUARD_CALLABLE_LIST_APPEND_r03 762 +#define _GUARD_CALLABLE_LIST_APPEND_r13 763 +#define _GUARD_CALLABLE_LIST_APPEND_r23 764 +#define _GUARD_CALLABLE_LIST_APPEND_r33 765 +#define _GUARD_CALLABLE_STR_1_r03 766 +#define _GUARD_CALLABLE_STR_1_r13 767 +#define _GUARD_CALLABLE_STR_1_r23 768 +#define _GUARD_CALLABLE_STR_1_r33 769 +#define _GUARD_CALLABLE_TUPLE_1_r03 770 +#define _GUARD_CALLABLE_TUPLE_1_r13 771 +#define _GUARD_CALLABLE_TUPLE_1_r23 772 +#define _GUARD_CALLABLE_TUPLE_1_r33 773 +#define _GUARD_CALLABLE_TYPE_1_r03 774 +#define _GUARD_CALLABLE_TYPE_1_r13 775 +#define _GUARD_CALLABLE_TYPE_1_r23 776 +#define _GUARD_CALLABLE_TYPE_1_r33 777 +#define _GUARD_DORV_NO_DICT_r01 778 +#define _GUARD_DORV_NO_DICT_r11 779 +#define _GUARD_DORV_NO_DICT_r22 780 +#define _GUARD_DORV_NO_DICT_r33 781 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 782 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 783 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 784 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 785 +#define _GUARD_GLOBALS_VERSION_r00 786 +#define _GUARD_GLOBALS_VERSION_r11 787 +#define _GUARD_GLOBALS_VERSION_r22 788 +#define _GUARD_GLOBALS_VERSION_r33 789 +#define _GUARD_IP_RETURN_GENERATOR_r00 790 +#define _GUARD_IP_RETURN_GENERATOR_r11 791 +#define _GUARD_IP_RETURN_GENERATOR_r22 792 +#define _GUARD_IP_RETURN_GENERATOR_r33 793 +#define _GUARD_IP_RETURN_VALUE_r00 794 +#define _GUARD_IP_RETURN_VALUE_r11 795 +#define _GUARD_IP_RETURN_VALUE_r22 796 +#define _GUARD_IP_RETURN_VALUE_r33 797 +#define _GUARD_IP_YIELD_VALUE_r00 798 +#define _GUARD_IP_YIELD_VALUE_r11 799 +#define _GUARD_IP_YIELD_VALUE_r22 800 +#define _GUARD_IP_YIELD_VALUE_r33 801 +#define _GUARD_IP__PUSH_FRAME_r00 802 +#define _GUARD_IP__PUSH_FRAME_r11 803 +#define _GUARD_IP__PUSH_FRAME_r22 804 +#define _GUARD_IP__PUSH_FRAME_r33 805 +#define _GUARD_IS_FALSE_POP_r00 806 +#define _GUARD_IS_FALSE_POP_r10 807 +#define _GUARD_IS_FALSE_POP_r21 808 +#define _GUARD_IS_FALSE_POP_r32 809 +#define _GUARD_IS_NONE_POP_r00 810 +#define _GUARD_IS_NONE_POP_r10 811 +#define _GUARD_IS_NONE_POP_r21 812 +#define _GUARD_IS_NONE_POP_r32 813 +#define _GUARD_IS_NOT_NONE_POP_r10 814 +#define _GUARD_IS_TRUE_POP_r00 815 +#define _GUARD_IS_TRUE_POP_r10 816 +#define _GUARD_IS_TRUE_POP_r21 817 +#define _GUARD_IS_TRUE_POP_r32 818 +#define _GUARD_KEYS_VERSION_r01 819 +#define _GUARD_KEYS_VERSION_r11 820 +#define _GUARD_KEYS_VERSION_r22 821 +#define _GUARD_KEYS_VERSION_r33 822 +#define _GUARD_NOS_DICT_r02 823 +#define _GUARD_NOS_DICT_r12 824 +#define _GUARD_NOS_DICT_r22 825 +#define _GUARD_NOS_DICT_r33 826 +#define _GUARD_NOS_FLOAT_r02 827 +#define _GUARD_NOS_FLOAT_r12 828 +#define _GUARD_NOS_FLOAT_r22 829 +#define _GUARD_NOS_FLOAT_r33 830 +#define _GUARD_NOS_INT_r02 831 +#define _GUARD_NOS_INT_r12 832 +#define _GUARD_NOS_INT_r22 833 +#define _GUARD_NOS_INT_r33 834 +#define _GUARD_NOS_LIST_r02 835 +#define _GUARD_NOS_LIST_r12 836 +#define _GUARD_NOS_LIST_r22 837 +#define _GUARD_NOS_LIST_r33 838 +#define _GUARD_NOS_NOT_NULL_r02 839 +#define _GUARD_NOS_NOT_NULL_r12 840 +#define _GUARD_NOS_NOT_NULL_r22 841 +#define _GUARD_NOS_NOT_NULL_r33 842 +#define _GUARD_NOS_NULL_r02 843 +#define _GUARD_NOS_NULL_r12 844 +#define _GUARD_NOS_NULL_r22 845 +#define _GUARD_NOS_NULL_r33 846 +#define _GUARD_NOS_OVERFLOWED_r02 847 +#define _GUARD_NOS_OVERFLOWED_r12 848 +#define _GUARD_NOS_OVERFLOWED_r22 849 +#define _GUARD_NOS_OVERFLOWED_r33 850 +#define _GUARD_NOS_TUPLE_r02 851 +#define _GUARD_NOS_TUPLE_r12 852 +#define _GUARD_NOS_TUPLE_r22 853 +#define _GUARD_NOS_TUPLE_r33 854 +#define _GUARD_NOS_UNICODE_r02 855 +#define _GUARD_NOS_UNICODE_r12 856 +#define _GUARD_NOS_UNICODE_r22 857 +#define _GUARD_NOS_UNICODE_r33 858 +#define _GUARD_NOT_EXHAUSTED_LIST_r02 859 +#define _GUARD_NOT_EXHAUSTED_LIST_r12 860 +#define _GUARD_NOT_EXHAUSTED_LIST_r22 861 +#define _GUARD_NOT_EXHAUSTED_LIST_r33 862 +#define _GUARD_NOT_EXHAUSTED_RANGE_r02 863 +#define _GUARD_NOT_EXHAUSTED_RANGE_r12 864 +#define _GUARD_NOT_EXHAUSTED_RANGE_r22 865 +#define _GUARD_NOT_EXHAUSTED_RANGE_r33 866 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 867 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 868 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 869 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 870 +#define _GUARD_THIRD_NULL_r03 871 +#define _GUARD_THIRD_NULL_r13 872 +#define _GUARD_THIRD_NULL_r23 873 +#define _GUARD_THIRD_NULL_r33 874 +#define _GUARD_TOS_ANY_SET_r01 875 +#define _GUARD_TOS_ANY_SET_r11 876 +#define _GUARD_TOS_ANY_SET_r22 877 +#define _GUARD_TOS_ANY_SET_r33 878 +#define _GUARD_TOS_DICT_r01 879 +#define _GUARD_TOS_DICT_r11 880 +#define _GUARD_TOS_DICT_r22 881 +#define _GUARD_TOS_DICT_r33 882 +#define _GUARD_TOS_FLOAT_r01 883 +#define _GUARD_TOS_FLOAT_r11 884 +#define _GUARD_TOS_FLOAT_r22 885 +#define _GUARD_TOS_FLOAT_r33 886 +#define _GUARD_TOS_INT_r01 887 +#define _GUARD_TOS_INT_r11 888 +#define _GUARD_TOS_INT_r22 889 +#define _GUARD_TOS_INT_r33 890 +#define _GUARD_TOS_LIST_r01 891 +#define _GUARD_TOS_LIST_r11 892 +#define _GUARD_TOS_LIST_r22 893 +#define _GUARD_TOS_LIST_r33 894 +#define _GUARD_TOS_OVERFLOWED_r01 895 +#define _GUARD_TOS_OVERFLOWED_r11 896 +#define _GUARD_TOS_OVERFLOWED_r22 897 +#define _GUARD_TOS_OVERFLOWED_r33 898 +#define _GUARD_TOS_SLICE_r01 899 +#define _GUARD_TOS_SLICE_r11 900 +#define _GUARD_TOS_SLICE_r22 901 +#define _GUARD_TOS_SLICE_r33 902 +#define _GUARD_TOS_TUPLE_r01 903 +#define _GUARD_TOS_TUPLE_r11 904 +#define _GUARD_TOS_TUPLE_r22 905 +#define _GUARD_TOS_TUPLE_r33 906 +#define _GUARD_TOS_UNICODE_r01 907 +#define _GUARD_TOS_UNICODE_r11 908 +#define _GUARD_TOS_UNICODE_r22 909 +#define _GUARD_TOS_UNICODE_r33 910 +#define _GUARD_TYPE_VERSION_r01 911 +#define _GUARD_TYPE_VERSION_r11 912 +#define _GUARD_TYPE_VERSION_r22 913 +#define _GUARD_TYPE_VERSION_r33 914 +#define _GUARD_TYPE_VERSION_AND_LOCK_r01 915 +#define _GUARD_TYPE_VERSION_AND_LOCK_r11 916 +#define _GUARD_TYPE_VERSION_AND_LOCK_r22 917 +#define _GUARD_TYPE_VERSION_AND_LOCK_r33 918 +#define _HANDLE_PENDING_AND_DEOPT_r00 919 +#define _HANDLE_PENDING_AND_DEOPT_r10 920 +#define _HANDLE_PENDING_AND_DEOPT_r20 921 +#define _HANDLE_PENDING_AND_DEOPT_r30 922 +#define _IMPORT_FROM_r12 923 +#define _IMPORT_NAME_r21 924 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 925 +#define _INIT_CALL_PY_EXACT_ARGS_r01 926 +#define _INIT_CALL_PY_EXACT_ARGS_0_r01 927 +#define _INIT_CALL_PY_EXACT_ARGS_1_r01 928 +#define _INIT_CALL_PY_EXACT_ARGS_2_r01 929 +#define _INIT_CALL_PY_EXACT_ARGS_3_r01 930 +#define _INIT_CALL_PY_EXACT_ARGS_4_r01 931 +#define _INSERT_NULL_r10 932 +#define _INSTRUMENTED_FOR_ITER_r23 933 +#define _INSTRUMENTED_INSTRUCTION_r00 934 +#define _INSTRUMENTED_JUMP_FORWARD_r00 935 +#define _INSTRUMENTED_JUMP_FORWARD_r11 936 +#define _INSTRUMENTED_JUMP_FORWARD_r22 937 +#define _INSTRUMENTED_JUMP_FORWARD_r33 938 +#define _INSTRUMENTED_LINE_r00 939 +#define _INSTRUMENTED_NOT_TAKEN_r00 940 +#define _INSTRUMENTED_NOT_TAKEN_r11 941 +#define _INSTRUMENTED_NOT_TAKEN_r22 942 +#define _INSTRUMENTED_NOT_TAKEN_r33 943 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 944 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 945 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 946 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 947 +#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 948 +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 949 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 950 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 951 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 952 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 953 +#define _IS_NONE_r11 954 +#define _IS_OP_r03 955 +#define _IS_OP_r13 956 +#define _IS_OP_r23 957 +#define _ITER_CHECK_LIST_r02 958 +#define _ITER_CHECK_LIST_r12 959 +#define _ITER_CHECK_LIST_r22 960 +#define _ITER_CHECK_LIST_r33 961 +#define _ITER_CHECK_RANGE_r02 962 +#define _ITER_CHECK_RANGE_r12 963 +#define _ITER_CHECK_RANGE_r22 964 +#define _ITER_CHECK_RANGE_r33 965 +#define _ITER_CHECK_TUPLE_r02 966 +#define _ITER_CHECK_TUPLE_r12 967 +#define _ITER_CHECK_TUPLE_r22 968 +#define _ITER_CHECK_TUPLE_r33 969 +#define _ITER_JUMP_LIST_r02 970 +#define _ITER_JUMP_LIST_r12 971 +#define _ITER_JUMP_LIST_r22 972 +#define _ITER_JUMP_LIST_r33 973 +#define _ITER_JUMP_RANGE_r02 974 +#define _ITER_JUMP_RANGE_r12 975 +#define _ITER_JUMP_RANGE_r22 976 +#define _ITER_JUMP_RANGE_r33 977 +#define _ITER_JUMP_TUPLE_r02 978 +#define _ITER_JUMP_TUPLE_r12 979 +#define _ITER_JUMP_TUPLE_r22 980 +#define _ITER_JUMP_TUPLE_r33 981 +#define _ITER_NEXT_LIST_r23 982 +#define _ITER_NEXT_LIST_TIER_TWO_r23 983 +#define _ITER_NEXT_RANGE_r03 984 +#define _ITER_NEXT_RANGE_r13 985 +#define _ITER_NEXT_RANGE_r23 986 +#define _ITER_NEXT_TUPLE_r03 987 +#define _ITER_NEXT_TUPLE_r13 988 +#define _ITER_NEXT_TUPLE_r23 989 +#define _JUMP_BACKWARD_NO_INTERRUPT_r00 990 +#define _JUMP_BACKWARD_NO_INTERRUPT_r11 991 +#define _JUMP_BACKWARD_NO_INTERRUPT_r22 992 +#define _JUMP_BACKWARD_NO_INTERRUPT_r33 993 +#define _JUMP_TO_TOP_r00 994 +#define _LIST_APPEND_r10 995 +#define _LIST_EXTEND_r10 996 +#define _LOAD_ATTR_r10 997 +#define _LOAD_ATTR_CLASS_r11 998 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 999 +#define _LOAD_ATTR_INSTANCE_VALUE_r02 1000 +#define _LOAD_ATTR_INSTANCE_VALUE_r12 1001 +#define _LOAD_ATTR_INSTANCE_VALUE_r23 1002 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1003 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1004 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1005 +#define _LOAD_ATTR_METHOD_NO_DICT_r02 1006 +#define _LOAD_ATTR_METHOD_NO_DICT_r12 1007 +#define _LOAD_ATTR_METHOD_NO_DICT_r23 1008 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1009 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1010 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1011 +#define _LOAD_ATTR_MODULE_r11 1012 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1013 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1014 +#define _LOAD_ATTR_PROPERTY_FRAME_r11 1015 +#define _LOAD_ATTR_SLOT_r11 1016 +#define _LOAD_ATTR_WITH_HINT_r12 1017 +#define _LOAD_BUILD_CLASS_r01 1018 +#define _LOAD_BYTECODE_r00 1019 +#define _LOAD_COMMON_CONSTANT_r01 1020 +#define _LOAD_COMMON_CONSTANT_r12 1021 +#define _LOAD_COMMON_CONSTANT_r23 1022 +#define _LOAD_CONST_r01 1023 +#define _LOAD_CONST_r12 1024 +#define _LOAD_CONST_r23 1025 +#define _LOAD_CONST_INLINE_r01 1026 +#define _LOAD_CONST_INLINE_r12 1027 +#define _LOAD_CONST_INLINE_r23 1028 +#define _LOAD_CONST_INLINE_BORROW_r01 1029 +#define _LOAD_CONST_INLINE_BORROW_r12 1030 +#define _LOAD_CONST_INLINE_BORROW_r23 1031 +#define _LOAD_CONST_UNDER_INLINE_r02 1032 +#define _LOAD_CONST_UNDER_INLINE_r12 1033 +#define _LOAD_CONST_UNDER_INLINE_r23 1034 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1035 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1036 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1037 +#define _LOAD_DEREF_r01 1038 +#define _LOAD_FAST_r01 1039 +#define _LOAD_FAST_r12 1040 +#define _LOAD_FAST_r23 1041 +#define _LOAD_FAST_0_r01 1042 +#define _LOAD_FAST_0_r12 1043 +#define _LOAD_FAST_0_r23 1044 +#define _LOAD_FAST_1_r01 1045 +#define _LOAD_FAST_1_r12 1046 +#define _LOAD_FAST_1_r23 1047 +#define _LOAD_FAST_2_r01 1048 +#define _LOAD_FAST_2_r12 1049 +#define _LOAD_FAST_2_r23 1050 +#define _LOAD_FAST_3_r01 1051 +#define _LOAD_FAST_3_r12 1052 +#define _LOAD_FAST_3_r23 1053 +#define _LOAD_FAST_4_r01 1054 +#define _LOAD_FAST_4_r12 1055 +#define _LOAD_FAST_4_r23 1056 +#define _LOAD_FAST_5_r01 1057 +#define _LOAD_FAST_5_r12 1058 +#define _LOAD_FAST_5_r23 1059 +#define _LOAD_FAST_6_r01 1060 +#define _LOAD_FAST_6_r12 1061 +#define _LOAD_FAST_6_r23 1062 +#define _LOAD_FAST_7_r01 1063 +#define _LOAD_FAST_7_r12 1064 +#define _LOAD_FAST_7_r23 1065 +#define _LOAD_FAST_AND_CLEAR_r01 1066 +#define _LOAD_FAST_AND_CLEAR_r12 1067 +#define _LOAD_FAST_AND_CLEAR_r23 1068 +#define _LOAD_FAST_BORROW_r01 1069 +#define _LOAD_FAST_BORROW_r12 1070 +#define _LOAD_FAST_BORROW_r23 1071 +#define _LOAD_FAST_BORROW_0_r01 1072 +#define _LOAD_FAST_BORROW_0_r12 1073 +#define _LOAD_FAST_BORROW_0_r23 1074 +#define _LOAD_FAST_BORROW_1_r01 1075 +#define _LOAD_FAST_BORROW_1_r12 1076 +#define _LOAD_FAST_BORROW_1_r23 1077 +#define _LOAD_FAST_BORROW_2_r01 1078 +#define _LOAD_FAST_BORROW_2_r12 1079 +#define _LOAD_FAST_BORROW_2_r23 1080 +#define _LOAD_FAST_BORROW_3_r01 1081 +#define _LOAD_FAST_BORROW_3_r12 1082 +#define _LOAD_FAST_BORROW_3_r23 1083 +#define _LOAD_FAST_BORROW_4_r01 1084 +#define _LOAD_FAST_BORROW_4_r12 1085 +#define _LOAD_FAST_BORROW_4_r23 1086 +#define _LOAD_FAST_BORROW_5_r01 1087 +#define _LOAD_FAST_BORROW_5_r12 1088 +#define _LOAD_FAST_BORROW_5_r23 1089 +#define _LOAD_FAST_BORROW_6_r01 1090 +#define _LOAD_FAST_BORROW_6_r12 1091 +#define _LOAD_FAST_BORROW_6_r23 1092 +#define _LOAD_FAST_BORROW_7_r01 1093 +#define _LOAD_FAST_BORROW_7_r12 1094 +#define _LOAD_FAST_BORROW_7_r23 1095 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1096 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1097 +#define _LOAD_FAST_CHECK_r01 1098 +#define _LOAD_FAST_CHECK_r12 1099 +#define _LOAD_FAST_CHECK_r23 1100 +#define _LOAD_FAST_LOAD_FAST_r02 1101 +#define _LOAD_FAST_LOAD_FAST_r13 1102 +#define _LOAD_FROM_DICT_OR_DEREF_r11 1103 +#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1104 +#define _LOAD_GLOBAL_r00 1105 +#define _LOAD_GLOBAL_BUILTINS_r01 1106 +#define _LOAD_GLOBAL_MODULE_r01 1107 +#define _LOAD_LOCALS_r01 1108 +#define _LOAD_LOCALS_r12 1109 +#define _LOAD_LOCALS_r23 1110 +#define _LOAD_NAME_r01 1111 +#define _LOAD_SMALL_INT_r01 1112 +#define _LOAD_SMALL_INT_r12 1113 +#define _LOAD_SMALL_INT_r23 1114 +#define _LOAD_SMALL_INT_0_r01 1115 +#define _LOAD_SMALL_INT_0_r12 1116 +#define _LOAD_SMALL_INT_0_r23 1117 +#define _LOAD_SMALL_INT_1_r01 1118 +#define _LOAD_SMALL_INT_1_r12 1119 +#define _LOAD_SMALL_INT_1_r23 1120 +#define _LOAD_SMALL_INT_2_r01 1121 +#define _LOAD_SMALL_INT_2_r12 1122 +#define _LOAD_SMALL_INT_2_r23 1123 +#define _LOAD_SMALL_INT_3_r01 1124 +#define _LOAD_SMALL_INT_3_r12 1125 +#define _LOAD_SMALL_INT_3_r23 1126 +#define _LOAD_SPECIAL_r00 1127 +#define _LOAD_SUPER_ATTR_ATTR_r31 1128 +#define _LOAD_SUPER_ATTR_METHOD_r32 1129 +#define _MAKE_CALLARGS_A_TUPLE_r33 1130 +#define _MAKE_CELL_r00 1131 +#define _MAKE_FUNCTION_r11 1132 +#define _MAKE_WARM_r00 1133 +#define _MAKE_WARM_r11 1134 +#define _MAKE_WARM_r22 1135 +#define _MAKE_WARM_r33 1136 +#define _MAP_ADD_r20 1137 +#define _MATCH_CLASS_r31 1138 +#define _MATCH_KEYS_r23 1139 +#define _MATCH_MAPPING_r02 1140 +#define _MATCH_MAPPING_r12 1141 +#define _MATCH_MAPPING_r23 1142 +#define _MATCH_SEQUENCE_r02 1143 +#define _MATCH_SEQUENCE_r12 1144 +#define _MATCH_SEQUENCE_r23 1145 +#define _MAYBE_EXPAND_METHOD_r00 1146 +#define _MAYBE_EXPAND_METHOD_KW_r11 1147 +#define _MONITOR_CALL_r00 1148 +#define _MONITOR_CALL_KW_r11 1149 +#define _MONITOR_JUMP_BACKWARD_r00 1150 +#define _MONITOR_JUMP_BACKWARD_r11 1151 +#define _MONITOR_JUMP_BACKWARD_r22 1152 +#define _MONITOR_JUMP_BACKWARD_r33 1153 +#define _MONITOR_RESUME_r00 1154 +#define _NOP_r00 1155 +#define _NOP_r11 1156 +#define _NOP_r22 1157 +#define _NOP_r33 1158 +#define _POP_CALL_r20 1159 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1160 +#define _POP_CALL_ONE_r30 1161 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1162 +#define _POP_CALL_TWO_r30 1163 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1164 +#define _POP_EXCEPT_r10 1165 +#define _POP_ITER_r20 1166 +#define _POP_JUMP_IF_FALSE_r00 1167 +#define _POP_JUMP_IF_FALSE_r10 1168 +#define _POP_JUMP_IF_FALSE_r21 1169 +#define _POP_JUMP_IF_FALSE_r32 1170 +#define _POP_JUMP_IF_TRUE_r00 1171 +#define _POP_JUMP_IF_TRUE_r10 1172 +#define _POP_JUMP_IF_TRUE_r21 1173 +#define _POP_JUMP_IF_TRUE_r32 1174 +#define _POP_TOP_r10 1175 +#define _POP_TOP_FLOAT_r00 1176 +#define _POP_TOP_FLOAT_r10 1177 +#define _POP_TOP_FLOAT_r21 1178 +#define _POP_TOP_FLOAT_r32 1179 +#define _POP_TOP_INT_r00 1180 +#define _POP_TOP_INT_r10 1181 +#define _POP_TOP_INT_r21 1182 +#define _POP_TOP_INT_r32 1183 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1184 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1185 +#define _POP_TOP_NOP_r00 1186 +#define _POP_TOP_NOP_r10 1187 +#define _POP_TOP_NOP_r21 1188 +#define _POP_TOP_NOP_r32 1189 +#define _POP_TOP_UNICODE_r00 1190 +#define _POP_TOP_UNICODE_r10 1191 +#define _POP_TOP_UNICODE_r21 1192 +#define _POP_TOP_UNICODE_r32 1193 +#define _POP_TWO_r20 1194 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1195 +#define _PUSH_EXC_INFO_r02 1196 +#define _PUSH_EXC_INFO_r12 1197 +#define _PUSH_EXC_INFO_r23 1198 +#define _PUSH_FRAME_r10 1199 +#define _PUSH_NULL_r01 1200 +#define _PUSH_NULL_r12 1201 +#define _PUSH_NULL_r23 1202 +#define _PUSH_NULL_CONDITIONAL_r00 1203 +#define _PY_FRAME_GENERAL_r01 1204 +#define _PY_FRAME_KW_r11 1205 +#define _QUICKEN_TO_RESUME_CHECK_r00 1206 +#define _REPLACE_WITH_TRUE_r11 1207 +#define _RESUME_CHECK_r00 1208 +#define _RESUME_CHECK_r11 1209 +#define _RESUME_CHECK_r22 1210 +#define _RESUME_CHECK_r33 1211 +#define _RETURN_GENERATOR_r01 1212 +#define _RETURN_VALUE_r11 1213 +#define _SAVE_RETURN_OFFSET_r00 1214 +#define _SAVE_RETURN_OFFSET_r11 1215 +#define _SAVE_RETURN_OFFSET_r22 1216 +#define _SAVE_RETURN_OFFSET_r33 1217 +#define _SEND_r22 1218 +#define _SEND_GEN_FRAME_r22 1219 +#define _SETUP_ANNOTATIONS_r00 1220 +#define _SET_ADD_r10 1221 +#define _SET_FUNCTION_ATTRIBUTE_r01 1222 +#define _SET_FUNCTION_ATTRIBUTE_r11 1223 +#define _SET_FUNCTION_ATTRIBUTE_r21 1224 +#define _SET_FUNCTION_ATTRIBUTE_r32 1225 +#define _SET_IP_r00 1226 +#define _SET_IP_r11 1227 +#define _SET_IP_r22 1228 +#define _SET_IP_r33 1229 +#define _SET_UPDATE_r10 1230 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1231 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1232 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1233 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1234 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1235 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1236 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1237 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1238 +#define _SPILL_OR_RELOAD_r01 1239 +#define _SPILL_OR_RELOAD_r02 1240 +#define _SPILL_OR_RELOAD_r03 1241 +#define _SPILL_OR_RELOAD_r10 1242 +#define _SPILL_OR_RELOAD_r12 1243 +#define _SPILL_OR_RELOAD_r13 1244 +#define _SPILL_OR_RELOAD_r20 1245 +#define _SPILL_OR_RELOAD_r21 1246 +#define _SPILL_OR_RELOAD_r23 1247 +#define _SPILL_OR_RELOAD_r30 1248 +#define _SPILL_OR_RELOAD_r31 1249 +#define _SPILL_OR_RELOAD_r32 1250 +#define _START_EXECUTOR_r00 1251 +#define _STORE_ATTR_r20 1252 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1253 +#define _STORE_ATTR_SLOT_r21 1254 +#define _STORE_ATTR_WITH_HINT_r21 1255 +#define _STORE_DEREF_r10 1256 +#define _STORE_FAST_r10 1257 +#define _STORE_FAST_0_r10 1258 +#define _STORE_FAST_1_r10 1259 +#define _STORE_FAST_2_r10 1260 +#define _STORE_FAST_3_r10 1261 +#define _STORE_FAST_4_r10 1262 +#define _STORE_FAST_5_r10 1263 +#define _STORE_FAST_6_r10 1264 +#define _STORE_FAST_7_r10 1265 +#define _STORE_FAST_LOAD_FAST_r11 1266 +#define _STORE_FAST_STORE_FAST_r20 1267 +#define _STORE_GLOBAL_r10 1268 +#define _STORE_NAME_r10 1269 +#define _STORE_SLICE_r30 1270 +#define _STORE_SUBSCR_r30 1271 +#define _STORE_SUBSCR_DICT_r31 1272 +#define _STORE_SUBSCR_LIST_INT_r32 1273 +#define _SWAP_r11 1274 +#define _SWAP_2_r02 1275 +#define _SWAP_2_r12 1276 +#define _SWAP_2_r22 1277 +#define _SWAP_2_r33 1278 +#define _SWAP_3_r03 1279 +#define _SWAP_3_r13 1280 +#define _SWAP_3_r23 1281 +#define _SWAP_3_r33 1282 +#define _TIER2_RESUME_CHECK_r00 1283 +#define _TIER2_RESUME_CHECK_r11 1284 +#define _TIER2_RESUME_CHECK_r22 1285 +#define _TIER2_RESUME_CHECK_r33 1286 +#define _TO_BOOL_r11 1287 +#define _TO_BOOL_BOOL_r01 1288 +#define _TO_BOOL_BOOL_r11 1289 +#define _TO_BOOL_BOOL_r22 1290 +#define _TO_BOOL_BOOL_r33 1291 +#define _TO_BOOL_INT_r11 1292 +#define _TO_BOOL_LIST_r11 1293 +#define _TO_BOOL_NONE_r01 1294 +#define _TO_BOOL_NONE_r11 1295 +#define _TO_BOOL_NONE_r22 1296 +#define _TO_BOOL_NONE_r33 1297 +#define _TO_BOOL_STR_r11 1298 +#define _TRACE_RECORD_r00 1299 +#define _UNARY_INVERT_r11 1300 +#define _UNARY_NEGATIVE_r11 1301 +#define _UNARY_NOT_r01 1302 +#define _UNARY_NOT_r11 1303 +#define _UNARY_NOT_r22 1304 +#define _UNARY_NOT_r33 1305 +#define _UNPACK_EX_r10 1306 +#define _UNPACK_SEQUENCE_r10 1307 +#define _UNPACK_SEQUENCE_LIST_r10 1308 +#define _UNPACK_SEQUENCE_TUPLE_r10 1309 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1310 +#define _WITH_EXCEPT_START_r33 1311 +#define _YIELD_VALUE_r11 1312 +#define MAX_UOP_REGS_ID 1312 #ifdef __cplusplus } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 17fc061cc7081d..d69bdb604e278e 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -253,7 +253,31 @@ dummy_func( macro(RESUME_CHECK_JIT) = unused/1 + _RESUME_CHECK + - _JIT; + _QUICKEN_TO_RESUME_CHECK + + _JIT_RESUME; + + op(_QUICKEN_TO_RESUME_CHECK, (--)) { + // For some reason, RESUME_CHECK_JIT is quite expensive compared to RESUME. + // Even without the _JIT uop! + // It's enough to show up as a 10-20% slowdown in some benchmarks + // For that reason, we replace it back with RESUME_CHECK immediately. + // This also means that function entry tracing is practically a single attempt. + // In JIT builds, we thus stick only to RESUME and wait for it to specialize to RESUME_CHECK_JIT. + // This makes RESUME slightly slower on JIT builds, but since the JIT is faster it makes up for it. + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_unreachable_backoff_counter()); + } + + tier1 op(_JIT_RESUME, (--)) { + #ifdef _Py_TIER2 + assert(this_instr->op.code == RESUME_CHECK); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, this_instr, this_instr, + STACK_LEVEL(), 0, NULL, opcode, oparg); + if (succ) { + ENTER_TRACING(); + } + #endif + } op(_MONITOR_RESUME, (--)) { int err = _Py_call_instrumentation( @@ -2968,10 +2992,11 @@ dummy_func( tier1 op(_JIT, (--)) { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; + bool is_resume = this_instr->op.code == RESUME_CHECK; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume) && + if (!IS_JIT_TRACING() && + (backoff_counter_triggers(counter) && + this_instr->op.code == JUMP_BACKWARD_JIT) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; @@ -2991,16 +3016,6 @@ dummy_func( else { ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } - // For some reason, RESUME_CHECK_JIT is quite expensive compared to RESUME. - // It's enough to show up as a 10-20% slowdown in some benchmarks! - // For that reason, we replace it back with RESUME_CHECK immediately. - // This also means that function entry tracing is practically a single attempt. - // In JIT builds, we thus stick only to RESUME and wait for it to specialize to RESUME_CHECK_JIT. - // This makes RESUME slightly slower on JIT builds, but since the JIT is faster it makes up for it. - if (is_resume) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_resume_backoff_counter()); - } #endif } @@ -5669,10 +5684,7 @@ dummy_func( _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; int orig_opcode = executor->vm_data.opcode; // Not backwards jump, trace over it to form a longer trace. - if (orig_opcode != JUMP_BACKWARD_JIT && - orig_opcode != JUMP_BACKWARD && - orig_opcode != JUMP_BACKWARD_NO_INTERRUPT && - orig_opcode != JUMP_BACKWARD_NO_JIT) { + if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { assert(executor->vm_data.index == INSTR_OFFSET()); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 8df6f450f03cc3..bc07938e3d0613 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -253,6 +253,8 @@ break; } + /* _QUICKEN_TO_RESUME_CHECK is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ + /* _MONITOR_RESUME is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ case _LOAD_FAST_CHECK_r01: { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index e91bc3f845cb76..688e5fab96d6bb 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7306,10 +7306,11 @@ // _JIT { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; + bool is_resume = this_instr->op.code == RESUME_CHECK; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume) && + if (!IS_JIT_TRACING() && + (backoff_counter_triggers(counter) && + this_instr->op.code == JUMP_BACKWARD_JIT) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { @@ -7328,12 +7329,6 @@ else { ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } - if (is_resume) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - _PyFrame_SetStackPointer(frame, stack_pointer); - FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_resume_backoff_counter()); - stack_pointer = _PyFrame_GetStackPointer(frame); - } #endif } DISPATCH(); @@ -10079,36 +10074,21 @@ } #endif } - // _JIT + // _QUICKEN_TO_RESUME_CHECK + { + FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + _PyFrame_SetStackPointer(frame, stack_pointer); + FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_unreachable_backoff_counter()); + stack_pointer = _PyFrame_GetStackPointer(frame); + } + // _JIT_RESUME { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; - _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume) && - next_instr->op.code != ENTER_EXECUTOR) { - _Py_CODEUNIT *insert_exec_at = this_instr; - while (oparg > 255) { - oparg >>= 8; - insert_exec_at--; - } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, - STACK_LEVEL(), 0, NULL, opcode, oparg); - if (succ) { - ENTER_TRACING(); - } - else { - this_instr[1].counter = restart_backoff_counter(counter); - } - } - else { - ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); - } - if (is_resume) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - _PyFrame_SetStackPointer(frame, stack_pointer); - FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_resume_backoff_counter()); - stack_pointer = _PyFrame_GetStackPointer(frame); + assert(this_instr->op.code == RESUME_CHECK); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, this_instr, this_instr, + STACK_LEVEL(), 0, NULL, opcode, oparg); + if (succ) { + ENTER_TRACING(); } #endif } @@ -12173,10 +12153,7 @@ JUMP_TO_LABEL(error); PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; int orig_opcode = executor->vm_data.opcode; - if (orig_opcode != JUMP_BACKWARD_JIT && - orig_opcode != JUMP_BACKWARD && - orig_opcode != JUMP_BACKWARD_NO_INTERRUPT && - orig_opcode != JUMP_BACKWARD_NO_JIT) { + if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { assert(executor->vm_data.index == INSTR_OFFSET()); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); diff --git a/Python/optimizer.c b/Python/optimizer.c index 19d00b9bc94183..fe7dd1235ef7b5 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -981,6 +981,30 @@ _PyJit_translate_single_bytecode_to_trace( } ADD_TO_TRACE(uop, oparg, operand, target); trace[trace_length - 1].operand1 = PyStackRef_IsNone(frame->f_executable) ? 2 : ((int)(frame->stackpointer - _PyFrame_Stackbase(frame))); + // If this is a function trace, terminate when we underflow. + // Otherwise this leads to trace explosion + // when we trace the underflow especially for recursion which + // hurts performance. + bool is_resume_trace = _PyOpcode_Deopt[_tstate->jit_tracer_state.initial_state.trace_origin_opcode] == RESUME; + if (is_resume_trace && + (uop == _RETURN_VALUE || uop == _RETURN_GENERATOR || uop == _YIELD_VALUE)) { + if (_tstate->jit_tracer_state.prev_state.instr_frame == _tstate->jit_tracer_state.initial_state.frame) { + uint16_t guard_ip = guard_ip_uop[trace[trace_length-1].opcode]; + assert(guard_ip != 0); + ADD_TO_TRACE(guard_ip, 0, (uintptr_t)next_instr, 0); + uint32_t new_target = Py_IsNone((PyObject*)new_code) + ? (uint32_t)(next_instr - _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS_PTR) + : INSTR_IP(next_instr, new_code); + // Can't exit in the middle of an init frame. Deopt instead. + if (new_code == (PyCodeObject *)&_Py_InitCleanup) { + ADD_TO_TRACE(_DEOPT, 0, 0, new_target); + } + else { + ADD_TO_TRACE(_EXIT_TRACE, 0, 0, new_target); + } + goto done; + } + } break; } if (uop == _BINARY_OP_INPLACE_ADD_UNICODE) { @@ -1102,14 +1126,14 @@ _PyJit_TryInitializeTracing( _tstate->jit_tracer_state.initial_state.exit = exit; _tstate->jit_tracer_state.initial_state.stack_depth = curr_stackdepth; _tstate->jit_tracer_state.initial_state.chain_depth = chain_depth; - _tstate->jit_tracer_state.prev_state.instr_frame = frame; + _tstate->jit_tracer_state.initial_state.frame = frame; _tstate->jit_tracer_state.prev_state.dependencies_still_valid = true; _tstate->jit_tracer_state.prev_state.instr_code = (PyCodeObject *)Py_NewRef(_PyFrame_GetCode(frame)); _tstate->jit_tracer_state.prev_state.instr = curr_instr; _tstate->jit_tracer_state.prev_state.instr_frame = frame; _tstate->jit_tracer_state.prev_state.instr_oparg = oparg; _tstate->jit_tracer_state.prev_state.instr_stacklevel = curr_stackdepth; - assert(curr_instr->op.code == JUMP_BACKWARD_JIT || curr_instr->op.code == RESUME_CHECK_JIT || (exit != NULL)); + assert(curr_instr->op.code == JUMP_BACKWARD_JIT || _PyOpcode_Deopt[curr_instr->op.code] == RESUME || (exit != NULL)); _tstate->jit_tracer_state.initial_state.trace_enter_instr = curr_instr; _tstate->jit_tracer_state.initial_state.trace_origin_opcode = opcode; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index b4a0967170b91d..3d9afca1c9ae75 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -23,6 +23,8 @@ break; } + /* _QUICKEN_TO_RESUME_CHECK is not a viable micro-op for tier 2 */ + /* _MONITOR_RESUME is not a viable micro-op for tier 2 */ case _LOAD_FAST_CHECK: { From cb15c9ae648cb1a7037330cd028067d70e82ec31 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 15:31:02 +0800 Subject: [PATCH 32/43] cleanup --- Include/internal/pycore_opcode_metadata.h | 2 +- Include/internal/pycore_uop_ids.h | 1878 ++++++++++----------- Lib/opcode.py | 2 +- Modules/_testinternalcapi/test_cases.c.h | 130 +- Modules/_testinternalcapi/test_targets.h | 11 +- Python/bytecodes.c | 26 +- Python/executor_cases.c.h | 2 - Python/generated_cases.c.h | 36 +- Python/optimizer.c | 39 - Python/optimizer_cases.c.h | 2 - 10 files changed, 1084 insertions(+), 1044 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 7c16f46a331975..0df391918adcf2 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1284,7 +1284,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [RESERVED] = { true, INSTR_FMT_IX, 0 }, [RESUME] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [RESUME_CHECK] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG }, - [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG }, + [RESUME_CHECK_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_DEOPT_FLAG }, [RETURN_GENERATOR] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [SEND] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_SYNC_SP_FLAG | HAS_UNPREDICTABLE_JUMP_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index a84ce645fb44e9..08796d752ad640 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -330,960 +330,958 @@ extern "C" { #define _PY_FRAME_EX 545 #define _PY_FRAME_GENERAL 546 #define _PY_FRAME_KW 547 -#define _QUICKEN_TO_RESUME_CHECK 548 -#define _RECORD_4OS 549 -#define _RECORD_BOUND_METHOD 550 -#define _RECORD_CALLABLE 551 -#define _RECORD_CODE 552 -#define _RECORD_NOS 553 -#define _RECORD_NOS_GEN_FUNC 554 -#define _RECORD_TOS 555 -#define _RECORD_TOS_TYPE 556 -#define _REPLACE_WITH_TRUE 557 -#define _RESUME_CHECK 558 +#define _RECORD_4OS 548 +#define _RECORD_BOUND_METHOD 549 +#define _RECORD_CALLABLE 550 +#define _RECORD_CODE 551 +#define _RECORD_NOS 552 +#define _RECORD_NOS_GEN_FUNC 553 +#define _RECORD_TOS 554 +#define _RECORD_TOS_TYPE 555 +#define _REPLACE_WITH_TRUE 556 +#define _RESUME_CHECK 557 #define _RETURN_GENERATOR RETURN_GENERATOR -#define _RETURN_VALUE 559 -#define _SAVE_RETURN_OFFSET 560 -#define _SEND 561 -#define _SEND_GEN_FRAME 562 +#define _RETURN_VALUE 558 +#define _SAVE_RETURN_OFFSET 559 +#define _SEND 560 +#define _SEND_GEN_FRAME 561 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 563 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 564 -#define _SPILL_OR_RELOAD 565 -#define _START_EXECUTOR 566 -#define _STORE_ATTR 567 -#define _STORE_ATTR_INSTANCE_VALUE 568 -#define _STORE_ATTR_SLOT 569 -#define _STORE_ATTR_WITH_HINT 570 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW 562 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW 563 +#define _SPILL_OR_RELOAD 564 +#define _START_EXECUTOR 565 +#define _STORE_ATTR 566 +#define _STORE_ATTR_INSTANCE_VALUE 567 +#define _STORE_ATTR_SLOT 568 +#define _STORE_ATTR_WITH_HINT 569 #define _STORE_DEREF STORE_DEREF #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 571 -#define _STORE_SUBSCR 572 -#define _STORE_SUBSCR_DICT 573 -#define _STORE_SUBSCR_LIST_INT 574 -#define _SWAP 575 -#define _SWAP_2 576 -#define _SWAP_3 577 -#define _SWAP_FAST 578 -#define _SWAP_FAST_0 579 -#define _SWAP_FAST_1 580 -#define _SWAP_FAST_2 581 -#define _SWAP_FAST_3 582 -#define _SWAP_FAST_4 583 -#define _SWAP_FAST_5 584 -#define _SWAP_FAST_6 585 -#define _SWAP_FAST_7 586 -#define _TIER2_RESUME_CHECK 587 -#define _TO_BOOL 588 +#define _STORE_SLICE 570 +#define _STORE_SUBSCR 571 +#define _STORE_SUBSCR_DICT 572 +#define _STORE_SUBSCR_LIST_INT 573 +#define _SWAP 574 +#define _SWAP_2 575 +#define _SWAP_3 576 +#define _SWAP_FAST 577 +#define _SWAP_FAST_0 578 +#define _SWAP_FAST_1 579 +#define _SWAP_FAST_2 580 +#define _SWAP_FAST_3 581 +#define _SWAP_FAST_4 582 +#define _SWAP_FAST_5 583 +#define _SWAP_FAST_6 584 +#define _SWAP_FAST_7 585 +#define _TIER2_RESUME_CHECK 586 +#define _TO_BOOL 587 #define _TO_BOOL_BOOL TO_BOOL_BOOL -#define _TO_BOOL_INT 589 -#define _TO_BOOL_LIST 590 +#define _TO_BOOL_INT 588 +#define _TO_BOOL_LIST 589 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 591 +#define _TO_BOOL_STR 590 #define _TRACE_RECORD TRACE_RECORD -#define _UNARY_INVERT 592 -#define _UNARY_NEGATIVE 593 +#define _UNARY_INVERT 591 +#define _UNARY_NEGATIVE 592 #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 594 -#define _UNPACK_SEQUENCE_LIST 595 -#define _UNPACK_SEQUENCE_TUPLE 596 -#define _UNPACK_SEQUENCE_TWO_TUPLE 597 +#define _UNPACK_SEQUENCE 593 +#define _UNPACK_SEQUENCE_LIST 594 +#define _UNPACK_SEQUENCE_TUPLE 595 +#define _UNPACK_SEQUENCE_TWO_TUPLE 596 #define _WITH_EXCEPT_START WITH_EXCEPT_START -#define _YIELD_VALUE 598 -#define MAX_UOP_ID 598 -#define _BINARY_OP_r23 599 -#define _BINARY_OP_ADD_FLOAT_r03 600 -#define _BINARY_OP_ADD_FLOAT_r13 601 -#define _BINARY_OP_ADD_FLOAT_r23 602 -#define _BINARY_OP_ADD_INT_r03 603 -#define _BINARY_OP_ADD_INT_r13 604 -#define _BINARY_OP_ADD_INT_r23 605 -#define _BINARY_OP_ADD_UNICODE_r03 606 -#define _BINARY_OP_ADD_UNICODE_r13 607 -#define _BINARY_OP_ADD_UNICODE_r23 608 -#define _BINARY_OP_EXTEND_r23 609 -#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 610 -#define _BINARY_OP_MULTIPLY_FLOAT_r03 611 -#define _BINARY_OP_MULTIPLY_FLOAT_r13 612 -#define _BINARY_OP_MULTIPLY_FLOAT_r23 613 -#define _BINARY_OP_MULTIPLY_INT_r03 614 -#define _BINARY_OP_MULTIPLY_INT_r13 615 -#define _BINARY_OP_MULTIPLY_INT_r23 616 -#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 617 -#define _BINARY_OP_SUBSCR_DICT_r23 618 -#define _BINARY_OP_SUBSCR_INIT_CALL_r01 619 -#define _BINARY_OP_SUBSCR_INIT_CALL_r11 620 -#define _BINARY_OP_SUBSCR_INIT_CALL_r21 621 -#define _BINARY_OP_SUBSCR_INIT_CALL_r31 622 -#define _BINARY_OP_SUBSCR_LIST_INT_r23 623 -#define _BINARY_OP_SUBSCR_LIST_SLICE_r23 624 -#define _BINARY_OP_SUBSCR_STR_INT_r23 625 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 626 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 627 -#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 628 -#define _BINARY_OP_SUBSCR_USTR_INT_r23 629 -#define _BINARY_OP_SUBTRACT_FLOAT_r03 630 -#define _BINARY_OP_SUBTRACT_FLOAT_r13 631 -#define _BINARY_OP_SUBTRACT_FLOAT_r23 632 -#define _BINARY_OP_SUBTRACT_INT_r03 633 -#define _BINARY_OP_SUBTRACT_INT_r13 634 -#define _BINARY_OP_SUBTRACT_INT_r23 635 -#define _BINARY_SLICE_r31 636 -#define _BUILD_INTERPOLATION_r01 637 -#define _BUILD_LIST_r01 638 -#define _BUILD_MAP_r01 639 -#define _BUILD_SET_r01 640 -#define _BUILD_SLICE_r01 641 -#define _BUILD_STRING_r01 642 -#define _BUILD_TEMPLATE_r21 643 -#define _BUILD_TUPLE_r01 644 -#define _CALL_BUILTIN_CLASS_r01 645 -#define _CALL_BUILTIN_FAST_r01 646 -#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 647 -#define _CALL_BUILTIN_O_r03 648 -#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 649 -#define _CALL_INTRINSIC_1_r11 650 -#define _CALL_INTRINSIC_2_r21 651 -#define _CALL_ISINSTANCE_r31 652 -#define _CALL_KW_NON_PY_r11 653 -#define _CALL_LEN_r33 654 -#define _CALL_LIST_APPEND_r03 655 -#define _CALL_LIST_APPEND_r13 656 -#define _CALL_LIST_APPEND_r23 657 -#define _CALL_LIST_APPEND_r33 658 -#define _CALL_METHOD_DESCRIPTOR_FAST_r01 659 -#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 660 -#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 661 -#define _CALL_METHOD_DESCRIPTOR_O_r03 662 -#define _CALL_NON_PY_GENERAL_r01 663 -#define _CALL_STR_1_r32 664 -#define _CALL_TUPLE_1_r32 665 -#define _CALL_TYPE_1_r02 666 -#define _CALL_TYPE_1_r12 667 -#define _CALL_TYPE_1_r22 668 -#define _CALL_TYPE_1_r32 669 -#define _CHECK_AND_ALLOCATE_OBJECT_r00 670 -#define _CHECK_ATTR_CLASS_r01 671 -#define _CHECK_ATTR_CLASS_r11 672 -#define _CHECK_ATTR_CLASS_r22 673 -#define _CHECK_ATTR_CLASS_r33 674 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 675 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 676 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 677 -#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 678 -#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 679 -#define _CHECK_EG_MATCH_r22 680 -#define _CHECK_EXC_MATCH_r22 681 -#define _CHECK_FUNCTION_EXACT_ARGS_r00 682 -#define _CHECK_FUNCTION_VERSION_r00 683 -#define _CHECK_FUNCTION_VERSION_INLINE_r00 684 -#define _CHECK_FUNCTION_VERSION_INLINE_r11 685 -#define _CHECK_FUNCTION_VERSION_INLINE_r22 686 -#define _CHECK_FUNCTION_VERSION_INLINE_r33 687 -#define _CHECK_FUNCTION_VERSION_KW_r11 688 -#define _CHECK_IS_NOT_PY_CALLABLE_r00 689 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 690 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 691 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 692 -#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 693 -#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 694 -#define _CHECK_IS_PY_CALLABLE_EX_r03 695 -#define _CHECK_IS_PY_CALLABLE_EX_r13 696 -#define _CHECK_IS_PY_CALLABLE_EX_r23 697 -#define _CHECK_IS_PY_CALLABLE_EX_r33 698 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 699 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 700 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 701 -#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 702 -#define _CHECK_METHOD_VERSION_r00 703 -#define _CHECK_METHOD_VERSION_KW_r11 704 -#define _CHECK_PEP_523_r00 705 -#define _CHECK_PEP_523_r11 706 -#define _CHECK_PEP_523_r22 707 -#define _CHECK_PEP_523_r33 708 -#define _CHECK_PERIODIC_r00 709 -#define _CHECK_PERIODIC_AT_END_r00 710 -#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 711 -#define _CHECK_RECURSION_REMAINING_r00 712 -#define _CHECK_RECURSION_REMAINING_r11 713 -#define _CHECK_RECURSION_REMAINING_r22 714 -#define _CHECK_RECURSION_REMAINING_r33 715 -#define _CHECK_STACK_SPACE_r00 716 -#define _CHECK_STACK_SPACE_OPERAND_r00 717 -#define _CHECK_STACK_SPACE_OPERAND_r11 718 -#define _CHECK_STACK_SPACE_OPERAND_r22 719 -#define _CHECK_STACK_SPACE_OPERAND_r33 720 -#define _CHECK_VALIDITY_r00 721 -#define _CHECK_VALIDITY_r11 722 -#define _CHECK_VALIDITY_r22 723 -#define _CHECK_VALIDITY_r33 724 -#define _COLD_DYNAMIC_EXIT_r00 725 -#define _COLD_EXIT_r00 726 -#define _COMPARE_OP_r21 727 -#define _COMPARE_OP_FLOAT_r03 728 -#define _COMPARE_OP_FLOAT_r13 729 -#define _COMPARE_OP_FLOAT_r23 730 -#define _COMPARE_OP_INT_r23 731 -#define _COMPARE_OP_STR_r23 732 -#define _CONTAINS_OP_r23 733 -#define _CONTAINS_OP_DICT_r23 734 -#define _CONTAINS_OP_SET_r23 735 -#define _CONVERT_VALUE_r11 736 -#define _COPY_r01 737 -#define _COPY_1_r02 738 -#define _COPY_1_r12 739 -#define _COPY_1_r23 740 -#define _COPY_2_r03 741 -#define _COPY_2_r13 742 -#define _COPY_2_r23 743 -#define _COPY_3_r03 744 -#define _COPY_3_r13 745 -#define _COPY_3_r23 746 -#define _COPY_3_r33 747 -#define _COPY_FREE_VARS_r00 748 -#define _COPY_FREE_VARS_r11 749 -#define _COPY_FREE_VARS_r22 750 -#define _COPY_FREE_VARS_r33 751 -#define _CREATE_INIT_FRAME_r01 752 -#define _DELETE_ATTR_r10 753 -#define _DELETE_DEREF_r00 754 -#define _DELETE_FAST_r00 755 -#define _DELETE_GLOBAL_r00 756 -#define _DELETE_NAME_r00 757 -#define _DELETE_SUBSCR_r20 758 -#define _DEOPT_r00 759 -#define _DEOPT_r10 760 -#define _DEOPT_r20 761 -#define _DEOPT_r30 762 -#define _DICT_MERGE_r10 763 -#define _DICT_UPDATE_r10 764 -#define _DO_CALL_r01 765 -#define _DO_CALL_FUNCTION_EX_r31 766 -#define _DO_CALL_KW_r11 767 -#define _DYNAMIC_EXIT_r00 768 -#define _DYNAMIC_EXIT_r10 769 -#define _DYNAMIC_EXIT_r20 770 -#define _DYNAMIC_EXIT_r30 771 -#define _END_FOR_r10 772 -#define _END_SEND_r21 773 -#define _ERROR_POP_N_r00 774 -#define _EXIT_INIT_CHECK_r10 775 -#define _EXIT_TRACE_r00 776 -#define _EXIT_TRACE_r10 777 -#define _EXIT_TRACE_r20 778 -#define _EXIT_TRACE_r30 779 -#define _EXPAND_METHOD_r00 780 -#define _EXPAND_METHOD_KW_r11 781 -#define _FATAL_ERROR_r00 782 -#define _FATAL_ERROR_r11 783 -#define _FATAL_ERROR_r22 784 -#define _FATAL_ERROR_r33 785 -#define _FORMAT_SIMPLE_r11 786 -#define _FORMAT_WITH_SPEC_r21 787 -#define _FOR_ITER_r23 788 -#define _FOR_ITER_GEN_FRAME_r03 789 -#define _FOR_ITER_GEN_FRAME_r13 790 -#define _FOR_ITER_GEN_FRAME_r23 791 -#define _FOR_ITER_TIER_TWO_r23 792 -#define _GET_AITER_r11 793 -#define _GET_ANEXT_r12 794 -#define _GET_AWAITABLE_r11 795 -#define _GET_ITER_r12 796 -#define _GET_LEN_r12 797 -#define _GET_YIELD_FROM_ITER_r11 798 -#define _GUARD_BINARY_OP_EXTEND_r22 799 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 800 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 801 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 802 -#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 803 -#define _GUARD_BIT_IS_SET_POP_r00 804 -#define _GUARD_BIT_IS_SET_POP_r10 805 -#define _GUARD_BIT_IS_SET_POP_r21 806 -#define _GUARD_BIT_IS_SET_POP_r32 807 -#define _GUARD_BIT_IS_SET_POP_4_r00 808 -#define _GUARD_BIT_IS_SET_POP_4_r10 809 -#define _GUARD_BIT_IS_SET_POP_4_r21 810 -#define _GUARD_BIT_IS_SET_POP_4_r32 811 -#define _GUARD_BIT_IS_SET_POP_5_r00 812 -#define _GUARD_BIT_IS_SET_POP_5_r10 813 -#define _GUARD_BIT_IS_SET_POP_5_r21 814 -#define _GUARD_BIT_IS_SET_POP_5_r32 815 -#define _GUARD_BIT_IS_SET_POP_6_r00 816 -#define _GUARD_BIT_IS_SET_POP_6_r10 817 -#define _GUARD_BIT_IS_SET_POP_6_r21 818 -#define _GUARD_BIT_IS_SET_POP_6_r32 819 -#define _GUARD_BIT_IS_SET_POP_7_r00 820 -#define _GUARD_BIT_IS_SET_POP_7_r10 821 -#define _GUARD_BIT_IS_SET_POP_7_r21 822 -#define _GUARD_BIT_IS_SET_POP_7_r32 823 -#define _GUARD_BIT_IS_UNSET_POP_r00 824 -#define _GUARD_BIT_IS_UNSET_POP_r10 825 -#define _GUARD_BIT_IS_UNSET_POP_r21 826 -#define _GUARD_BIT_IS_UNSET_POP_r32 827 -#define _GUARD_BIT_IS_UNSET_POP_4_r00 828 -#define _GUARD_BIT_IS_UNSET_POP_4_r10 829 -#define _GUARD_BIT_IS_UNSET_POP_4_r21 830 -#define _GUARD_BIT_IS_UNSET_POP_4_r32 831 -#define _GUARD_BIT_IS_UNSET_POP_5_r00 832 -#define _GUARD_BIT_IS_UNSET_POP_5_r10 833 -#define _GUARD_BIT_IS_UNSET_POP_5_r21 834 -#define _GUARD_BIT_IS_UNSET_POP_5_r32 835 -#define _GUARD_BIT_IS_UNSET_POP_6_r00 836 -#define _GUARD_BIT_IS_UNSET_POP_6_r10 837 -#define _GUARD_BIT_IS_UNSET_POP_6_r21 838 -#define _GUARD_BIT_IS_UNSET_POP_6_r32 839 -#define _GUARD_BIT_IS_UNSET_POP_7_r00 840 -#define _GUARD_BIT_IS_UNSET_POP_7_r10 841 -#define _GUARD_BIT_IS_UNSET_POP_7_r21 842 -#define _GUARD_BIT_IS_UNSET_POP_7_r32 843 -#define _GUARD_CALLABLE_ISINSTANCE_r03 844 -#define _GUARD_CALLABLE_ISINSTANCE_r13 845 -#define _GUARD_CALLABLE_ISINSTANCE_r23 846 -#define _GUARD_CALLABLE_ISINSTANCE_r33 847 -#define _GUARD_CALLABLE_LEN_r03 848 -#define _GUARD_CALLABLE_LEN_r13 849 -#define _GUARD_CALLABLE_LEN_r23 850 -#define _GUARD_CALLABLE_LEN_r33 851 -#define _GUARD_CALLABLE_LIST_APPEND_r03 852 -#define _GUARD_CALLABLE_LIST_APPEND_r13 853 -#define _GUARD_CALLABLE_LIST_APPEND_r23 854 -#define _GUARD_CALLABLE_LIST_APPEND_r33 855 -#define _GUARD_CALLABLE_STR_1_r03 856 -#define _GUARD_CALLABLE_STR_1_r13 857 -#define _GUARD_CALLABLE_STR_1_r23 858 -#define _GUARD_CALLABLE_STR_1_r33 859 -#define _GUARD_CALLABLE_TUPLE_1_r03 860 -#define _GUARD_CALLABLE_TUPLE_1_r13 861 -#define _GUARD_CALLABLE_TUPLE_1_r23 862 -#define _GUARD_CALLABLE_TUPLE_1_r33 863 -#define _GUARD_CALLABLE_TYPE_1_r03 864 -#define _GUARD_CALLABLE_TYPE_1_r13 865 -#define _GUARD_CALLABLE_TYPE_1_r23 866 -#define _GUARD_CALLABLE_TYPE_1_r33 867 -#define _GUARD_CODE_VERSION_r00 868 -#define _GUARD_CODE_VERSION_r11 869 -#define _GUARD_CODE_VERSION_r22 870 -#define _GUARD_CODE_VERSION_r33 871 -#define _GUARD_DORV_NO_DICT_r01 872 -#define _GUARD_DORV_NO_DICT_r11 873 -#define _GUARD_DORV_NO_DICT_r22 874 -#define _GUARD_DORV_NO_DICT_r33 875 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 876 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 877 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 878 -#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 879 -#define _GUARD_GLOBALS_VERSION_r00 880 -#define _GUARD_GLOBALS_VERSION_r11 881 -#define _GUARD_GLOBALS_VERSION_r22 882 -#define _GUARD_GLOBALS_VERSION_r33 883 -#define _GUARD_IP_RETURN_GENERATOR_r00 884 -#define _GUARD_IP_RETURN_GENERATOR_r11 885 -#define _GUARD_IP_RETURN_GENERATOR_r22 886 -#define _GUARD_IP_RETURN_GENERATOR_r33 887 -#define _GUARD_IP_RETURN_VALUE_r00 888 -#define _GUARD_IP_RETURN_VALUE_r11 889 -#define _GUARD_IP_RETURN_VALUE_r22 890 -#define _GUARD_IP_RETURN_VALUE_r33 891 -#define _GUARD_IP_YIELD_VALUE_r00 892 -#define _GUARD_IP_YIELD_VALUE_r11 893 -#define _GUARD_IP_YIELD_VALUE_r22 894 -#define _GUARD_IP_YIELD_VALUE_r33 895 -#define _GUARD_IP__PUSH_FRAME_r00 896 -#define _GUARD_IP__PUSH_FRAME_r11 897 -#define _GUARD_IP__PUSH_FRAME_r22 898 -#define _GUARD_IP__PUSH_FRAME_r33 899 -#define _GUARD_IS_FALSE_POP_r00 900 -#define _GUARD_IS_FALSE_POP_r10 901 -#define _GUARD_IS_FALSE_POP_r21 902 -#define _GUARD_IS_FALSE_POP_r32 903 -#define _GUARD_IS_NONE_POP_r00 904 -#define _GUARD_IS_NONE_POP_r10 905 -#define _GUARD_IS_NONE_POP_r21 906 -#define _GUARD_IS_NONE_POP_r32 907 -#define _GUARD_IS_NOT_NONE_POP_r10 908 -#define _GUARD_IS_TRUE_POP_r00 909 -#define _GUARD_IS_TRUE_POP_r10 910 -#define _GUARD_IS_TRUE_POP_r21 911 -#define _GUARD_IS_TRUE_POP_r32 912 -#define _GUARD_KEYS_VERSION_r01 913 -#define _GUARD_KEYS_VERSION_r11 914 -#define _GUARD_KEYS_VERSION_r22 915 -#define _GUARD_KEYS_VERSION_r33 916 -#define _GUARD_NOS_ANY_DICT_r02 917 -#define _GUARD_NOS_ANY_DICT_r12 918 -#define _GUARD_NOS_ANY_DICT_r22 919 -#define _GUARD_NOS_ANY_DICT_r33 920 -#define _GUARD_NOS_COMPACT_ASCII_r02 921 -#define _GUARD_NOS_COMPACT_ASCII_r12 922 -#define _GUARD_NOS_COMPACT_ASCII_r22 923 -#define _GUARD_NOS_COMPACT_ASCII_r33 924 -#define _GUARD_NOS_DICT_r02 925 -#define _GUARD_NOS_DICT_r12 926 -#define _GUARD_NOS_DICT_r22 927 -#define _GUARD_NOS_DICT_r33 928 -#define _GUARD_NOS_FLOAT_r02 929 -#define _GUARD_NOS_FLOAT_r12 930 -#define _GUARD_NOS_FLOAT_r22 931 -#define _GUARD_NOS_FLOAT_r33 932 -#define _GUARD_NOS_INT_r02 933 -#define _GUARD_NOS_INT_r12 934 -#define _GUARD_NOS_INT_r22 935 -#define _GUARD_NOS_INT_r33 936 -#define _GUARD_NOS_LIST_r02 937 -#define _GUARD_NOS_LIST_r12 938 -#define _GUARD_NOS_LIST_r22 939 -#define _GUARD_NOS_LIST_r33 940 -#define _GUARD_NOS_NOT_NULL_r02 941 -#define _GUARD_NOS_NOT_NULL_r12 942 -#define _GUARD_NOS_NOT_NULL_r22 943 -#define _GUARD_NOS_NOT_NULL_r33 944 -#define _GUARD_NOS_NULL_r02 945 -#define _GUARD_NOS_NULL_r12 946 -#define _GUARD_NOS_NULL_r22 947 -#define _GUARD_NOS_NULL_r33 948 -#define _GUARD_NOS_OVERFLOWED_r02 949 -#define _GUARD_NOS_OVERFLOWED_r12 950 -#define _GUARD_NOS_OVERFLOWED_r22 951 -#define _GUARD_NOS_OVERFLOWED_r33 952 -#define _GUARD_NOS_TUPLE_r02 953 -#define _GUARD_NOS_TUPLE_r12 954 -#define _GUARD_NOS_TUPLE_r22 955 -#define _GUARD_NOS_TUPLE_r33 956 -#define _GUARD_NOS_UNICODE_r02 957 -#define _GUARD_NOS_UNICODE_r12 958 -#define _GUARD_NOS_UNICODE_r22 959 -#define _GUARD_NOS_UNICODE_r33 960 -#define _GUARD_NOT_EXHAUSTED_LIST_r02 961 -#define _GUARD_NOT_EXHAUSTED_LIST_r12 962 -#define _GUARD_NOT_EXHAUSTED_LIST_r22 963 -#define _GUARD_NOT_EXHAUSTED_LIST_r33 964 -#define _GUARD_NOT_EXHAUSTED_RANGE_r02 965 -#define _GUARD_NOT_EXHAUSTED_RANGE_r12 966 -#define _GUARD_NOT_EXHAUSTED_RANGE_r22 967 -#define _GUARD_NOT_EXHAUSTED_RANGE_r33 968 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 969 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 970 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 971 -#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 972 -#define _GUARD_THIRD_NULL_r03 973 -#define _GUARD_THIRD_NULL_r13 974 -#define _GUARD_THIRD_NULL_r23 975 -#define _GUARD_THIRD_NULL_r33 976 -#define _GUARD_TOS_ANY_DICT_r01 977 -#define _GUARD_TOS_ANY_DICT_r11 978 -#define _GUARD_TOS_ANY_DICT_r22 979 -#define _GUARD_TOS_ANY_DICT_r33 980 -#define _GUARD_TOS_ANY_SET_r01 981 -#define _GUARD_TOS_ANY_SET_r11 982 -#define _GUARD_TOS_ANY_SET_r22 983 -#define _GUARD_TOS_ANY_SET_r33 984 -#define _GUARD_TOS_DICT_r01 985 -#define _GUARD_TOS_DICT_r11 986 -#define _GUARD_TOS_DICT_r22 987 -#define _GUARD_TOS_DICT_r33 988 -#define _GUARD_TOS_FLOAT_r01 989 -#define _GUARD_TOS_FLOAT_r11 990 -#define _GUARD_TOS_FLOAT_r22 991 -#define _GUARD_TOS_FLOAT_r33 992 -#define _GUARD_TOS_FROZENDICT_r01 993 -#define _GUARD_TOS_FROZENDICT_r11 994 -#define _GUARD_TOS_FROZENDICT_r22 995 -#define _GUARD_TOS_FROZENDICT_r33 996 -#define _GUARD_TOS_FROZENSET_r01 997 -#define _GUARD_TOS_FROZENSET_r11 998 -#define _GUARD_TOS_FROZENSET_r22 999 -#define _GUARD_TOS_FROZENSET_r33 1000 -#define _GUARD_TOS_INT_r01 1001 -#define _GUARD_TOS_INT_r11 1002 -#define _GUARD_TOS_INT_r22 1003 -#define _GUARD_TOS_INT_r33 1004 -#define _GUARD_TOS_LIST_r01 1005 -#define _GUARD_TOS_LIST_r11 1006 -#define _GUARD_TOS_LIST_r22 1007 -#define _GUARD_TOS_LIST_r33 1008 -#define _GUARD_TOS_OVERFLOWED_r01 1009 -#define _GUARD_TOS_OVERFLOWED_r11 1010 -#define _GUARD_TOS_OVERFLOWED_r22 1011 -#define _GUARD_TOS_OVERFLOWED_r33 1012 -#define _GUARD_TOS_SET_r01 1013 -#define _GUARD_TOS_SET_r11 1014 -#define _GUARD_TOS_SET_r22 1015 -#define _GUARD_TOS_SET_r33 1016 -#define _GUARD_TOS_SLICE_r01 1017 -#define _GUARD_TOS_SLICE_r11 1018 -#define _GUARD_TOS_SLICE_r22 1019 -#define _GUARD_TOS_SLICE_r33 1020 -#define _GUARD_TOS_TUPLE_r01 1021 -#define _GUARD_TOS_TUPLE_r11 1022 -#define _GUARD_TOS_TUPLE_r22 1023 -#define _GUARD_TOS_TUPLE_r33 1024 -#define _GUARD_TOS_UNICODE_r01 1025 -#define _GUARD_TOS_UNICODE_r11 1026 -#define _GUARD_TOS_UNICODE_r22 1027 -#define _GUARD_TOS_UNICODE_r33 1028 -#define _GUARD_TYPE_VERSION_r01 1029 -#define _GUARD_TYPE_VERSION_r11 1030 -#define _GUARD_TYPE_VERSION_r22 1031 -#define _GUARD_TYPE_VERSION_r33 1032 -#define _GUARD_TYPE_VERSION_LOCKED_r01 1033 -#define _GUARD_TYPE_VERSION_LOCKED_r11 1034 -#define _GUARD_TYPE_VERSION_LOCKED_r22 1035 -#define _GUARD_TYPE_VERSION_LOCKED_r33 1036 -#define _HANDLE_PENDING_AND_DEOPT_r00 1037 -#define _HANDLE_PENDING_AND_DEOPT_r10 1038 -#define _HANDLE_PENDING_AND_DEOPT_r20 1039 -#define _HANDLE_PENDING_AND_DEOPT_r30 1040 -#define _IMPORT_FROM_r12 1041 -#define _IMPORT_NAME_r21 1042 -#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1043 -#define _INIT_CALL_PY_EXACT_ARGS_r01 1044 -#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1045 -#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1046 -#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1047 -#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1048 -#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1049 -#define _INSERT_1_LOAD_CONST_INLINE_r02 1050 -#define _INSERT_1_LOAD_CONST_INLINE_r12 1051 -#define _INSERT_1_LOAD_CONST_INLINE_r23 1052 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1053 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1054 -#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1055 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1056 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1057 -#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1058 -#define _INSERT_NULL_r10 1059 -#define _INSTRUMENTED_FOR_ITER_r23 1060 -#define _INSTRUMENTED_INSTRUCTION_r00 1061 -#define _INSTRUMENTED_JUMP_FORWARD_r00 1062 -#define _INSTRUMENTED_JUMP_FORWARD_r11 1063 -#define _INSTRUMENTED_JUMP_FORWARD_r22 1064 -#define _INSTRUMENTED_JUMP_FORWARD_r33 1065 -#define _INSTRUMENTED_LINE_r00 1066 -#define _INSTRUMENTED_NOT_TAKEN_r00 1067 -#define _INSTRUMENTED_NOT_TAKEN_r11 1068 -#define _INSTRUMENTED_NOT_TAKEN_r22 1069 -#define _INSTRUMENTED_NOT_TAKEN_r33 1070 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1071 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1072 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1073 -#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1074 -#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1075 -#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1076 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1077 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1078 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1079 -#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1080 -#define _IS_NONE_r11 1081 -#define _IS_OP_r03 1082 -#define _IS_OP_r13 1083 -#define _IS_OP_r23 1084 -#define _ITER_CHECK_LIST_r02 1085 -#define _ITER_CHECK_LIST_r12 1086 -#define _ITER_CHECK_LIST_r22 1087 -#define _ITER_CHECK_LIST_r33 1088 -#define _ITER_CHECK_RANGE_r02 1089 -#define _ITER_CHECK_RANGE_r12 1090 -#define _ITER_CHECK_RANGE_r22 1091 -#define _ITER_CHECK_RANGE_r33 1092 -#define _ITER_CHECK_TUPLE_r02 1093 -#define _ITER_CHECK_TUPLE_r12 1094 -#define _ITER_CHECK_TUPLE_r22 1095 -#define _ITER_CHECK_TUPLE_r33 1096 -#define _ITER_JUMP_LIST_r02 1097 -#define _ITER_JUMP_LIST_r12 1098 -#define _ITER_JUMP_LIST_r22 1099 -#define _ITER_JUMP_LIST_r33 1100 -#define _ITER_JUMP_RANGE_r02 1101 -#define _ITER_JUMP_RANGE_r12 1102 -#define _ITER_JUMP_RANGE_r22 1103 -#define _ITER_JUMP_RANGE_r33 1104 -#define _ITER_JUMP_TUPLE_r02 1105 -#define _ITER_JUMP_TUPLE_r12 1106 -#define _ITER_JUMP_TUPLE_r22 1107 -#define _ITER_JUMP_TUPLE_r33 1108 -#define _ITER_NEXT_LIST_r23 1109 -#define _ITER_NEXT_LIST_TIER_TWO_r23 1110 -#define _ITER_NEXT_RANGE_r03 1111 -#define _ITER_NEXT_RANGE_r13 1112 -#define _ITER_NEXT_RANGE_r23 1113 -#define _ITER_NEXT_TUPLE_r03 1114 -#define _ITER_NEXT_TUPLE_r13 1115 -#define _ITER_NEXT_TUPLE_r23 1116 -#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1117 -#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1118 -#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1119 -#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1120 -#define _JUMP_TO_TOP_r00 1121 -#define _LIST_APPEND_r10 1122 -#define _LIST_EXTEND_r10 1123 -#define _LOAD_ATTR_r10 1124 -#define _LOAD_ATTR_CLASS_r11 1125 -#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1126 -#define _LOAD_ATTR_INSTANCE_VALUE_r02 1127 -#define _LOAD_ATTR_INSTANCE_VALUE_r12 1128 -#define _LOAD_ATTR_INSTANCE_VALUE_r23 1129 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1130 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1131 -#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1132 -#define _LOAD_ATTR_METHOD_NO_DICT_r02 1133 -#define _LOAD_ATTR_METHOD_NO_DICT_r12 1134 -#define _LOAD_ATTR_METHOD_NO_DICT_r23 1135 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1136 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1137 -#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1138 -#define _LOAD_ATTR_MODULE_r12 1139 -#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1140 -#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1141 -#define _LOAD_ATTR_PROPERTY_FRAME_r11 1142 -#define _LOAD_ATTR_SLOT_r02 1143 -#define _LOAD_ATTR_SLOT_r12 1144 -#define _LOAD_ATTR_SLOT_r23 1145 -#define _LOAD_ATTR_WITH_HINT_r12 1146 -#define _LOAD_BUILD_CLASS_r01 1147 -#define _LOAD_BYTECODE_r00 1148 -#define _LOAD_COMMON_CONSTANT_r01 1149 -#define _LOAD_COMMON_CONSTANT_r12 1150 -#define _LOAD_COMMON_CONSTANT_r23 1151 -#define _LOAD_CONST_r01 1152 -#define _LOAD_CONST_r12 1153 -#define _LOAD_CONST_r23 1154 -#define _LOAD_CONST_INLINE_r01 1155 -#define _LOAD_CONST_INLINE_r12 1156 -#define _LOAD_CONST_INLINE_r23 1157 -#define _LOAD_CONST_INLINE_BORROW_r01 1158 -#define _LOAD_CONST_INLINE_BORROW_r12 1159 -#define _LOAD_CONST_INLINE_BORROW_r23 1160 -#define _LOAD_CONST_UNDER_INLINE_r02 1161 -#define _LOAD_CONST_UNDER_INLINE_r12 1162 -#define _LOAD_CONST_UNDER_INLINE_r23 1163 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1164 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1165 -#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1166 -#define _LOAD_DEREF_r01 1167 -#define _LOAD_FAST_r01 1168 -#define _LOAD_FAST_r12 1169 -#define _LOAD_FAST_r23 1170 -#define _LOAD_FAST_0_r01 1171 -#define _LOAD_FAST_0_r12 1172 -#define _LOAD_FAST_0_r23 1173 -#define _LOAD_FAST_1_r01 1174 -#define _LOAD_FAST_1_r12 1175 -#define _LOAD_FAST_1_r23 1176 -#define _LOAD_FAST_2_r01 1177 -#define _LOAD_FAST_2_r12 1178 -#define _LOAD_FAST_2_r23 1179 -#define _LOAD_FAST_3_r01 1180 -#define _LOAD_FAST_3_r12 1181 -#define _LOAD_FAST_3_r23 1182 -#define _LOAD_FAST_4_r01 1183 -#define _LOAD_FAST_4_r12 1184 -#define _LOAD_FAST_4_r23 1185 -#define _LOAD_FAST_5_r01 1186 -#define _LOAD_FAST_5_r12 1187 -#define _LOAD_FAST_5_r23 1188 -#define _LOAD_FAST_6_r01 1189 -#define _LOAD_FAST_6_r12 1190 -#define _LOAD_FAST_6_r23 1191 -#define _LOAD_FAST_7_r01 1192 -#define _LOAD_FAST_7_r12 1193 -#define _LOAD_FAST_7_r23 1194 -#define _LOAD_FAST_AND_CLEAR_r01 1195 -#define _LOAD_FAST_AND_CLEAR_r12 1196 -#define _LOAD_FAST_AND_CLEAR_r23 1197 -#define _LOAD_FAST_BORROW_r01 1198 -#define _LOAD_FAST_BORROW_r12 1199 -#define _LOAD_FAST_BORROW_r23 1200 -#define _LOAD_FAST_BORROW_0_r01 1201 -#define _LOAD_FAST_BORROW_0_r12 1202 -#define _LOAD_FAST_BORROW_0_r23 1203 -#define _LOAD_FAST_BORROW_1_r01 1204 -#define _LOAD_FAST_BORROW_1_r12 1205 -#define _LOAD_FAST_BORROW_1_r23 1206 -#define _LOAD_FAST_BORROW_2_r01 1207 -#define _LOAD_FAST_BORROW_2_r12 1208 -#define _LOAD_FAST_BORROW_2_r23 1209 -#define _LOAD_FAST_BORROW_3_r01 1210 -#define _LOAD_FAST_BORROW_3_r12 1211 -#define _LOAD_FAST_BORROW_3_r23 1212 -#define _LOAD_FAST_BORROW_4_r01 1213 -#define _LOAD_FAST_BORROW_4_r12 1214 -#define _LOAD_FAST_BORROW_4_r23 1215 -#define _LOAD_FAST_BORROW_5_r01 1216 -#define _LOAD_FAST_BORROW_5_r12 1217 -#define _LOAD_FAST_BORROW_5_r23 1218 -#define _LOAD_FAST_BORROW_6_r01 1219 -#define _LOAD_FAST_BORROW_6_r12 1220 -#define _LOAD_FAST_BORROW_6_r23 1221 -#define _LOAD_FAST_BORROW_7_r01 1222 -#define _LOAD_FAST_BORROW_7_r12 1223 -#define _LOAD_FAST_BORROW_7_r23 1224 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1225 -#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1226 -#define _LOAD_FAST_CHECK_r01 1227 -#define _LOAD_FAST_CHECK_r12 1228 -#define _LOAD_FAST_CHECK_r23 1229 -#define _LOAD_FAST_LOAD_FAST_r02 1230 -#define _LOAD_FAST_LOAD_FAST_r13 1231 -#define _LOAD_FROM_DICT_OR_DEREF_r11 1232 -#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1233 -#define _LOAD_GLOBAL_r00 1234 -#define _LOAD_GLOBAL_BUILTINS_r01 1235 -#define _LOAD_GLOBAL_MODULE_r01 1236 -#define _LOAD_LOCALS_r01 1237 -#define _LOAD_LOCALS_r12 1238 -#define _LOAD_LOCALS_r23 1239 -#define _LOAD_NAME_r01 1240 -#define _LOAD_SMALL_INT_r01 1241 -#define _LOAD_SMALL_INT_r12 1242 -#define _LOAD_SMALL_INT_r23 1243 -#define _LOAD_SMALL_INT_0_r01 1244 -#define _LOAD_SMALL_INT_0_r12 1245 -#define _LOAD_SMALL_INT_0_r23 1246 -#define _LOAD_SMALL_INT_1_r01 1247 -#define _LOAD_SMALL_INT_1_r12 1248 -#define _LOAD_SMALL_INT_1_r23 1249 -#define _LOAD_SMALL_INT_2_r01 1250 -#define _LOAD_SMALL_INT_2_r12 1251 -#define _LOAD_SMALL_INT_2_r23 1252 -#define _LOAD_SMALL_INT_3_r01 1253 -#define _LOAD_SMALL_INT_3_r12 1254 -#define _LOAD_SMALL_INT_3_r23 1255 -#define _LOAD_SPECIAL_r00 1256 -#define _LOAD_SUPER_ATTR_ATTR_r31 1257 -#define _LOAD_SUPER_ATTR_METHOD_r32 1258 -#define _LOCK_OBJECT_r01 1259 -#define _LOCK_OBJECT_r11 1260 -#define _LOCK_OBJECT_r22 1261 -#define _LOCK_OBJECT_r33 1262 -#define _MAKE_CALLARGS_A_TUPLE_r33 1263 -#define _MAKE_CELL_r00 1264 -#define _MAKE_FUNCTION_r11 1265 -#define _MAKE_HEAP_SAFE_r01 1266 -#define _MAKE_HEAP_SAFE_r11 1267 -#define _MAKE_HEAP_SAFE_r22 1268 -#define _MAKE_HEAP_SAFE_r33 1269 -#define _MAKE_WARM_r00 1270 -#define _MAKE_WARM_r11 1271 -#define _MAKE_WARM_r22 1272 -#define _MAKE_WARM_r33 1273 -#define _MAP_ADD_r20 1274 -#define _MATCH_CLASS_r31 1275 -#define _MATCH_KEYS_r23 1276 -#define _MATCH_MAPPING_r02 1277 -#define _MATCH_MAPPING_r12 1278 -#define _MATCH_MAPPING_r23 1279 -#define _MATCH_SEQUENCE_r02 1280 -#define _MATCH_SEQUENCE_r12 1281 -#define _MATCH_SEQUENCE_r23 1282 -#define _MAYBE_EXPAND_METHOD_r00 1283 -#define _MAYBE_EXPAND_METHOD_KW_r11 1284 -#define _MONITOR_CALL_r00 1285 -#define _MONITOR_CALL_KW_r11 1286 -#define _MONITOR_JUMP_BACKWARD_r00 1287 -#define _MONITOR_JUMP_BACKWARD_r11 1288 -#define _MONITOR_JUMP_BACKWARD_r22 1289 -#define _MONITOR_JUMP_BACKWARD_r33 1290 -#define _MONITOR_RESUME_r00 1291 -#define _NOP_r00 1292 -#define _NOP_r11 1293 -#define _NOP_r22 1294 -#define _NOP_r33 1295 -#define _POP_CALL_r20 1296 -#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1297 -#define _POP_CALL_ONE_r30 1298 -#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1299 -#define _POP_CALL_TWO_r30 1300 -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1301 -#define _POP_EXCEPT_r10 1302 -#define _POP_ITER_r20 1303 -#define _POP_JUMP_IF_FALSE_r00 1304 -#define _POP_JUMP_IF_FALSE_r10 1305 -#define _POP_JUMP_IF_FALSE_r21 1306 -#define _POP_JUMP_IF_FALSE_r32 1307 -#define _POP_JUMP_IF_TRUE_r00 1308 -#define _POP_JUMP_IF_TRUE_r10 1309 -#define _POP_JUMP_IF_TRUE_r21 1310 -#define _POP_JUMP_IF_TRUE_r32 1311 -#define _POP_TOP_r10 1312 -#define _POP_TOP_FLOAT_r00 1313 -#define _POP_TOP_FLOAT_r10 1314 -#define _POP_TOP_FLOAT_r21 1315 -#define _POP_TOP_FLOAT_r32 1316 -#define _POP_TOP_INT_r00 1317 -#define _POP_TOP_INT_r10 1318 -#define _POP_TOP_INT_r21 1319 -#define _POP_TOP_INT_r32 1320 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1321 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1322 -#define _POP_TOP_NOP_r00 1323 -#define _POP_TOP_NOP_r10 1324 -#define _POP_TOP_NOP_r21 1325 -#define _POP_TOP_NOP_r32 1326 -#define _POP_TOP_UNICODE_r00 1327 -#define _POP_TOP_UNICODE_r10 1328 -#define _POP_TOP_UNICODE_r21 1329 -#define _POP_TOP_UNICODE_r32 1330 -#define _POP_TWO_r20 1331 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1332 -#define _PUSH_EXC_INFO_r02 1333 -#define _PUSH_EXC_INFO_r12 1334 -#define _PUSH_EXC_INFO_r23 1335 -#define _PUSH_FRAME_r10 1336 -#define _PUSH_NULL_r01 1337 -#define _PUSH_NULL_r12 1338 -#define _PUSH_NULL_r23 1339 -#define _PUSH_NULL_CONDITIONAL_r00 1340 -#define _PY_FRAME_EX_r31 1341 -#define _PY_FRAME_GENERAL_r01 1342 -#define _PY_FRAME_KW_r11 1343 -#define _QUICKEN_TO_RESUME_CHECK_r00 1344 -#define _REPLACE_WITH_TRUE_r02 1345 -#define _REPLACE_WITH_TRUE_r12 1346 -#define _REPLACE_WITH_TRUE_r23 1347 -#define _RESUME_CHECK_r00 1348 -#define _RESUME_CHECK_r11 1349 -#define _RESUME_CHECK_r22 1350 -#define _RESUME_CHECK_r33 1351 -#define _RETURN_GENERATOR_r01 1352 -#define _RETURN_VALUE_r11 1353 -#define _SAVE_RETURN_OFFSET_r00 1354 -#define _SAVE_RETURN_OFFSET_r11 1355 -#define _SAVE_RETURN_OFFSET_r22 1356 -#define _SAVE_RETURN_OFFSET_r33 1357 -#define _SEND_r22 1358 -#define _SEND_GEN_FRAME_r22 1359 -#define _SETUP_ANNOTATIONS_r00 1360 -#define _SET_ADD_r10 1361 -#define _SET_FUNCTION_ATTRIBUTE_r01 1362 -#define _SET_FUNCTION_ATTRIBUTE_r11 1363 -#define _SET_FUNCTION_ATTRIBUTE_r21 1364 -#define _SET_FUNCTION_ATTRIBUTE_r32 1365 -#define _SET_IP_r00 1366 -#define _SET_IP_r11 1367 -#define _SET_IP_r22 1368 -#define _SET_IP_r33 1369 -#define _SET_UPDATE_r10 1370 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1371 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1372 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1373 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1374 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1375 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1376 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1377 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1378 -#define _SPILL_OR_RELOAD_r01 1379 -#define _SPILL_OR_RELOAD_r02 1380 -#define _SPILL_OR_RELOAD_r03 1381 -#define _SPILL_OR_RELOAD_r10 1382 -#define _SPILL_OR_RELOAD_r12 1383 -#define _SPILL_OR_RELOAD_r13 1384 -#define _SPILL_OR_RELOAD_r20 1385 -#define _SPILL_OR_RELOAD_r21 1386 -#define _SPILL_OR_RELOAD_r23 1387 -#define _SPILL_OR_RELOAD_r30 1388 -#define _SPILL_OR_RELOAD_r31 1389 -#define _SPILL_OR_RELOAD_r32 1390 -#define _START_EXECUTOR_r00 1391 -#define _STORE_ATTR_r20 1392 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1393 -#define _STORE_ATTR_SLOT_r21 1394 -#define _STORE_ATTR_WITH_HINT_r21 1395 -#define _STORE_DEREF_r10 1396 -#define _STORE_FAST_LOAD_FAST_r11 1397 -#define _STORE_FAST_STORE_FAST_r20 1398 -#define _STORE_GLOBAL_r10 1399 -#define _STORE_NAME_r10 1400 -#define _STORE_SLICE_r30 1401 -#define _STORE_SUBSCR_r30 1402 -#define _STORE_SUBSCR_DICT_r31 1403 -#define _STORE_SUBSCR_LIST_INT_r32 1404 -#define _SWAP_r11 1405 -#define _SWAP_2_r02 1406 -#define _SWAP_2_r12 1407 -#define _SWAP_2_r22 1408 -#define _SWAP_2_r33 1409 -#define _SWAP_3_r03 1410 -#define _SWAP_3_r13 1411 -#define _SWAP_3_r23 1412 -#define _SWAP_3_r33 1413 -#define _SWAP_FAST_r01 1414 -#define _SWAP_FAST_r11 1415 -#define _SWAP_FAST_r22 1416 -#define _SWAP_FAST_r33 1417 -#define _SWAP_FAST_0_r01 1418 -#define _SWAP_FAST_0_r11 1419 -#define _SWAP_FAST_0_r22 1420 -#define _SWAP_FAST_0_r33 1421 -#define _SWAP_FAST_1_r01 1422 -#define _SWAP_FAST_1_r11 1423 -#define _SWAP_FAST_1_r22 1424 -#define _SWAP_FAST_1_r33 1425 -#define _SWAP_FAST_2_r01 1426 -#define _SWAP_FAST_2_r11 1427 -#define _SWAP_FAST_2_r22 1428 -#define _SWAP_FAST_2_r33 1429 -#define _SWAP_FAST_3_r01 1430 -#define _SWAP_FAST_3_r11 1431 -#define _SWAP_FAST_3_r22 1432 -#define _SWAP_FAST_3_r33 1433 -#define _SWAP_FAST_4_r01 1434 -#define _SWAP_FAST_4_r11 1435 -#define _SWAP_FAST_4_r22 1436 -#define _SWAP_FAST_4_r33 1437 -#define _SWAP_FAST_5_r01 1438 -#define _SWAP_FAST_5_r11 1439 -#define _SWAP_FAST_5_r22 1440 -#define _SWAP_FAST_5_r33 1441 -#define _SWAP_FAST_6_r01 1442 -#define _SWAP_FAST_6_r11 1443 -#define _SWAP_FAST_6_r22 1444 -#define _SWAP_FAST_6_r33 1445 -#define _SWAP_FAST_7_r01 1446 -#define _SWAP_FAST_7_r11 1447 -#define _SWAP_FAST_7_r22 1448 -#define _SWAP_FAST_7_r33 1449 -#define _TIER2_RESUME_CHECK_r00 1450 -#define _TIER2_RESUME_CHECK_r11 1451 -#define _TIER2_RESUME_CHECK_r22 1452 -#define _TIER2_RESUME_CHECK_r33 1453 -#define _TO_BOOL_r11 1454 -#define _TO_BOOL_BOOL_r01 1455 -#define _TO_BOOL_BOOL_r11 1456 -#define _TO_BOOL_BOOL_r22 1457 -#define _TO_BOOL_BOOL_r33 1458 -#define _TO_BOOL_INT_r02 1459 -#define _TO_BOOL_INT_r12 1460 -#define _TO_BOOL_INT_r23 1461 -#define _TO_BOOL_LIST_r02 1462 -#define _TO_BOOL_LIST_r12 1463 -#define _TO_BOOL_LIST_r23 1464 -#define _TO_BOOL_NONE_r01 1465 -#define _TO_BOOL_NONE_r11 1466 -#define _TO_BOOL_NONE_r22 1467 -#define _TO_BOOL_NONE_r33 1468 -#define _TO_BOOL_STR_r02 1469 -#define _TO_BOOL_STR_r12 1470 -#define _TO_BOOL_STR_r23 1471 -#define _TRACE_RECORD_r00 1472 -#define _UNARY_INVERT_r12 1473 -#define _UNARY_NEGATIVE_r12 1474 -#define _UNARY_NOT_r01 1475 -#define _UNARY_NOT_r11 1476 -#define _UNARY_NOT_r22 1477 -#define _UNARY_NOT_r33 1478 -#define _UNPACK_EX_r10 1479 -#define _UNPACK_SEQUENCE_r10 1480 -#define _UNPACK_SEQUENCE_LIST_r10 1481 -#define _UNPACK_SEQUENCE_TUPLE_r10 1482 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1483 -#define _WITH_EXCEPT_START_r33 1484 -#define _YIELD_VALUE_r11 1485 -#define MAX_UOP_REGS_ID 1485 +#define _YIELD_VALUE 597 +#define MAX_UOP_ID 597 +#define _BINARY_OP_r23 598 +#define _BINARY_OP_ADD_FLOAT_r03 599 +#define _BINARY_OP_ADD_FLOAT_r13 600 +#define _BINARY_OP_ADD_FLOAT_r23 601 +#define _BINARY_OP_ADD_INT_r03 602 +#define _BINARY_OP_ADD_INT_r13 603 +#define _BINARY_OP_ADD_INT_r23 604 +#define _BINARY_OP_ADD_UNICODE_r03 605 +#define _BINARY_OP_ADD_UNICODE_r13 606 +#define _BINARY_OP_ADD_UNICODE_r23 607 +#define _BINARY_OP_EXTEND_r23 608 +#define _BINARY_OP_INPLACE_ADD_UNICODE_r21 609 +#define _BINARY_OP_MULTIPLY_FLOAT_r03 610 +#define _BINARY_OP_MULTIPLY_FLOAT_r13 611 +#define _BINARY_OP_MULTIPLY_FLOAT_r23 612 +#define _BINARY_OP_MULTIPLY_INT_r03 613 +#define _BINARY_OP_MULTIPLY_INT_r13 614 +#define _BINARY_OP_MULTIPLY_INT_r23 615 +#define _BINARY_OP_SUBSCR_CHECK_FUNC_r23 616 +#define _BINARY_OP_SUBSCR_DICT_r23 617 +#define _BINARY_OP_SUBSCR_INIT_CALL_r01 618 +#define _BINARY_OP_SUBSCR_INIT_CALL_r11 619 +#define _BINARY_OP_SUBSCR_INIT_CALL_r21 620 +#define _BINARY_OP_SUBSCR_INIT_CALL_r31 621 +#define _BINARY_OP_SUBSCR_LIST_INT_r23 622 +#define _BINARY_OP_SUBSCR_LIST_SLICE_r23 623 +#define _BINARY_OP_SUBSCR_STR_INT_r23 624 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r03 625 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r13 626 +#define _BINARY_OP_SUBSCR_TUPLE_INT_r23 627 +#define _BINARY_OP_SUBSCR_USTR_INT_r23 628 +#define _BINARY_OP_SUBTRACT_FLOAT_r03 629 +#define _BINARY_OP_SUBTRACT_FLOAT_r13 630 +#define _BINARY_OP_SUBTRACT_FLOAT_r23 631 +#define _BINARY_OP_SUBTRACT_INT_r03 632 +#define _BINARY_OP_SUBTRACT_INT_r13 633 +#define _BINARY_OP_SUBTRACT_INT_r23 634 +#define _BINARY_SLICE_r31 635 +#define _BUILD_INTERPOLATION_r01 636 +#define _BUILD_LIST_r01 637 +#define _BUILD_MAP_r01 638 +#define _BUILD_SET_r01 639 +#define _BUILD_SLICE_r01 640 +#define _BUILD_STRING_r01 641 +#define _BUILD_TEMPLATE_r21 642 +#define _BUILD_TUPLE_r01 643 +#define _CALL_BUILTIN_CLASS_r01 644 +#define _CALL_BUILTIN_FAST_r01 645 +#define _CALL_BUILTIN_FAST_WITH_KEYWORDS_r01 646 +#define _CALL_BUILTIN_O_r03 647 +#define _CALL_FUNCTION_EX_NON_PY_GENERAL_r31 648 +#define _CALL_INTRINSIC_1_r11 649 +#define _CALL_INTRINSIC_2_r21 650 +#define _CALL_ISINSTANCE_r31 651 +#define _CALL_KW_NON_PY_r11 652 +#define _CALL_LEN_r33 653 +#define _CALL_LIST_APPEND_r03 654 +#define _CALL_LIST_APPEND_r13 655 +#define _CALL_LIST_APPEND_r23 656 +#define _CALL_LIST_APPEND_r33 657 +#define _CALL_METHOD_DESCRIPTOR_FAST_r01 658 +#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS_r01 659 +#define _CALL_METHOD_DESCRIPTOR_NOARGS_r01 660 +#define _CALL_METHOD_DESCRIPTOR_O_r03 661 +#define _CALL_NON_PY_GENERAL_r01 662 +#define _CALL_STR_1_r32 663 +#define _CALL_TUPLE_1_r32 664 +#define _CALL_TYPE_1_r02 665 +#define _CALL_TYPE_1_r12 666 +#define _CALL_TYPE_1_r22 667 +#define _CALL_TYPE_1_r32 668 +#define _CHECK_AND_ALLOCATE_OBJECT_r00 669 +#define _CHECK_ATTR_CLASS_r01 670 +#define _CHECK_ATTR_CLASS_r11 671 +#define _CHECK_ATTR_CLASS_r22 672 +#define _CHECK_ATTR_CLASS_r33 673 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r01 674 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r11 675 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r22 676 +#define _CHECK_ATTR_METHOD_LAZY_DICT_r33 677 +#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS_r00 678 +#define _CHECK_EG_MATCH_r22 679 +#define _CHECK_EXC_MATCH_r22 680 +#define _CHECK_FUNCTION_EXACT_ARGS_r00 681 +#define _CHECK_FUNCTION_VERSION_r00 682 +#define _CHECK_FUNCTION_VERSION_INLINE_r00 683 +#define _CHECK_FUNCTION_VERSION_INLINE_r11 684 +#define _CHECK_FUNCTION_VERSION_INLINE_r22 685 +#define _CHECK_FUNCTION_VERSION_INLINE_r33 686 +#define _CHECK_FUNCTION_VERSION_KW_r11 687 +#define _CHECK_IS_NOT_PY_CALLABLE_r00 688 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r03 689 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r13 690 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r23 691 +#define _CHECK_IS_NOT_PY_CALLABLE_EX_r33 692 +#define _CHECK_IS_NOT_PY_CALLABLE_KW_r11 693 +#define _CHECK_IS_PY_CALLABLE_EX_r03 694 +#define _CHECK_IS_PY_CALLABLE_EX_r13 695 +#define _CHECK_IS_PY_CALLABLE_EX_r23 696 +#define _CHECK_IS_PY_CALLABLE_EX_r33 697 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r01 698 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r11 699 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r22 700 +#define _CHECK_MANAGED_OBJECT_HAS_VALUES_r33 701 +#define _CHECK_METHOD_VERSION_r00 702 +#define _CHECK_METHOD_VERSION_KW_r11 703 +#define _CHECK_PEP_523_r00 704 +#define _CHECK_PEP_523_r11 705 +#define _CHECK_PEP_523_r22 706 +#define _CHECK_PEP_523_r33 707 +#define _CHECK_PERIODIC_r00 708 +#define _CHECK_PERIODIC_AT_END_r00 709 +#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM_r00 710 +#define _CHECK_RECURSION_REMAINING_r00 711 +#define _CHECK_RECURSION_REMAINING_r11 712 +#define _CHECK_RECURSION_REMAINING_r22 713 +#define _CHECK_RECURSION_REMAINING_r33 714 +#define _CHECK_STACK_SPACE_r00 715 +#define _CHECK_STACK_SPACE_OPERAND_r00 716 +#define _CHECK_STACK_SPACE_OPERAND_r11 717 +#define _CHECK_STACK_SPACE_OPERAND_r22 718 +#define _CHECK_STACK_SPACE_OPERAND_r33 719 +#define _CHECK_VALIDITY_r00 720 +#define _CHECK_VALIDITY_r11 721 +#define _CHECK_VALIDITY_r22 722 +#define _CHECK_VALIDITY_r33 723 +#define _COLD_DYNAMIC_EXIT_r00 724 +#define _COLD_EXIT_r00 725 +#define _COMPARE_OP_r21 726 +#define _COMPARE_OP_FLOAT_r03 727 +#define _COMPARE_OP_FLOAT_r13 728 +#define _COMPARE_OP_FLOAT_r23 729 +#define _COMPARE_OP_INT_r23 730 +#define _COMPARE_OP_STR_r23 731 +#define _CONTAINS_OP_r23 732 +#define _CONTAINS_OP_DICT_r23 733 +#define _CONTAINS_OP_SET_r23 734 +#define _CONVERT_VALUE_r11 735 +#define _COPY_r01 736 +#define _COPY_1_r02 737 +#define _COPY_1_r12 738 +#define _COPY_1_r23 739 +#define _COPY_2_r03 740 +#define _COPY_2_r13 741 +#define _COPY_2_r23 742 +#define _COPY_3_r03 743 +#define _COPY_3_r13 744 +#define _COPY_3_r23 745 +#define _COPY_3_r33 746 +#define _COPY_FREE_VARS_r00 747 +#define _COPY_FREE_VARS_r11 748 +#define _COPY_FREE_VARS_r22 749 +#define _COPY_FREE_VARS_r33 750 +#define _CREATE_INIT_FRAME_r01 751 +#define _DELETE_ATTR_r10 752 +#define _DELETE_DEREF_r00 753 +#define _DELETE_FAST_r00 754 +#define _DELETE_GLOBAL_r00 755 +#define _DELETE_NAME_r00 756 +#define _DELETE_SUBSCR_r20 757 +#define _DEOPT_r00 758 +#define _DEOPT_r10 759 +#define _DEOPT_r20 760 +#define _DEOPT_r30 761 +#define _DICT_MERGE_r10 762 +#define _DICT_UPDATE_r10 763 +#define _DO_CALL_r01 764 +#define _DO_CALL_FUNCTION_EX_r31 765 +#define _DO_CALL_KW_r11 766 +#define _DYNAMIC_EXIT_r00 767 +#define _DYNAMIC_EXIT_r10 768 +#define _DYNAMIC_EXIT_r20 769 +#define _DYNAMIC_EXIT_r30 770 +#define _END_FOR_r10 771 +#define _END_SEND_r21 772 +#define _ERROR_POP_N_r00 773 +#define _EXIT_INIT_CHECK_r10 774 +#define _EXIT_TRACE_r00 775 +#define _EXIT_TRACE_r10 776 +#define _EXIT_TRACE_r20 777 +#define _EXIT_TRACE_r30 778 +#define _EXPAND_METHOD_r00 779 +#define _EXPAND_METHOD_KW_r11 780 +#define _FATAL_ERROR_r00 781 +#define _FATAL_ERROR_r11 782 +#define _FATAL_ERROR_r22 783 +#define _FATAL_ERROR_r33 784 +#define _FORMAT_SIMPLE_r11 785 +#define _FORMAT_WITH_SPEC_r21 786 +#define _FOR_ITER_r23 787 +#define _FOR_ITER_GEN_FRAME_r03 788 +#define _FOR_ITER_GEN_FRAME_r13 789 +#define _FOR_ITER_GEN_FRAME_r23 790 +#define _FOR_ITER_TIER_TWO_r23 791 +#define _GET_AITER_r11 792 +#define _GET_ANEXT_r12 793 +#define _GET_AWAITABLE_r11 794 +#define _GET_ITER_r12 795 +#define _GET_LEN_r12 796 +#define _GET_YIELD_FROM_ITER_r11 797 +#define _GUARD_BINARY_OP_EXTEND_r22 798 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r02 799 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r12 800 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r22 801 +#define _GUARD_BINARY_OP_SUBSCR_TUPLE_INT_BOUNDS_r33 802 +#define _GUARD_BIT_IS_SET_POP_r00 803 +#define _GUARD_BIT_IS_SET_POP_r10 804 +#define _GUARD_BIT_IS_SET_POP_r21 805 +#define _GUARD_BIT_IS_SET_POP_r32 806 +#define _GUARD_BIT_IS_SET_POP_4_r00 807 +#define _GUARD_BIT_IS_SET_POP_4_r10 808 +#define _GUARD_BIT_IS_SET_POP_4_r21 809 +#define _GUARD_BIT_IS_SET_POP_4_r32 810 +#define _GUARD_BIT_IS_SET_POP_5_r00 811 +#define _GUARD_BIT_IS_SET_POP_5_r10 812 +#define _GUARD_BIT_IS_SET_POP_5_r21 813 +#define _GUARD_BIT_IS_SET_POP_5_r32 814 +#define _GUARD_BIT_IS_SET_POP_6_r00 815 +#define _GUARD_BIT_IS_SET_POP_6_r10 816 +#define _GUARD_BIT_IS_SET_POP_6_r21 817 +#define _GUARD_BIT_IS_SET_POP_6_r32 818 +#define _GUARD_BIT_IS_SET_POP_7_r00 819 +#define _GUARD_BIT_IS_SET_POP_7_r10 820 +#define _GUARD_BIT_IS_SET_POP_7_r21 821 +#define _GUARD_BIT_IS_SET_POP_7_r32 822 +#define _GUARD_BIT_IS_UNSET_POP_r00 823 +#define _GUARD_BIT_IS_UNSET_POP_r10 824 +#define _GUARD_BIT_IS_UNSET_POP_r21 825 +#define _GUARD_BIT_IS_UNSET_POP_r32 826 +#define _GUARD_BIT_IS_UNSET_POP_4_r00 827 +#define _GUARD_BIT_IS_UNSET_POP_4_r10 828 +#define _GUARD_BIT_IS_UNSET_POP_4_r21 829 +#define _GUARD_BIT_IS_UNSET_POP_4_r32 830 +#define _GUARD_BIT_IS_UNSET_POP_5_r00 831 +#define _GUARD_BIT_IS_UNSET_POP_5_r10 832 +#define _GUARD_BIT_IS_UNSET_POP_5_r21 833 +#define _GUARD_BIT_IS_UNSET_POP_5_r32 834 +#define _GUARD_BIT_IS_UNSET_POP_6_r00 835 +#define _GUARD_BIT_IS_UNSET_POP_6_r10 836 +#define _GUARD_BIT_IS_UNSET_POP_6_r21 837 +#define _GUARD_BIT_IS_UNSET_POP_6_r32 838 +#define _GUARD_BIT_IS_UNSET_POP_7_r00 839 +#define _GUARD_BIT_IS_UNSET_POP_7_r10 840 +#define _GUARD_BIT_IS_UNSET_POP_7_r21 841 +#define _GUARD_BIT_IS_UNSET_POP_7_r32 842 +#define _GUARD_CALLABLE_ISINSTANCE_r03 843 +#define _GUARD_CALLABLE_ISINSTANCE_r13 844 +#define _GUARD_CALLABLE_ISINSTANCE_r23 845 +#define _GUARD_CALLABLE_ISINSTANCE_r33 846 +#define _GUARD_CALLABLE_LEN_r03 847 +#define _GUARD_CALLABLE_LEN_r13 848 +#define _GUARD_CALLABLE_LEN_r23 849 +#define _GUARD_CALLABLE_LEN_r33 850 +#define _GUARD_CALLABLE_LIST_APPEND_r03 851 +#define _GUARD_CALLABLE_LIST_APPEND_r13 852 +#define _GUARD_CALLABLE_LIST_APPEND_r23 853 +#define _GUARD_CALLABLE_LIST_APPEND_r33 854 +#define _GUARD_CALLABLE_STR_1_r03 855 +#define _GUARD_CALLABLE_STR_1_r13 856 +#define _GUARD_CALLABLE_STR_1_r23 857 +#define _GUARD_CALLABLE_STR_1_r33 858 +#define _GUARD_CALLABLE_TUPLE_1_r03 859 +#define _GUARD_CALLABLE_TUPLE_1_r13 860 +#define _GUARD_CALLABLE_TUPLE_1_r23 861 +#define _GUARD_CALLABLE_TUPLE_1_r33 862 +#define _GUARD_CALLABLE_TYPE_1_r03 863 +#define _GUARD_CALLABLE_TYPE_1_r13 864 +#define _GUARD_CALLABLE_TYPE_1_r23 865 +#define _GUARD_CALLABLE_TYPE_1_r33 866 +#define _GUARD_CODE_VERSION_r00 867 +#define _GUARD_CODE_VERSION_r11 868 +#define _GUARD_CODE_VERSION_r22 869 +#define _GUARD_CODE_VERSION_r33 870 +#define _GUARD_DORV_NO_DICT_r01 871 +#define _GUARD_DORV_NO_DICT_r11 872 +#define _GUARD_DORV_NO_DICT_r22 873 +#define _GUARD_DORV_NO_DICT_r33 874 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r01 875 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r11 876 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r22 877 +#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT_r33 878 +#define _GUARD_GLOBALS_VERSION_r00 879 +#define _GUARD_GLOBALS_VERSION_r11 880 +#define _GUARD_GLOBALS_VERSION_r22 881 +#define _GUARD_GLOBALS_VERSION_r33 882 +#define _GUARD_IP_RETURN_GENERATOR_r00 883 +#define _GUARD_IP_RETURN_GENERATOR_r11 884 +#define _GUARD_IP_RETURN_GENERATOR_r22 885 +#define _GUARD_IP_RETURN_GENERATOR_r33 886 +#define _GUARD_IP_RETURN_VALUE_r00 887 +#define _GUARD_IP_RETURN_VALUE_r11 888 +#define _GUARD_IP_RETURN_VALUE_r22 889 +#define _GUARD_IP_RETURN_VALUE_r33 890 +#define _GUARD_IP_YIELD_VALUE_r00 891 +#define _GUARD_IP_YIELD_VALUE_r11 892 +#define _GUARD_IP_YIELD_VALUE_r22 893 +#define _GUARD_IP_YIELD_VALUE_r33 894 +#define _GUARD_IP__PUSH_FRAME_r00 895 +#define _GUARD_IP__PUSH_FRAME_r11 896 +#define _GUARD_IP__PUSH_FRAME_r22 897 +#define _GUARD_IP__PUSH_FRAME_r33 898 +#define _GUARD_IS_FALSE_POP_r00 899 +#define _GUARD_IS_FALSE_POP_r10 900 +#define _GUARD_IS_FALSE_POP_r21 901 +#define _GUARD_IS_FALSE_POP_r32 902 +#define _GUARD_IS_NONE_POP_r00 903 +#define _GUARD_IS_NONE_POP_r10 904 +#define _GUARD_IS_NONE_POP_r21 905 +#define _GUARD_IS_NONE_POP_r32 906 +#define _GUARD_IS_NOT_NONE_POP_r10 907 +#define _GUARD_IS_TRUE_POP_r00 908 +#define _GUARD_IS_TRUE_POP_r10 909 +#define _GUARD_IS_TRUE_POP_r21 910 +#define _GUARD_IS_TRUE_POP_r32 911 +#define _GUARD_KEYS_VERSION_r01 912 +#define _GUARD_KEYS_VERSION_r11 913 +#define _GUARD_KEYS_VERSION_r22 914 +#define _GUARD_KEYS_VERSION_r33 915 +#define _GUARD_NOS_ANY_DICT_r02 916 +#define _GUARD_NOS_ANY_DICT_r12 917 +#define _GUARD_NOS_ANY_DICT_r22 918 +#define _GUARD_NOS_ANY_DICT_r33 919 +#define _GUARD_NOS_COMPACT_ASCII_r02 920 +#define _GUARD_NOS_COMPACT_ASCII_r12 921 +#define _GUARD_NOS_COMPACT_ASCII_r22 922 +#define _GUARD_NOS_COMPACT_ASCII_r33 923 +#define _GUARD_NOS_DICT_r02 924 +#define _GUARD_NOS_DICT_r12 925 +#define _GUARD_NOS_DICT_r22 926 +#define _GUARD_NOS_DICT_r33 927 +#define _GUARD_NOS_FLOAT_r02 928 +#define _GUARD_NOS_FLOAT_r12 929 +#define _GUARD_NOS_FLOAT_r22 930 +#define _GUARD_NOS_FLOAT_r33 931 +#define _GUARD_NOS_INT_r02 932 +#define _GUARD_NOS_INT_r12 933 +#define _GUARD_NOS_INT_r22 934 +#define _GUARD_NOS_INT_r33 935 +#define _GUARD_NOS_LIST_r02 936 +#define _GUARD_NOS_LIST_r12 937 +#define _GUARD_NOS_LIST_r22 938 +#define _GUARD_NOS_LIST_r33 939 +#define _GUARD_NOS_NOT_NULL_r02 940 +#define _GUARD_NOS_NOT_NULL_r12 941 +#define _GUARD_NOS_NOT_NULL_r22 942 +#define _GUARD_NOS_NOT_NULL_r33 943 +#define _GUARD_NOS_NULL_r02 944 +#define _GUARD_NOS_NULL_r12 945 +#define _GUARD_NOS_NULL_r22 946 +#define _GUARD_NOS_NULL_r33 947 +#define _GUARD_NOS_OVERFLOWED_r02 948 +#define _GUARD_NOS_OVERFLOWED_r12 949 +#define _GUARD_NOS_OVERFLOWED_r22 950 +#define _GUARD_NOS_OVERFLOWED_r33 951 +#define _GUARD_NOS_TUPLE_r02 952 +#define _GUARD_NOS_TUPLE_r12 953 +#define _GUARD_NOS_TUPLE_r22 954 +#define _GUARD_NOS_TUPLE_r33 955 +#define _GUARD_NOS_UNICODE_r02 956 +#define _GUARD_NOS_UNICODE_r12 957 +#define _GUARD_NOS_UNICODE_r22 958 +#define _GUARD_NOS_UNICODE_r33 959 +#define _GUARD_NOT_EXHAUSTED_LIST_r02 960 +#define _GUARD_NOT_EXHAUSTED_LIST_r12 961 +#define _GUARD_NOT_EXHAUSTED_LIST_r22 962 +#define _GUARD_NOT_EXHAUSTED_LIST_r33 963 +#define _GUARD_NOT_EXHAUSTED_RANGE_r02 964 +#define _GUARD_NOT_EXHAUSTED_RANGE_r12 965 +#define _GUARD_NOT_EXHAUSTED_RANGE_r22 966 +#define _GUARD_NOT_EXHAUSTED_RANGE_r33 967 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r02 968 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r12 969 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r22 970 +#define _GUARD_NOT_EXHAUSTED_TUPLE_r33 971 +#define _GUARD_THIRD_NULL_r03 972 +#define _GUARD_THIRD_NULL_r13 973 +#define _GUARD_THIRD_NULL_r23 974 +#define _GUARD_THIRD_NULL_r33 975 +#define _GUARD_TOS_ANY_DICT_r01 976 +#define _GUARD_TOS_ANY_DICT_r11 977 +#define _GUARD_TOS_ANY_DICT_r22 978 +#define _GUARD_TOS_ANY_DICT_r33 979 +#define _GUARD_TOS_ANY_SET_r01 980 +#define _GUARD_TOS_ANY_SET_r11 981 +#define _GUARD_TOS_ANY_SET_r22 982 +#define _GUARD_TOS_ANY_SET_r33 983 +#define _GUARD_TOS_DICT_r01 984 +#define _GUARD_TOS_DICT_r11 985 +#define _GUARD_TOS_DICT_r22 986 +#define _GUARD_TOS_DICT_r33 987 +#define _GUARD_TOS_FLOAT_r01 988 +#define _GUARD_TOS_FLOAT_r11 989 +#define _GUARD_TOS_FLOAT_r22 990 +#define _GUARD_TOS_FLOAT_r33 991 +#define _GUARD_TOS_FROZENDICT_r01 992 +#define _GUARD_TOS_FROZENDICT_r11 993 +#define _GUARD_TOS_FROZENDICT_r22 994 +#define _GUARD_TOS_FROZENDICT_r33 995 +#define _GUARD_TOS_FROZENSET_r01 996 +#define _GUARD_TOS_FROZENSET_r11 997 +#define _GUARD_TOS_FROZENSET_r22 998 +#define _GUARD_TOS_FROZENSET_r33 999 +#define _GUARD_TOS_INT_r01 1000 +#define _GUARD_TOS_INT_r11 1001 +#define _GUARD_TOS_INT_r22 1002 +#define _GUARD_TOS_INT_r33 1003 +#define _GUARD_TOS_LIST_r01 1004 +#define _GUARD_TOS_LIST_r11 1005 +#define _GUARD_TOS_LIST_r22 1006 +#define _GUARD_TOS_LIST_r33 1007 +#define _GUARD_TOS_OVERFLOWED_r01 1008 +#define _GUARD_TOS_OVERFLOWED_r11 1009 +#define _GUARD_TOS_OVERFLOWED_r22 1010 +#define _GUARD_TOS_OVERFLOWED_r33 1011 +#define _GUARD_TOS_SET_r01 1012 +#define _GUARD_TOS_SET_r11 1013 +#define _GUARD_TOS_SET_r22 1014 +#define _GUARD_TOS_SET_r33 1015 +#define _GUARD_TOS_SLICE_r01 1016 +#define _GUARD_TOS_SLICE_r11 1017 +#define _GUARD_TOS_SLICE_r22 1018 +#define _GUARD_TOS_SLICE_r33 1019 +#define _GUARD_TOS_TUPLE_r01 1020 +#define _GUARD_TOS_TUPLE_r11 1021 +#define _GUARD_TOS_TUPLE_r22 1022 +#define _GUARD_TOS_TUPLE_r33 1023 +#define _GUARD_TOS_UNICODE_r01 1024 +#define _GUARD_TOS_UNICODE_r11 1025 +#define _GUARD_TOS_UNICODE_r22 1026 +#define _GUARD_TOS_UNICODE_r33 1027 +#define _GUARD_TYPE_VERSION_r01 1028 +#define _GUARD_TYPE_VERSION_r11 1029 +#define _GUARD_TYPE_VERSION_r22 1030 +#define _GUARD_TYPE_VERSION_r33 1031 +#define _GUARD_TYPE_VERSION_LOCKED_r01 1032 +#define _GUARD_TYPE_VERSION_LOCKED_r11 1033 +#define _GUARD_TYPE_VERSION_LOCKED_r22 1034 +#define _GUARD_TYPE_VERSION_LOCKED_r33 1035 +#define _HANDLE_PENDING_AND_DEOPT_r00 1036 +#define _HANDLE_PENDING_AND_DEOPT_r10 1037 +#define _HANDLE_PENDING_AND_DEOPT_r20 1038 +#define _HANDLE_PENDING_AND_DEOPT_r30 1039 +#define _IMPORT_FROM_r12 1040 +#define _IMPORT_NAME_r21 1041 +#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS_r00 1042 +#define _INIT_CALL_PY_EXACT_ARGS_r01 1043 +#define _INIT_CALL_PY_EXACT_ARGS_0_r01 1044 +#define _INIT_CALL_PY_EXACT_ARGS_1_r01 1045 +#define _INIT_CALL_PY_EXACT_ARGS_2_r01 1046 +#define _INIT_CALL_PY_EXACT_ARGS_3_r01 1047 +#define _INIT_CALL_PY_EXACT_ARGS_4_r01 1048 +#define _INSERT_1_LOAD_CONST_INLINE_r02 1049 +#define _INSERT_1_LOAD_CONST_INLINE_r12 1050 +#define _INSERT_1_LOAD_CONST_INLINE_r23 1051 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1052 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1053 +#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1054 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1055 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1056 +#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1057 +#define _INSERT_NULL_r10 1058 +#define _INSTRUMENTED_FOR_ITER_r23 1059 +#define _INSTRUMENTED_INSTRUCTION_r00 1060 +#define _INSTRUMENTED_JUMP_FORWARD_r00 1061 +#define _INSTRUMENTED_JUMP_FORWARD_r11 1062 +#define _INSTRUMENTED_JUMP_FORWARD_r22 1063 +#define _INSTRUMENTED_JUMP_FORWARD_r33 1064 +#define _INSTRUMENTED_LINE_r00 1065 +#define _INSTRUMENTED_NOT_TAKEN_r00 1066 +#define _INSTRUMENTED_NOT_TAKEN_r11 1067 +#define _INSTRUMENTED_NOT_TAKEN_r22 1068 +#define _INSTRUMENTED_NOT_TAKEN_r33 1069 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1070 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1071 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1072 +#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1073 +#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1074 +#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1075 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1076 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1077 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1078 +#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1079 +#define _IS_NONE_r11 1080 +#define _IS_OP_r03 1081 +#define _IS_OP_r13 1082 +#define _IS_OP_r23 1083 +#define _ITER_CHECK_LIST_r02 1084 +#define _ITER_CHECK_LIST_r12 1085 +#define _ITER_CHECK_LIST_r22 1086 +#define _ITER_CHECK_LIST_r33 1087 +#define _ITER_CHECK_RANGE_r02 1088 +#define _ITER_CHECK_RANGE_r12 1089 +#define _ITER_CHECK_RANGE_r22 1090 +#define _ITER_CHECK_RANGE_r33 1091 +#define _ITER_CHECK_TUPLE_r02 1092 +#define _ITER_CHECK_TUPLE_r12 1093 +#define _ITER_CHECK_TUPLE_r22 1094 +#define _ITER_CHECK_TUPLE_r33 1095 +#define _ITER_JUMP_LIST_r02 1096 +#define _ITER_JUMP_LIST_r12 1097 +#define _ITER_JUMP_LIST_r22 1098 +#define _ITER_JUMP_LIST_r33 1099 +#define _ITER_JUMP_RANGE_r02 1100 +#define _ITER_JUMP_RANGE_r12 1101 +#define _ITER_JUMP_RANGE_r22 1102 +#define _ITER_JUMP_RANGE_r33 1103 +#define _ITER_JUMP_TUPLE_r02 1104 +#define _ITER_JUMP_TUPLE_r12 1105 +#define _ITER_JUMP_TUPLE_r22 1106 +#define _ITER_JUMP_TUPLE_r33 1107 +#define _ITER_NEXT_LIST_r23 1108 +#define _ITER_NEXT_LIST_TIER_TWO_r23 1109 +#define _ITER_NEXT_RANGE_r03 1110 +#define _ITER_NEXT_RANGE_r13 1111 +#define _ITER_NEXT_RANGE_r23 1112 +#define _ITER_NEXT_TUPLE_r03 1113 +#define _ITER_NEXT_TUPLE_r13 1114 +#define _ITER_NEXT_TUPLE_r23 1115 +#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1116 +#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1117 +#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1118 +#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1119 +#define _JUMP_TO_TOP_r00 1120 +#define _LIST_APPEND_r10 1121 +#define _LIST_EXTEND_r10 1122 +#define _LOAD_ATTR_r10 1123 +#define _LOAD_ATTR_CLASS_r11 1124 +#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1125 +#define _LOAD_ATTR_INSTANCE_VALUE_r02 1126 +#define _LOAD_ATTR_INSTANCE_VALUE_r12 1127 +#define _LOAD_ATTR_INSTANCE_VALUE_r23 1128 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1129 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1130 +#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1131 +#define _LOAD_ATTR_METHOD_NO_DICT_r02 1132 +#define _LOAD_ATTR_METHOD_NO_DICT_r12 1133 +#define _LOAD_ATTR_METHOD_NO_DICT_r23 1134 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1135 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1136 +#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1137 +#define _LOAD_ATTR_MODULE_r12 1138 +#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1139 +#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1140 +#define _LOAD_ATTR_PROPERTY_FRAME_r11 1141 +#define _LOAD_ATTR_SLOT_r02 1142 +#define _LOAD_ATTR_SLOT_r12 1143 +#define _LOAD_ATTR_SLOT_r23 1144 +#define _LOAD_ATTR_WITH_HINT_r12 1145 +#define _LOAD_BUILD_CLASS_r01 1146 +#define _LOAD_BYTECODE_r00 1147 +#define _LOAD_COMMON_CONSTANT_r01 1148 +#define _LOAD_COMMON_CONSTANT_r12 1149 +#define _LOAD_COMMON_CONSTANT_r23 1150 +#define _LOAD_CONST_r01 1151 +#define _LOAD_CONST_r12 1152 +#define _LOAD_CONST_r23 1153 +#define _LOAD_CONST_INLINE_r01 1154 +#define _LOAD_CONST_INLINE_r12 1155 +#define _LOAD_CONST_INLINE_r23 1156 +#define _LOAD_CONST_INLINE_BORROW_r01 1157 +#define _LOAD_CONST_INLINE_BORROW_r12 1158 +#define _LOAD_CONST_INLINE_BORROW_r23 1159 +#define _LOAD_CONST_UNDER_INLINE_r02 1160 +#define _LOAD_CONST_UNDER_INLINE_r12 1161 +#define _LOAD_CONST_UNDER_INLINE_r23 1162 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1163 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1164 +#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1165 +#define _LOAD_DEREF_r01 1166 +#define _LOAD_FAST_r01 1167 +#define _LOAD_FAST_r12 1168 +#define _LOAD_FAST_r23 1169 +#define _LOAD_FAST_0_r01 1170 +#define _LOAD_FAST_0_r12 1171 +#define _LOAD_FAST_0_r23 1172 +#define _LOAD_FAST_1_r01 1173 +#define _LOAD_FAST_1_r12 1174 +#define _LOAD_FAST_1_r23 1175 +#define _LOAD_FAST_2_r01 1176 +#define _LOAD_FAST_2_r12 1177 +#define _LOAD_FAST_2_r23 1178 +#define _LOAD_FAST_3_r01 1179 +#define _LOAD_FAST_3_r12 1180 +#define _LOAD_FAST_3_r23 1181 +#define _LOAD_FAST_4_r01 1182 +#define _LOAD_FAST_4_r12 1183 +#define _LOAD_FAST_4_r23 1184 +#define _LOAD_FAST_5_r01 1185 +#define _LOAD_FAST_5_r12 1186 +#define _LOAD_FAST_5_r23 1187 +#define _LOAD_FAST_6_r01 1188 +#define _LOAD_FAST_6_r12 1189 +#define _LOAD_FAST_6_r23 1190 +#define _LOAD_FAST_7_r01 1191 +#define _LOAD_FAST_7_r12 1192 +#define _LOAD_FAST_7_r23 1193 +#define _LOAD_FAST_AND_CLEAR_r01 1194 +#define _LOAD_FAST_AND_CLEAR_r12 1195 +#define _LOAD_FAST_AND_CLEAR_r23 1196 +#define _LOAD_FAST_BORROW_r01 1197 +#define _LOAD_FAST_BORROW_r12 1198 +#define _LOAD_FAST_BORROW_r23 1199 +#define _LOAD_FAST_BORROW_0_r01 1200 +#define _LOAD_FAST_BORROW_0_r12 1201 +#define _LOAD_FAST_BORROW_0_r23 1202 +#define _LOAD_FAST_BORROW_1_r01 1203 +#define _LOAD_FAST_BORROW_1_r12 1204 +#define _LOAD_FAST_BORROW_1_r23 1205 +#define _LOAD_FAST_BORROW_2_r01 1206 +#define _LOAD_FAST_BORROW_2_r12 1207 +#define _LOAD_FAST_BORROW_2_r23 1208 +#define _LOAD_FAST_BORROW_3_r01 1209 +#define _LOAD_FAST_BORROW_3_r12 1210 +#define _LOAD_FAST_BORROW_3_r23 1211 +#define _LOAD_FAST_BORROW_4_r01 1212 +#define _LOAD_FAST_BORROW_4_r12 1213 +#define _LOAD_FAST_BORROW_4_r23 1214 +#define _LOAD_FAST_BORROW_5_r01 1215 +#define _LOAD_FAST_BORROW_5_r12 1216 +#define _LOAD_FAST_BORROW_5_r23 1217 +#define _LOAD_FAST_BORROW_6_r01 1218 +#define _LOAD_FAST_BORROW_6_r12 1219 +#define _LOAD_FAST_BORROW_6_r23 1220 +#define _LOAD_FAST_BORROW_7_r01 1221 +#define _LOAD_FAST_BORROW_7_r12 1222 +#define _LOAD_FAST_BORROW_7_r23 1223 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1224 +#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1225 +#define _LOAD_FAST_CHECK_r01 1226 +#define _LOAD_FAST_CHECK_r12 1227 +#define _LOAD_FAST_CHECK_r23 1228 +#define _LOAD_FAST_LOAD_FAST_r02 1229 +#define _LOAD_FAST_LOAD_FAST_r13 1230 +#define _LOAD_FROM_DICT_OR_DEREF_r11 1231 +#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1232 +#define _LOAD_GLOBAL_r00 1233 +#define _LOAD_GLOBAL_BUILTINS_r01 1234 +#define _LOAD_GLOBAL_MODULE_r01 1235 +#define _LOAD_LOCALS_r01 1236 +#define _LOAD_LOCALS_r12 1237 +#define _LOAD_LOCALS_r23 1238 +#define _LOAD_NAME_r01 1239 +#define _LOAD_SMALL_INT_r01 1240 +#define _LOAD_SMALL_INT_r12 1241 +#define _LOAD_SMALL_INT_r23 1242 +#define _LOAD_SMALL_INT_0_r01 1243 +#define _LOAD_SMALL_INT_0_r12 1244 +#define _LOAD_SMALL_INT_0_r23 1245 +#define _LOAD_SMALL_INT_1_r01 1246 +#define _LOAD_SMALL_INT_1_r12 1247 +#define _LOAD_SMALL_INT_1_r23 1248 +#define _LOAD_SMALL_INT_2_r01 1249 +#define _LOAD_SMALL_INT_2_r12 1250 +#define _LOAD_SMALL_INT_2_r23 1251 +#define _LOAD_SMALL_INT_3_r01 1252 +#define _LOAD_SMALL_INT_3_r12 1253 +#define _LOAD_SMALL_INT_3_r23 1254 +#define _LOAD_SPECIAL_r00 1255 +#define _LOAD_SUPER_ATTR_ATTR_r31 1256 +#define _LOAD_SUPER_ATTR_METHOD_r32 1257 +#define _LOCK_OBJECT_r01 1258 +#define _LOCK_OBJECT_r11 1259 +#define _LOCK_OBJECT_r22 1260 +#define _LOCK_OBJECT_r33 1261 +#define _MAKE_CALLARGS_A_TUPLE_r33 1262 +#define _MAKE_CELL_r00 1263 +#define _MAKE_FUNCTION_r11 1264 +#define _MAKE_HEAP_SAFE_r01 1265 +#define _MAKE_HEAP_SAFE_r11 1266 +#define _MAKE_HEAP_SAFE_r22 1267 +#define _MAKE_HEAP_SAFE_r33 1268 +#define _MAKE_WARM_r00 1269 +#define _MAKE_WARM_r11 1270 +#define _MAKE_WARM_r22 1271 +#define _MAKE_WARM_r33 1272 +#define _MAP_ADD_r20 1273 +#define _MATCH_CLASS_r31 1274 +#define _MATCH_KEYS_r23 1275 +#define _MATCH_MAPPING_r02 1276 +#define _MATCH_MAPPING_r12 1277 +#define _MATCH_MAPPING_r23 1278 +#define _MATCH_SEQUENCE_r02 1279 +#define _MATCH_SEQUENCE_r12 1280 +#define _MATCH_SEQUENCE_r23 1281 +#define _MAYBE_EXPAND_METHOD_r00 1282 +#define _MAYBE_EXPAND_METHOD_KW_r11 1283 +#define _MONITOR_CALL_r00 1284 +#define _MONITOR_CALL_KW_r11 1285 +#define _MONITOR_JUMP_BACKWARD_r00 1286 +#define _MONITOR_JUMP_BACKWARD_r11 1287 +#define _MONITOR_JUMP_BACKWARD_r22 1288 +#define _MONITOR_JUMP_BACKWARD_r33 1289 +#define _MONITOR_RESUME_r00 1290 +#define _NOP_r00 1291 +#define _NOP_r11 1292 +#define _NOP_r22 1293 +#define _NOP_r33 1294 +#define _POP_CALL_r20 1295 +#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1296 +#define _POP_CALL_ONE_r30 1297 +#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1298 +#define _POP_CALL_TWO_r30 1299 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1300 +#define _POP_EXCEPT_r10 1301 +#define _POP_ITER_r20 1302 +#define _POP_JUMP_IF_FALSE_r00 1303 +#define _POP_JUMP_IF_FALSE_r10 1304 +#define _POP_JUMP_IF_FALSE_r21 1305 +#define _POP_JUMP_IF_FALSE_r32 1306 +#define _POP_JUMP_IF_TRUE_r00 1307 +#define _POP_JUMP_IF_TRUE_r10 1308 +#define _POP_JUMP_IF_TRUE_r21 1309 +#define _POP_JUMP_IF_TRUE_r32 1310 +#define _POP_TOP_r10 1311 +#define _POP_TOP_FLOAT_r00 1312 +#define _POP_TOP_FLOAT_r10 1313 +#define _POP_TOP_FLOAT_r21 1314 +#define _POP_TOP_FLOAT_r32 1315 +#define _POP_TOP_INT_r00 1316 +#define _POP_TOP_INT_r10 1317 +#define _POP_TOP_INT_r21 1318 +#define _POP_TOP_INT_r32 1319 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1320 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1321 +#define _POP_TOP_NOP_r00 1322 +#define _POP_TOP_NOP_r10 1323 +#define _POP_TOP_NOP_r21 1324 +#define _POP_TOP_NOP_r32 1325 +#define _POP_TOP_UNICODE_r00 1326 +#define _POP_TOP_UNICODE_r10 1327 +#define _POP_TOP_UNICODE_r21 1328 +#define _POP_TOP_UNICODE_r32 1329 +#define _POP_TWO_r20 1330 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1331 +#define _PUSH_EXC_INFO_r02 1332 +#define _PUSH_EXC_INFO_r12 1333 +#define _PUSH_EXC_INFO_r23 1334 +#define _PUSH_FRAME_r10 1335 +#define _PUSH_NULL_r01 1336 +#define _PUSH_NULL_r12 1337 +#define _PUSH_NULL_r23 1338 +#define _PUSH_NULL_CONDITIONAL_r00 1339 +#define _PY_FRAME_EX_r31 1340 +#define _PY_FRAME_GENERAL_r01 1341 +#define _PY_FRAME_KW_r11 1342 +#define _REPLACE_WITH_TRUE_r02 1343 +#define _REPLACE_WITH_TRUE_r12 1344 +#define _REPLACE_WITH_TRUE_r23 1345 +#define _RESUME_CHECK_r00 1346 +#define _RESUME_CHECK_r11 1347 +#define _RESUME_CHECK_r22 1348 +#define _RESUME_CHECK_r33 1349 +#define _RETURN_GENERATOR_r01 1350 +#define _RETURN_VALUE_r11 1351 +#define _SAVE_RETURN_OFFSET_r00 1352 +#define _SAVE_RETURN_OFFSET_r11 1353 +#define _SAVE_RETURN_OFFSET_r22 1354 +#define _SAVE_RETURN_OFFSET_r33 1355 +#define _SEND_r22 1356 +#define _SEND_GEN_FRAME_r22 1357 +#define _SETUP_ANNOTATIONS_r00 1358 +#define _SET_ADD_r10 1359 +#define _SET_FUNCTION_ATTRIBUTE_r01 1360 +#define _SET_FUNCTION_ATTRIBUTE_r11 1361 +#define _SET_FUNCTION_ATTRIBUTE_r21 1362 +#define _SET_FUNCTION_ATTRIBUTE_r32 1363 +#define _SET_IP_r00 1364 +#define _SET_IP_r11 1365 +#define _SET_IP_r22 1366 +#define _SET_IP_r33 1367 +#define _SET_UPDATE_r10 1368 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1369 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1370 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1371 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1372 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1373 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1374 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1375 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1376 +#define _SPILL_OR_RELOAD_r01 1377 +#define _SPILL_OR_RELOAD_r02 1378 +#define _SPILL_OR_RELOAD_r03 1379 +#define _SPILL_OR_RELOAD_r10 1380 +#define _SPILL_OR_RELOAD_r12 1381 +#define _SPILL_OR_RELOAD_r13 1382 +#define _SPILL_OR_RELOAD_r20 1383 +#define _SPILL_OR_RELOAD_r21 1384 +#define _SPILL_OR_RELOAD_r23 1385 +#define _SPILL_OR_RELOAD_r30 1386 +#define _SPILL_OR_RELOAD_r31 1387 +#define _SPILL_OR_RELOAD_r32 1388 +#define _START_EXECUTOR_r00 1389 +#define _STORE_ATTR_r20 1390 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1391 +#define _STORE_ATTR_SLOT_r21 1392 +#define _STORE_ATTR_WITH_HINT_r21 1393 +#define _STORE_DEREF_r10 1394 +#define _STORE_FAST_LOAD_FAST_r11 1395 +#define _STORE_FAST_STORE_FAST_r20 1396 +#define _STORE_GLOBAL_r10 1397 +#define _STORE_NAME_r10 1398 +#define _STORE_SLICE_r30 1399 +#define _STORE_SUBSCR_r30 1400 +#define _STORE_SUBSCR_DICT_r31 1401 +#define _STORE_SUBSCR_LIST_INT_r32 1402 +#define _SWAP_r11 1403 +#define _SWAP_2_r02 1404 +#define _SWAP_2_r12 1405 +#define _SWAP_2_r22 1406 +#define _SWAP_2_r33 1407 +#define _SWAP_3_r03 1408 +#define _SWAP_3_r13 1409 +#define _SWAP_3_r23 1410 +#define _SWAP_3_r33 1411 +#define _SWAP_FAST_r01 1412 +#define _SWAP_FAST_r11 1413 +#define _SWAP_FAST_r22 1414 +#define _SWAP_FAST_r33 1415 +#define _SWAP_FAST_0_r01 1416 +#define _SWAP_FAST_0_r11 1417 +#define _SWAP_FAST_0_r22 1418 +#define _SWAP_FAST_0_r33 1419 +#define _SWAP_FAST_1_r01 1420 +#define _SWAP_FAST_1_r11 1421 +#define _SWAP_FAST_1_r22 1422 +#define _SWAP_FAST_1_r33 1423 +#define _SWAP_FAST_2_r01 1424 +#define _SWAP_FAST_2_r11 1425 +#define _SWAP_FAST_2_r22 1426 +#define _SWAP_FAST_2_r33 1427 +#define _SWAP_FAST_3_r01 1428 +#define _SWAP_FAST_3_r11 1429 +#define _SWAP_FAST_3_r22 1430 +#define _SWAP_FAST_3_r33 1431 +#define _SWAP_FAST_4_r01 1432 +#define _SWAP_FAST_4_r11 1433 +#define _SWAP_FAST_4_r22 1434 +#define _SWAP_FAST_4_r33 1435 +#define _SWAP_FAST_5_r01 1436 +#define _SWAP_FAST_5_r11 1437 +#define _SWAP_FAST_5_r22 1438 +#define _SWAP_FAST_5_r33 1439 +#define _SWAP_FAST_6_r01 1440 +#define _SWAP_FAST_6_r11 1441 +#define _SWAP_FAST_6_r22 1442 +#define _SWAP_FAST_6_r33 1443 +#define _SWAP_FAST_7_r01 1444 +#define _SWAP_FAST_7_r11 1445 +#define _SWAP_FAST_7_r22 1446 +#define _SWAP_FAST_7_r33 1447 +#define _TIER2_RESUME_CHECK_r00 1448 +#define _TIER2_RESUME_CHECK_r11 1449 +#define _TIER2_RESUME_CHECK_r22 1450 +#define _TIER2_RESUME_CHECK_r33 1451 +#define _TO_BOOL_r11 1452 +#define _TO_BOOL_BOOL_r01 1453 +#define _TO_BOOL_BOOL_r11 1454 +#define _TO_BOOL_BOOL_r22 1455 +#define _TO_BOOL_BOOL_r33 1456 +#define _TO_BOOL_INT_r02 1457 +#define _TO_BOOL_INT_r12 1458 +#define _TO_BOOL_INT_r23 1459 +#define _TO_BOOL_LIST_r02 1460 +#define _TO_BOOL_LIST_r12 1461 +#define _TO_BOOL_LIST_r23 1462 +#define _TO_BOOL_NONE_r01 1463 +#define _TO_BOOL_NONE_r11 1464 +#define _TO_BOOL_NONE_r22 1465 +#define _TO_BOOL_NONE_r33 1466 +#define _TO_BOOL_STR_r02 1467 +#define _TO_BOOL_STR_r12 1468 +#define _TO_BOOL_STR_r23 1469 +#define _TRACE_RECORD_r00 1470 +#define _UNARY_INVERT_r12 1471 +#define _UNARY_NEGATIVE_r12 1472 +#define _UNARY_NOT_r01 1473 +#define _UNARY_NOT_r11 1474 +#define _UNARY_NOT_r22 1475 +#define _UNARY_NOT_r33 1476 +#define _UNPACK_EX_r10 1477 +#define _UNPACK_SEQUENCE_r10 1478 +#define _UNPACK_SEQUENCE_LIST_r10 1479 +#define _UNPACK_SEQUENCE_TUPLE_r10 1480 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1481 +#define _WITH_EXCEPT_START_r33 1482 +#define _YIELD_VALUE_r11 1483 +#define MAX_UOP_REGS_ID 1483 #ifdef __cplusplus } diff --git a/Lib/opcode.py b/Lib/opcode.py index 00ccf546fee61b..d53b94d89b46f7 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -119,7 +119,7 @@ POP_JUMP_IF_NOT_NONE=frozendict( counter=1, ), - POP_JUMP_IF_NOT_NONE=frozendict( + RESUME=frozendict( counter=1, ), ) diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index b025f7b0eb7fe5..f336278b20c7a5 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -5688,7 +5688,7 @@ #ifdef _Py_TIER2 if (IS_JIT_TRACING()) { next_instr = this_instr; - JUMP_TO_LABEL(stop_tracing); + JUMP_TO_LABEL(consider_stop_tracing); } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; @@ -5704,7 +5704,7 @@ if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } - DISPATCH_GOTO(); + DISPATCH_GOTO_NON_TRACING(); } assert(executor != tstate->interp->cold_executor); tstate->jit_exit = NULL; @@ -7431,8 +7431,9 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(INSTRUMENTED_RESUME); + /* Skip 1 cache entry */ // _LOAD_BYTECODE { #ifdef Py_GIL_DISABLED @@ -7781,9 +7782,11 @@ // _JIT { #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT && + if (!IS_JIT_TRACING() && + (backoff_counter_triggers(counter) && + this_instr->op.code == JUMP_BACKWARD_JIT) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { @@ -10422,10 +10425,10 @@ (void)(opcode); #endif frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME); PREDICTED_RESUME:; - _Py_CODEUNIT* const this_instr = next_instr - 1; + _Py_CODEUNIT* const this_instr = next_instr - 2; (void)this_instr; // _LOAD_BYTECODE { @@ -10470,13 +10473,26 @@ } } } - // _QUICKEN_RESUME + // _SPECIALIZE_RESUME { - #if ENABLE_SPECIALIZATION - if (tstate->tracing == 0 && this_instr->op.code == RESUME) { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); + uint16_t counter = read_u16(&this_instr[1].cache); + (void)counter; + #if ENABLE_SPECIALIZATION_FT + #if _Py_TIER2 + if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { + next_instr = this_instr; + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_Specialize_Resume(next_instr, tstate); + stack_pointer = _PyFrame_GetStackPointer(frame); + DISPATCH_SAME_OPARG(); } - #endif /* ENABLE_SPECIALIZATION */ + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + #else + _PyFrame_SetStackPointer(frame, stack_pointer); + _Py_Specialize_Resume(next_instr, tstate); + stack_pointer = _PyFrame_GetStackPointer(frame); + #endif + #endif /* ENABLE_SPECIALIZATION_FT */ } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM { @@ -10501,9 +10517,10 @@ _Py_CODEUNIT* const this_instr = next_instr; (void)this_instr; frame->instr_ptr = next_instr; - next_instr += 1; + next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK); - static_assert(0 == 0, "incorrect cache size"); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ #if defined(__EMSCRIPTEN__) if (_Py_emscripten_signal_clock == 0) { UPDATE_MISS_STATS(RESUME); @@ -10531,6 +10548,75 @@ DISPATCH(); } + TARGET(RESUME_CHECK_JIT) { + #if _Py_TAIL_CALL_INTERP + int opcode = RESUME_CHECK_JIT; + (void)(opcode); + #endif + _Py_CODEUNIT* const this_instr = next_instr; + (void)this_instr; + frame->instr_ptr = next_instr; + next_instr += 2; + INSTRUCTION_STATS(RESUME_CHECK_JIT); + static_assert(1 == 1, "incorrect cache size"); + /* Skip 1 cache entry */ + // _RESUME_CHECK + { + #if defined(__EMSCRIPTEN__) + if (_Py_emscripten_signal_clock == 0) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING; + #endif + uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker); + uintptr_t version = FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version); + assert((version & _PY_EVAL_EVENTS_MASK) == 0); + if (eval_breaker != version) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #ifdef Py_GIL_DISABLED + if (frame->tlbc_index != + ((_PyThreadStateImpl *)tstate)->tlbc_index) { + UPDATE_MISS_STATS(RESUME); + assert(_PyOpcode_Deopt[opcode] == (RESUME)); + JUMP_TO_PREDICTED(RESUME); + } + #endif + } + // _JIT + { + #ifdef _Py_TIER2 + bool is_resume = this_instr->op.code == RESUME_CHECK; + _Py_BackoffCounter counter = this_instr[1].counter; + if (!IS_JIT_TRACING() && + (backoff_counter_triggers(counter) && + this_instr->op.code == JUMP_BACKWARD_JIT) && + next_instr->op.code != ENTER_EXECUTOR) { + _Py_CODEUNIT *insert_exec_at = this_instr; + while (oparg > 255) { + oparg >>= 8; + insert_exec_at--; + } + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + if (succ) { + ENTER_TRACING(); + } + else { + this_instr[1].counter = restart_backoff_counter(counter); + } + } + else { + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + #endif + } + DISPATCH(); + } + TARGET(RETURN_GENERATOR) { #if _Py_TAIL_CALL_INTERP int opcode = RETURN_GENERATOR; @@ -12637,11 +12723,25 @@ JUMP_TO_LABEL(error); DISPATCH(); } - LABEL(stop_tracing) + LABEL(consider_stop_tracing) { #if _Py_TIER2 assert(IS_JIT_TRACING()); int opcode = next_instr->op.code; + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; + int orig_opcode = executor->vm_data.opcode; + if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { + assert(executor->vm_data.index == INSTR_OFFSET()); + assert(executor->vm_data.code == code); + assert(executor->vm_data.valid); + oparg = (oparg & ~255) | executor->vm_data.oparg; + opcode = orig_opcode; + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(next_instr[1].counter); + } + DISPATCH_GOTO_NON_TRACING(); + } _PyFrame_SetStackPointer(frame, stack_pointer); _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); stack_pointer = _PyFrame_GetStackPointer(frame); diff --git a/Modules/_testinternalcapi/test_targets.h b/Modules/_testinternalcapi/test_targets.h index f57c33feec2ac2..0b6ac2c0a3aeae 100644 --- a/Modules/_testinternalcapi/test_targets.h +++ b/Modules/_testinternalcapi/test_targets.h @@ -198,6 +198,7 @@ static void *opcode_targets_table[256] = { &&TARGET_LOAD_SUPER_ATTR_ATTR, &&TARGET_LOAD_SUPER_ATTR_METHOD, &&TARGET_RESUME_CHECK, + &&TARGET_RESUME_CHECK_JIT, &&TARGET_SEND_GEN, &&TARGET_STORE_ATTR_INSTANCE_VALUE, &&TARGET_STORE_ATTR_SLOT, @@ -232,7 +233,6 @@ static void *opcode_targets_table[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, &&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_POP_ITER, &&TARGET_INSTRUMENTED_END_SEND, @@ -472,7 +472,7 @@ static void *opcode_tracing_targets_table[256] = { &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, &&TARGET_TRACE_RECORD, - &&_unknown_opcode, + &&TARGET_TRACE_RECORD, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, @@ -528,7 +528,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_error(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_start_frame(TAIL_CALL_PARAMS); -static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_consider_stop_tracing(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(TAIL_CALL_PARAMS); @@ -718,6 +718,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RERAISE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESERVED(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RESUME_CHECK_JIT(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_GENERATOR(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_RETURN_VALUE(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_SEND(TAIL_CALL_PARAMS); @@ -959,6 +960,7 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [RESERVED] = _TAIL_CALL_RESERVED, [RESUME] = _TAIL_CALL_RESUME, [RESUME_CHECK] = _TAIL_CALL_RESUME_CHECK, + [RESUME_CHECK_JIT] = _TAIL_CALL_RESUME_CHECK_JIT, [RETURN_GENERATOR] = _TAIL_CALL_RETURN_GENERATOR, [RETURN_VALUE] = _TAIL_CALL_RETURN_VALUE, [SEND] = _TAIL_CALL_SEND, @@ -1007,7 +1009,6 @@ static py_tail_call_funcptr instruction_funcptr_handler_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, [215] = _TAIL_CALL_UNKNOWN_OPCODE, [216] = _TAIL_CALL_UNKNOWN_OPCODE, @@ -1217,6 +1218,7 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [RESERVED] = _TAIL_CALL_TRACE_RECORD, [RESUME] = _TAIL_CALL_TRACE_RECORD, [RESUME_CHECK] = _TAIL_CALL_TRACE_RECORD, + [RESUME_CHECK_JIT] = _TAIL_CALL_TRACE_RECORD, [RETURN_GENERATOR] = _TAIL_CALL_TRACE_RECORD, [RETURN_VALUE] = _TAIL_CALL_TRACE_RECORD, [SEND] = _TAIL_CALL_TRACE_RECORD, @@ -1265,7 +1267,6 @@ static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = { [125] = _TAIL_CALL_UNKNOWN_OPCODE, [126] = _TAIL_CALL_UNKNOWN_OPCODE, [127] = _TAIL_CALL_UNKNOWN_OPCODE, - [213] = _TAIL_CALL_UNKNOWN_OPCODE, [214] = _TAIL_CALL_UNKNOWN_OPCODE, [215] = _TAIL_CALL_UNKNOWN_OPCODE, [216] = _TAIL_CALL_UNKNOWN_OPCODE, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 24953d9c8766aa..146660ea3019c7 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -256,31 +256,7 @@ dummy_func( macro(RESUME_CHECK_JIT) = unused/1 + _RESUME_CHECK + - _QUICKEN_TO_RESUME_CHECK + - _JIT_RESUME; - - op(_QUICKEN_TO_RESUME_CHECK, (--)) { - // For some reason, RESUME_CHECK_JIT is quite expensive compared to RESUME. - // Even without the _JIT uop! - // It's enough to show up as a 10-20% slowdown in some benchmarks - // For that reason, we replace it back with RESUME_CHECK immediately. - // This also means that function entry tracing is practically a single attempt. - // In JIT builds, we thus stick only to RESUME and wait for it to specialize to RESUME_CHECK_JIT. - // This makes RESUME slightly slower on JIT builds, but since the JIT is faster it makes up for it. - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_unreachable_backoff_counter()); - } - - tier1 op(_JIT_RESUME, (--)) { - #ifdef _Py_TIER2 - assert(this_instr->op.code == RESUME_CHECK); - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, this_instr, this_instr, - STACK_LEVEL(), 0, NULL, opcode, oparg); - if (succ) { - ENTER_TRACING(); - } - #endif - } + _JIT; op(_MONITOR_RESUME, (--)) { int err = _Py_call_instrumentation( diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 2507ad09c77703..343ab173f757db 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -253,8 +253,6 @@ break; } - /* _QUICKEN_TO_RESUME_CHECK is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ - /* _MONITOR_RESUME is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */ case _LOAD_FAST_CHECK_r01: { diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index f57653254bf81c..3bcfe3b59f538a 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -10555,7 +10555,6 @@ frame->instr_ptr = next_instr; next_instr += 2; INSTRUCTION_STATS(RESUME_CHECK_JIT); - opcode = RESUME_CHECK_JIT; static_assert(1 == 1, "incorrect cache size"); /* Skip 1 cache entry */ // _RESUME_CHECK @@ -10585,21 +10584,30 @@ } #endif } - // _QUICKEN_TO_RESUME_CHECK - { - FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, RESUME_CHECK); - _PyFrame_SetStackPointer(frame, stack_pointer); - FT_ATOMIC_STORE_UINT16_RELAXED(this_instr[1].counter, initial_unreachable_backoff_counter()); - stack_pointer = _PyFrame_GetStackPointer(frame); - } - // _JIT_RESUME + // _JIT { #ifdef _Py_TIER2 - assert(this_instr->op.code == RESUME_CHECK); - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, this_instr, this_instr, - STACK_LEVEL(), 0, NULL, opcode, oparg); - if (succ) { - ENTER_TRACING(); + bool is_resume = this_instr->op.code == RESUME_CHECK; + _Py_BackoffCounter counter = this_instr[1].counter; + if (!IS_JIT_TRACING() && + (backoff_counter_triggers(counter) && + this_instr->op.code == JUMP_BACKWARD_JIT) && + next_instr->op.code != ENTER_EXECUTOR) { + _Py_CODEUNIT *insert_exec_at = this_instr; + while (oparg > 255) { + oparg >>= 8; + insert_exec_at--; + } + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + if (succ) { + ENTER_TRACING(); + } + else { + this_instr[1].counter = restart_backoff_counter(counter); + } + } + else { + ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); } #endif } diff --git a/Python/optimizer.c b/Python/optimizer.c index 21c47a2dc2d1fe..f98eb8065f9120 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -634,51 +634,12 @@ _PyJit_translate_single_bytecode_to_trace( int oparg = tracer->prev_state.instr_oparg; int opcode = this_instr->op.code; - // Loop back to the start - int is_first_instr = _tstate->jit_tracer_state.initial_state.close_loop_instr == next_instr || - _tstate->jit_tracer_state.initial_state.start_instr == next_instr; - if (stop_tracing_opcode == _DEOPT) { - // gh-143183: It's important we rewind to the last known proper target. - // The current target might be garbage as stop tracing usually indicates - // we are in something that we can't trace. - DPRINTF(2, "Told to stop tracing. Reason: %s\n", _PyOpcode_OpName[next_instr->op.code]); - goto unsupported; - } - if (stop_tracing_opcode != 0) { - assert(stop_tracing_opcode == _EXIT_TRACE); - if (is_first_instr) { - ADD_TO_TRACE(_JUMP_TO_TOP, 0, 0, target); - } - else { - ADD_TO_TRACE(_EXIT_TRACE, 0, 0, target); - } - goto done; - } - - // Executor, trace over it to form a longer trace. - // Otherwise, we end up with fragmented loop traces that have bad performance. - // The only exception is if we see another loop trace. In that case, we link to it. - if (opcode == ENTER_EXECUTOR) { - DPRINTF(2, "ENTER_EXECUTOR seen\n"); - _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; - int orig_opcode = executor->vm_data.opcode; - assert(orig_opcode != JUMP_BACKWARD_JIT && - orig_opcode != JUMP_BACKWARD && - orig_opcode != JUMP_BACKWARD_NO_INTERRUPT && - orig_opcode != JUMP_BACKWARD_NO_JIT); - oparg = (oparg & ~255) | executor->vm_data.oparg; - opcode = orig_opcode; - } - int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; target--; } - DPRINTF(2, "%p %d: %s(%d) %d\n", old_code, target, - _PyOpcode_OpName[opcode], oparg, _tstate->jit_tracer_state.prev_state.instr_stacklevel); - if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]] > 0) { uint16_t backoff = (this_instr + 1)->counter.value_and_backoff; // adaptive_counter_cooldown is a fresh specialization. diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 2b88555eb2b838..61f69601b89768 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -23,8 +23,6 @@ break; } - /* _QUICKEN_TO_RESUME_CHECK is not a viable micro-op for tier 2 */ - /* _MONITOR_RESUME is not a viable micro-op for tier 2 */ case _LOAD_FAST_CHECK: { From 1e793f9faa1be0944b635c26418211f884f04c81 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 16:01:56 +0800 Subject: [PATCH 33/43] more cleanup --- Include/internal/pycore_code.h | 1 + Include/internal/pycore_magic_number.h | 2 +- Modules/_testinternalcapi/test_cases.c.h | 41 +++++------------------- Modules/_testinternalcapi/test_targets.h | 2 +- Python/bytecodes.c | 35 +++----------------- Python/generated_cases.c.h | 41 +++++------------------- Python/opcode_targets.h | 2 +- Python/optimizer.c | 15 ++------- Python/pylifecycle.c | 2 +- Python/specialize.c | 2 +- 10 files changed, 30 insertions(+), 113 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index efae3b38654c41..c704e325c10f26 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -323,6 +323,7 @@ PyAPI_FUNC(void) _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr); PyAPI_FUNC(void) _Py_GatherStats_GetIter(_PyStackRef iterable); PyAPI_FUNC(void) _Py_Specialize_CallFunctionEx(_PyStackRef func_st, _Py_CODEUNIT *instr); +PyAPI_FUNC(void) _Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate); // Utility functions for reading/writing 32/64-bit values in the inline caches. // Great care should be taken to ensure that these functions remain correct and diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h index eef9f1856aca9a..521c6a9a023d92 100644 --- a/Include/internal/pycore_magic_number.h +++ b/Include/internal/pycore_magic_number.h @@ -305,7 +305,7 @@ PC/launcher.c must also be updated. */ -#define PYC_MAGIC_NUMBER 3662 +#define PYC_MAGIC_NUMBER 3663 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes (little-endian) and then appending b'\r\n'. */ #define PYC_MAGIC_NUMBER_TOKEN \ diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index f336278b20c7a5..05ae1d9afa678f 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -5688,7 +5688,7 @@ #ifdef _Py_TIER2 if (IS_JIT_TRACING()) { next_instr = this_instr; - JUMP_TO_LABEL(consider_stop_tracing); + JUMP_TO_LABEL(stop_tracing); } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; @@ -7786,14 +7786,15 @@ _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -10477,22 +10478,9 @@ { uint16_t counter = read_u16(&this_instr[1].cache); (void)counter; - #if ENABLE_SPECIALIZATION_FT - #if _Py_TIER2 - if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { - next_instr = this_instr; - _PyFrame_SetStackPointer(frame, stack_pointer); - _Py_Specialize_Resume(next_instr, tstate); - stack_pointer = _PyFrame_GetStackPointer(frame); - DISPATCH_SAME_OPARG(); - } - ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); - #else _PyFrame_SetStackPointer(frame, stack_pointer); _Py_Specialize_Resume(next_instr, tstate); stack_pointer = _PyFrame_GetStackPointer(frame); - #endif - #endif /* ENABLE_SPECIALIZATION_FT */ } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM { @@ -10594,14 +10582,15 @@ _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -12723,25 +12712,11 @@ JUMP_TO_LABEL(error); DISPATCH(); } - LABEL(consider_stop_tracing) + LABEL(stop_tracing) { #if _Py_TIER2 assert(IS_JIT_TRACING()); int opcode = next_instr->op.code; - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; - int orig_opcode = executor->vm_data.opcode; - if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { - assert(executor->vm_data.index == INSTR_OFFSET()); - assert(executor->vm_data.code == code); - assert(executor->vm_data.valid); - oparg = (oparg & ~255) | executor->vm_data.oparg; - opcode = orig_opcode; - if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { - PAUSE_ADAPTIVE_COUNTER(next_instr[1].counter); - } - DISPATCH_GOTO_NON_TRACING(); - } _PyFrame_SetStackPointer(frame, stack_pointer); _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); stack_pointer = _PyFrame_GetStackPointer(frame); diff --git a/Modules/_testinternalcapi/test_targets.h b/Modules/_testinternalcapi/test_targets.h index 0b6ac2c0a3aeae..def462bacec176 100644 --- a/Modules/_testinternalcapi/test_targets.h +++ b/Modules/_testinternalcapi/test_targets.h @@ -528,7 +528,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_error(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_start_frame(TAIL_CALL_PARAMS); -static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_consider_stop_tracing(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(TAIL_CALL_PARAMS); diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 146660ea3019c7..d7ef8dcfc54b82 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -173,18 +173,7 @@ dummy_func( } specializing op(_SPECIALIZE_RESUME, (counter/1 --)) { -#if ENABLE_SPECIALIZATION_FT - #if _Py_TIER2 - if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { - next_instr = this_instr; - _Py_Specialize_Resume(next_instr, tstate); - DISPATCH_SAME_OPARG(); - } - ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); - #else _Py_Specialize_Resume(next_instr, tstate); - #endif -#endif /* ENABLE_SPECIALIZATION_FT */ } tier1 op(_MAYBE_INSTRUMENT, (--)) { @@ -3131,7 +3120,7 @@ dummy_func( _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ _Py_CODEUNIT *insert_exec_at = this_instr; @@ -3139,7 +3128,8 @@ dummy_func( oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -3192,7 +3182,7 @@ dummy_func( #ifdef _Py_TIER2 if (IS_JIT_TRACING()) { next_instr = this_instr; - goto consider_stop_tracing; + goto stop_tracing; } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; @@ -6029,25 +6019,10 @@ dummy_func( #endif } - label(consider_stop_tracing) { + label(stop_tracing) { #if _Py_TIER2 assert(IS_JIT_TRACING()); int opcode = next_instr->op.code; - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; - int orig_opcode = executor->vm_data.opcode; - // Not backwards jump, trace over it to form a longer trace. - if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { - assert(executor->vm_data.index == INSTR_OFFSET()); - assert(executor->vm_data.code == code); - assert(executor->vm_data.valid); - oparg = (oparg & ~255) | executor->vm_data.oparg; - opcode = orig_opcode; - if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { - PAUSE_ADAPTIVE_COUNTER(next_instr[1].counter); - } - DISPATCH_GOTO_NON_TRACING(); - } _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); LEAVE_TRACING(); int err = stop_tracing_and_jit(tstate, frame); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 3bcfe3b59f538a..3f78ed319c9859 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5688,7 +5688,7 @@ #ifdef _Py_TIER2 if (IS_JIT_TRACING()) { next_instr = this_instr; - JUMP_TO_LABEL(consider_stop_tracing); + JUMP_TO_LABEL(stop_tracing); } PyCodeObject *code = _PyFrame_GetCode(frame); _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; @@ -7785,14 +7785,15 @@ _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -10475,22 +10476,9 @@ { uint16_t counter = read_u16(&this_instr[1].cache); (void)counter; - #if ENABLE_SPECIALIZATION_FT - #if _Py_TIER2 - if (ADAPTIVE_COUNTER_TRIGGERS(counter)) { - next_instr = this_instr; - _PyFrame_SetStackPointer(frame, stack_pointer); - _Py_Specialize_Resume(next_instr, tstate); - stack_pointer = _PyFrame_GetStackPointer(frame); - DISPATCH_SAME_OPARG(); - } - ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); - #else _PyFrame_SetStackPointer(frame, stack_pointer); _Py_Specialize_Resume(next_instr, tstate); stack_pointer = _PyFrame_GetStackPointer(frame); - #endif - #endif /* ENABLE_SPECIALIZATION_FT */ } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM { @@ -10591,14 +10579,15 @@ _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && - this_instr->op.code == JUMP_BACKWARD_JIT) && + (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; while (oparg > 255) { oparg >>= 8; insert_exec_at--; } - int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, next_instr, stack_pointer, 0, NULL, oparg, NULL); + int succ = _PyJit_TryInitializeTracing(tstate, frame, this_instr, insert_exec_at, + is_resume ? insert_exec_at : next_instr, stack_pointer, 0, NULL, oparg, NULL); if (succ) { ENTER_TRACING(); } @@ -12720,25 +12709,11 @@ JUMP_TO_LABEL(error); DISPATCH(); } - LABEL(consider_stop_tracing) + LABEL(stop_tracing) { #if _Py_TIER2 assert(IS_JIT_TRACING()); int opcode = next_instr->op.code; - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; - int orig_opcode = executor->vm_data.opcode; - if (orig_opcode == RESUME_CHECK_JIT || orig_opcode == RESUME) { - assert(executor->vm_data.index == INSTR_OFFSET()); - assert(executor->vm_data.code == code); - assert(executor->vm_data.valid); - oparg = (oparg & ~255) | executor->vm_data.oparg; - opcode = orig_opcode; - if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { - PAUSE_ADAPTIVE_COUNTER(next_instr[1].counter); - } - DISPATCH_GOTO_NON_TRACING(); - } _PyFrame_SetStackPointer(frame, stack_pointer); _PyJit_translate_single_bytecode_to_trace(tstate, frame, NULL, _EXIT_TRACE); stack_pointer = _PyFrame_GetStackPointer(frame); diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index 0b6ac2c0a3aeae..def462bacec176 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -528,7 +528,7 @@ static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_error(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_start_frame(TAIL_CALL_PARAMS); -static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_consider_stop_tracing(TAIL_CALL_PARAMS); +static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS); static PyObject *Py_PRESERVE_NONE_CC _TAIL_CALL_BINARY_OP_ADD_FLOAT(TAIL_CALL_PARAMS); diff --git a/Python/optimizer.c b/Python/optimizer.c index f98eb8065f9120..958b9b81c30b1f 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -579,8 +579,9 @@ add_to_trace( static int -opcode_is_terminator(int opcode) +is_terminator(const _PyUOpInstruction *uop) { + int opcode = _PyUop_Uncached[uop->opcode]; return ( opcode == _EXIT_TRACE || opcode == _DEOPT || @@ -589,14 +590,6 @@ opcode_is_terminator(int opcode) ); } -static int -is_terminator(const _PyUOpInstruction *uop) -{ - int opcode = uop->opcode; - int base_opcode = _PyUop_Uncached[uop->opcode]; - return opcode_is_terminator(opcode) || opcode_is_terminator(base_opcode); -} - /* Returns 1 on success (added to trace), 0 on trace end. */ // gh-142543: inlining this function causes stack overflows @@ -633,7 +626,6 @@ _PyJit_translate_single_bytecode_to_trace( // We must point to the first EXTENDED_ARG when deopting. int oparg = tracer->prev_state.instr_oparg; int opcode = this_instr->op.code; - int rewind_oparg = oparg; while (rewind_oparg > 255) { rewind_oparg >>= 8; @@ -1218,8 +1210,7 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) int exit_depth = get_cached_entries_for_side_exit(inst); assert(_PyUop_Caching[base_exit_op].entries[exit_depth].opcode > 0); int16_t exit_op = _PyUop_Caching[base_exit_op].entries[exit_depth].opcode; - bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || - base_opcode == _GUARD_IS_NONE_POP || base_opcode == _GUARD_IS_NOT_NONE_POP || is_for_iter_test[base_opcode]); + bool is_control_flow = (base_opcode == _GUARD_IS_FALSE_POP || base_opcode == _GUARD_IS_TRUE_POP || is_for_iter_test[base_opcode]); if (jump_target != current_jump_target || current_exit_op != exit_op) { make_exit(&buffer[next_spare], exit_op, jump_target, is_control_flow); current_exit_op = exit_op; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2b8e9a02cb6184..74182dfa6505c4 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1366,7 +1366,7 @@ init_interp_main(PyThreadState *tstate) // This is also needed when the JIT is enabled #ifdef _Py_TIER2 if (is_main_interp) { - int enabled = 1; + int enabled = 0; #if _Py_TIER2 & 2 enabled = 0; #endif diff --git a/Python/specialize.c b/Python/specialize.c index 4b8616fbaa38f1..35f4aedc42c0e4 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -2796,7 +2796,7 @@ _Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate) if (tstate->tracing == 0 && instr->op.code == RESUME) { if (tstate->interp->jit) { specialize(instr, RESUME_CHECK_JIT); - set_counter((_Py_BackoffCounter *)instr + 1, trigger_backoff_counter()); + set_counter((_Py_BackoffCounter *)instr + 1, initial_resume_backoff_counter()); return; } specialize(instr, RESUME_CHECK); From bfb7d477975ae132d3c623a6fb938af38bed76e2 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 16:13:57 +0800 Subject: [PATCH 34/43] fix bugs and use opt config --- Include/internal/pycore_backoff.h | 7 ++++--- Include/internal/pycore_interp_structs.h | 3 +++ Include/internal/pycore_magic_number.h | 3 ++- Modules/_testinternalcapi/test_cases.c.h | 6 +++--- Python/bytecodes.c | 4 ++-- Python/generated_cases.c.h | 6 +++--- Python/optimizer.c | 9 +++++++-- Python/pylifecycle.c | 2 +- Python/pystate.c | 8 ++++++++ Python/specialize.c | 4 ++-- 10 files changed, 35 insertions(+), 17 deletions(-) diff --git a/Include/internal/pycore_backoff.h b/Include/internal/pycore_backoff.h index 95dfc2228b42af..38dd82f6fc8a14 100644 --- a/Include/internal/pycore_backoff.h +++ b/Include/internal/pycore_backoff.h @@ -142,10 +142,11 @@ initial_jump_backoff_counter(_PyOptimizationConfig *opt_config) #define RESUME_INITIAL_VALUE 8190 #define RESUME_INITIAL_BACKOFF 6 static inline _Py_BackoffCounter -initial_resume_backoff_counter(void) +initial_resume_backoff_counter(_PyOptimizationConfig *opt_config) { - return make_backoff_counter(RESUME_INITIAL_VALUE, - RESUME_INITIAL_BACKOFF); + return make_backoff_counter( + opt_config->resume_initial_value, + opt_config->resume_initial_backoff); } /* Initial exit temperature. diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index 776fb9575c2365..e3ed16d45ed49f 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -413,6 +413,9 @@ typedef struct _PyOptimizationConfig { uint16_t jump_backward_initial_value; uint16_t jump_backward_initial_backoff; + uint16_t resume_initial_value; + uint16_t resume_initial_backoff; + // JIT optimization thresholds uint16_t side_exit_initial_value; uint16_t side_exit_initial_backoff; diff --git a/Include/internal/pycore_magic_number.h b/Include/internal/pycore_magic_number.h index 521c6a9a023d92..ec9cfe432371c7 100644 --- a/Include/internal/pycore_magic_number.h +++ b/Include/internal/pycore_magic_number.h @@ -294,6 +294,7 @@ Known values: Python 3.15a4 3661 (Lazy imports IMPORT_NAME opcode changes) Python 3.15a6 3662 (Add counter to RESUME) + Python 3.16 will start with 3700 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. */ -#define PYC_MAGIC_NUMBER 3663 +#define PYC_MAGIC_NUMBER 3662 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes (little-endian) and then appending b'\r\n'. */ #define PYC_MAGIC_NUMBER_TOKEN \ diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 05ae1d9afa678f..fe88b55c64ac3f 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -7782,7 +7782,7 @@ // _JIT { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK; + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && @@ -10479,7 +10479,7 @@ uint16_t counter = read_u16(&this_instr[1].cache); (void)counter; _PyFrame_SetStackPointer(frame, stack_pointer); - _Py_Specialize_Resume(next_instr, tstate); + _Py_Specialize_Resume(this_instr, tstate); stack_pointer = _PyFrame_GetStackPointer(frame); } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM @@ -10578,7 +10578,7 @@ // _JIT { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK; + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && diff --git a/Python/bytecodes.c b/Python/bytecodes.c index d7ef8dcfc54b82..cebe2c47bfb54a 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -173,7 +173,7 @@ dummy_func( } specializing op(_SPECIALIZE_RESUME, (counter/1 --)) { - _Py_Specialize_Resume(next_instr, tstate); + _Py_Specialize_Resume(this_instr, tstate); } tier1 op(_MAYBE_INSTRUMENT, (--)) { @@ -3116,7 +3116,7 @@ dummy_func( tier1 op(_JIT, (--)) { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK; + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 3f78ed319c9859..9460b5a5e846f3 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -7781,7 +7781,7 @@ // _JIT { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK; + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && @@ -10477,7 +10477,7 @@ uint16_t counter = read_u16(&this_instr[1].cache); (void)counter; _PyFrame_SetStackPointer(frame, stack_pointer); - _Py_Specialize_Resume(next_instr, tstate); + _Py_Specialize_Resume(this_instr, tstate); stack_pointer = _PyFrame_GetStackPointer(frame); } // _CHECK_PERIODIC_IF_NOT_YIELD_FROM @@ -10575,7 +10575,7 @@ // _JIT { #ifdef _Py_TIER2 - bool is_resume = this_instr->op.code == RESUME_CHECK; + bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; if (!IS_JIT_TRACING() && (backoff_counter_triggers(counter) && diff --git a/Python/optimizer.c b/Python/optimizer.c index 958b9b81c30b1f..0c2477777ec8cd 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1039,7 +1039,7 @@ _PyJit_TryInitializeTracing( _Py_RecordFuncPtr record_func = _PyOpcode_RecordFunctions[record_func_index]; record_func(frame, stack_pointer, oparg, &tracer->prev_state.recorded_value); } - assert(curr_instr->op.code == JUMP_BACKWARD_JIT || (exit != NULL)); + assert(curr_instr->op.code == JUMP_BACKWARD_JIT || curr_instr->op.code == RESUME_CHECK_JIT || (exit != NULL)); tracer->initial_state.jump_backward_instr = curr_instr; if (_PyOpcode_Caches[_PyOpcode_Deopt[close_loop_instr->op.code]]) { @@ -1064,7 +1064,12 @@ _PyJit_FinalizeTracing(PyThreadState *tstate, int err) tracer->initial_state.jump_backward_instr[1].counter = restart_backoff_counter(counter); } else { - tracer->initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(&tstate->interp->opt_config); + if (tracer->initial_state.jump_backward_instr[0].op.code == JUMP_BACKWARD_JIT) { + tracer->initial_state.jump_backward_instr[1].counter = initial_jump_backoff_counter(&tstate->interp->opt_config); + } + else { + tracer->initial_state.jump_backward_instr[1].counter = initial_resume_backoff_counter(&tstate->interp->opt_config); + } } } else if (tracer->initial_state.executor->vm_data.valid) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 74182dfa6505c4..2b8e9a02cb6184 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1366,7 +1366,7 @@ init_interp_main(PyThreadState *tstate) // This is also needed when the JIT is enabled #ifdef _Py_TIER2 if (is_main_interp) { - int enabled = 0; + int enabled = 1; #if _Py_TIER2 & 2 enabled = 0; #endif diff --git a/Python/pystate.c b/Python/pystate.c index 17b8430b19c188..6a262d841a077b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -604,11 +604,13 @@ init_interpreter(PyInterpreterState *interp, // Initialize optimization configuration from environment variables // PYTHON_JIT_STRESS sets aggressive defaults for testing, but can be overridden uint16_t jump_default = JUMP_BACKWARD_INITIAL_VALUE; + uint16_t resume_default = RESUME_INITIAL_VALUE; uint16_t side_exit_default = SIDE_EXIT_INITIAL_VALUE; if (is_env_enabled("PYTHON_JIT_STRESS")) { jump_default = 63; side_exit_default = 63; + resume_default = 127; } init_policy(&interp->opt_config.jump_backward_initial_value, @@ -617,6 +619,12 @@ init_interpreter(PyInterpreterState *interp, init_policy(&interp->opt_config.jump_backward_initial_backoff, "PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF", JUMP_BACKWARD_INITIAL_BACKOFF, 0, MAX_BACKOFF); + init_policy(&interp->opt_config.resume_initial_value, + "PYTHON_JIT_RESUME_INITIAL_VALUE", + resume_default, 1, MAX_VALUE); + init_policy(&interp->opt_config.resume_initial_backoff, + "PYTHON_JIT_RESUME_INITIAL_BACKOFF", + RESUME_INITIAL_BACKOFF, 0, MAX_BACKOFF); init_policy(&interp->opt_config.side_exit_initial_value, "PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE", side_exit_default, 1, MAX_VALUE); diff --git a/Python/specialize.c b/Python/specialize.c index 35f4aedc42c0e4..f4bacacb8a1a61 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -52,7 +52,7 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters PyInterpreterState *interp = tstate->interp; jump_counter = initial_jump_backoff_counter(&interp->opt_config); adaptive_counter = adaptive_counter_warmup(); - resume_counter = initial_resume_backoff_counter(); + resume_counter = initial_resume_backoff_counter(&interp->opt_config); } else { jump_counter = initial_unreachable_backoff_counter(); @@ -2796,7 +2796,7 @@ _Py_Specialize_Resume(_Py_CODEUNIT *instr, PyThreadState *tstate) if (tstate->tracing == 0 && instr->op.code == RESUME) { if (tstate->interp->jit) { specialize(instr, RESUME_CHECK_JIT); - set_counter((_Py_BackoffCounter *)instr + 1, initial_resume_backoff_counter()); + set_counter((_Py_BackoffCounter *)instr + 1, initial_resume_backoff_counter(&tstate->interp->opt_config)); return; } specialize(instr, RESUME_CHECK); From 8472a93bae7290ad700bcb6901b59e79346eb16f Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 16:42:48 +0800 Subject: [PATCH 35/43] fix test_dis --- Lib/test/test_dis.py | 20 +++++++++----------- Modules/_testinternalcapi.c | 3 ++- Python/specialize.c | 2 -- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 0d135bcdf01a84..77443aa5d9a3cc 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -880,9 +880,7 @@ def foo(x): RETURN_GENERATOR POP_TOP L1: RESUME 0 - LOAD_FAST 0 (.0) - GET_ITER - L2: FOR_ITER 16 (to L3) + L2: FOR_ITER 15 (to L3) STORE_FAST 1 (z) LOAD_DEREF 2 (x) LOAD_FAST_BORROW 1 (z) @@ -911,7 +909,7 @@ def load_test(x, y=0): return a, b dis_load_test_quickened_code = """\ -%3d RESUME{: <6} 0 +%3d RESUME_CHECK{: <6} 0 %3d LOAD_FAST_LOAD_FAST 1 (x, y) STORE_FAST_STORE_FAST 50 (b, a) @@ -928,7 +926,7 @@ def loop_test(): load_test(i) dis_loop_test_quickened_code = """\ -%3d RESUME{: <6} 0 +%3d RESUME_CHECK{: <6} 0 %3d BUILD_LIST 0 LOAD_CONST 2 ((1, 2, 3)) @@ -1326,14 +1324,14 @@ def test_super_instructions(self): self.code_quicken(lambda: load_test(0, 0)) got = self.get_disassembly(load_test, adaptive=True) jit = sys._jit.is_enabled() - expected = dis_load_test_quickened_code.format("" if jit else "_CHECK") + expected = dis_load_test_quickened_code.format("_JIT" if jit else "") self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_load_attr_specialize(self): load_attr_quicken = """\ - 0 RESUME{: <6} 0 + 0 RESUME_CHECK{: <6} 0 1 LOAD_CONST 0 ('a') LOAD_ATTR_SLOT 0 (__class__) @@ -1343,14 +1341,14 @@ def test_load_attr_specialize(self): self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) jit = sys._jit.is_enabled() - expected = load_attr_quicken.format("" if jit else "_CHECK") + expected = load_attr_quicken.format("_JIT" if jit else "") self.do_disassembly_compare(got, expected) @cpython_only @requires_specialization def test_call_specialize(self): call_quicken = """\ - 0 RESUME{: <6} 0 + 0 RESUME_CHECK{: <6} 0 1 LOAD_NAME 0 (str) PUSH_NULL @@ -1362,7 +1360,7 @@ def test_call_specialize(self): self.code_quicken(lambda: exec(co, {}, {})) got = self.get_disassembly(co, adaptive=True) jit = sys._jit.is_enabled() - expected = call_quicken.format("" if jit else "_CHECK") + expected = call_quicken.format("_JIT" if jit else "") self.do_disassembly_compare(got, expected) @cpython_only @@ -1372,7 +1370,7 @@ def test_loop_quicken(self): self.code_quicken(loop_test) got = self.get_disassembly(loop_test, adaptive=True) jit = sys._jit.is_enabled() - resume_str = "" if jit else "_CHECK" + resume_str = "_JIT" if jit else "" jit_str = "_JIT" if jit else "NO_JIT" expected = dis_loop_test_quickened_code.format(resume_str, jit_str) self.do_disassembly_compare(got, expected) diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index b3edac5dcb6088..b7d5d5bad92053 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -3023,9 +3023,10 @@ module_exec(PyObject *module) return 1; } + long resume_threshold = interp->opt_config.resume_initial_value + 1; if (PyModule_Add(module, "TIER2_RESUME_THRESHOLD", // + 1 more due to one loop spent on tracing. - PyLong_FromLong(RESUME_INITIAL_VALUE + 2)) < 0) { + PyLong_FromLong(resume_threshold)) < 0) { return 1; } diff --git a/Python/specialize.c b/Python/specialize.c index f4bacacb8a1a61..3130ed4aa5c8c7 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -73,11 +73,9 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters case JUMP_BACKWARD: instructions[i + 1].counter = jump_counter; break; - #ifdef _Py_TIER2 case RESUME: instructions[i + 1].counter = resume_counter; break; - #endif case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: case POP_JUMP_IF_NONE: From e8a58673d53b1f341a50cf0feaf2369bffbf22aa Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 17:00:25 +0800 Subject: [PATCH 36/43] bugfixes and cleanups --- Programs/test_frozenmain.h | 70 +++++++++++++++++++------------------- Python/bytecodes.c | 3 +- Python/optimizer.c | 3 -- Python/specialize.c | 3 +- 4 files changed, 38 insertions(+), 41 deletions(-) diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index f808544045e153..1411eb1718b683 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -1,39 +1,39 @@ // Auto-generated by Programs/freeze_test_frozenmain.py unsigned char M_test_frozenmain[] = { 227,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0, - 0,0,0,0,0,243,184,0,0,0,128,0,94,0,82,1, - 73,0,116,0,94,0,82,1,73,4,116,1,93,2,33,0, - 82,2,52,1,0,0,0,0,0,0,31,0,93,2,33,0, - 82,3,93,0,80,6,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,52,2,0,0,0,0,0,0, - 31,0,93,1,80,8,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,33,0,52,0,0,0,0,0, - 0,0,82,4,44,26,0,0,0,0,0,0,0,0,0,0, - 116,5,82,7,16,0,70,24,0,0,116,6,93,2,33,0, - 82,5,93,6,12,0,82,6,93,5,93,6,44,26,0,0, - 0,0,0,0,0,0,0,0,12,0,50,4,52,1,0,0, - 0,0,0,0,31,0,75,26,0,0,9,0,30,0,82,1, - 35,0,41,8,233,0,0,0,0,78,122,18,70,114,111,122, - 101,110,32,72,101,108,108,111,32,87,111,114,108,100,122,8, - 115,121,115,46,97,114,103,118,218,6,99,111,110,102,105,103, - 122,7,99,111,110,102,105,103,32,122,2,58,32,41,5,218, - 12,112,114,111,103,114,97,109,95,110,97,109,101,218,10,101, - 120,101,99,117,116,97,98,108,101,218,15,117,115,101,95,101, - 110,118,105,114,111,110,109,101,110,116,218,17,99,111,110,102, - 105,103,117,114,101,95,99,95,115,116,100,105,111,218,14,98, - 117,102,102,101,114,101,100,95,115,116,100,105,111,41,7,218, - 3,115,121,115,218,17,95,116,101,115,116,105,110,116,101,114, - 110,97,108,99,97,112,105,218,5,112,114,105,110,116,218,4, - 97,114,103,118,218,11,103,101,116,95,99,111,110,102,105,103, - 115,114,3,0,0,0,218,3,107,101,121,169,0,243,0,0, - 0,0,218,18,116,101,115,116,95,102,114,111,122,101,110,109, - 97,105,110,46,112,121,218,8,60,109,111,100,117,108,101,62, - 114,18,0,0,0,1,0,0,0,115,94,0,0,0,240,3, - 1,1,1,243,8,0,1,11,219,0,24,225,0,5,208,6, - 26,212,0,27,217,0,5,128,106,144,35,151,40,145,40,212, - 0,27,216,9,26,215,9,38,210,9,38,211,9,40,168,24, - 213,9,50,128,6,243,2,6,12,2,128,67,241,14,0,5, - 10,136,71,144,67,144,53,152,2,152,54,160,35,157,59,152, - 45,208,10,40,214,4,41,243,15,6,12,2,114,16,0,0, - 0, + 0,0,0,0,0,243,186,0,0,0,128,0,0,0,94,0, + 82,1,73,0,116,0,94,0,82,1,73,4,116,1,93,2, + 33,0,82,2,52,1,0,0,0,0,0,0,31,0,93,2, + 33,0,82,3,93,0,80,6,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,52,2,0,0,0,0, + 0,0,31,0,93,1,80,8,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,33,0,52,0,0,0, + 0,0,0,0,82,4,44,26,0,0,0,0,0,0,0,0, + 0,0,116,5,82,7,16,0,70,24,0,0,116,6,93,2, + 33,0,82,5,93,6,12,0,82,6,93,5,93,6,44,26, + 0,0,0,0,0,0,0,0,0,0,12,0,50,4,52,1, + 0,0,0,0,0,0,31,0,75,26,0,0,9,0,30,0, + 82,1,35,0,41,8,233,0,0,0,0,78,122,18,70,114, + 111,122,101,110,32,72,101,108,108,111,32,87,111,114,108,100, + 122,8,115,121,115,46,97,114,103,118,218,6,99,111,110,102, + 105,103,122,7,99,111,110,102,105,103,32,122,2,58,32,41, + 5,218,12,112,114,111,103,114,97,109,95,110,97,109,101,218, + 10,101,120,101,99,117,116,97,98,108,101,218,15,117,115,101, + 95,101,110,118,105,114,111,110,109,101,110,116,218,17,99,111, + 110,102,105,103,117,114,101,95,99,95,115,116,100,105,111,218, + 14,98,117,102,102,101,114,101,100,95,115,116,100,105,111,41, + 7,218,3,115,121,115,218,17,95,116,101,115,116,105,110,116, + 101,114,110,97,108,99,97,112,105,218,5,112,114,105,110,116, + 218,4,97,114,103,118,218,11,103,101,116,95,99,111,110,102, + 105,103,115,114,3,0,0,0,218,3,107,101,121,169,0,243, + 0,0,0,0,218,18,116,101,115,116,95,102,114,111,122,101, + 110,109,97,105,110,46,112,121,218,8,60,109,111,100,117,108, + 101,62,114,18,0,0,0,1,0,0,0,115,94,0,0,0, + 241,3,1,1,1,243,8,0,1,11,219,0,24,225,0,5, + 208,6,26,212,0,27,217,0,5,128,106,144,35,151,40,145, + 40,212,0,27,216,9,26,215,9,38,210,9,38,211,9,40, + 168,24,213,9,50,128,6,243,2,6,12,2,128,67,241,14, + 0,5,10,136,71,144,67,144,53,152,2,152,54,160,35,157, + 59,152,45,208,10,40,214,4,41,243,15,6,12,2,114,16, + 0,0,0, }; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index cebe2c47bfb54a..9485fa2d74e4b4 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5675,7 +5675,7 @@ dummy_func( } /* Progress is guaranteed if we DEOPT on the eval breaker, because - * ENTER_EXECUTOR will not re-enter tier 2 wiFth the eval breaker set. */ + * ENTER_EXECUTOR will not re-enter tier 2 with the eval breaker set. */ tier2 op(_TIER2_RESUME_CHECK, (--)) { #if defined(__EMSCRIPTEN__) HANDLE_PENDING_AND_DEOPT_IF(_Py_emscripten_signal_clock == 0); @@ -6033,6 +6033,7 @@ dummy_func( #endif } + // END BYTECODES // } diff --git a/Python/optimizer.c b/Python/optimizer.c index 0c2477777ec8cd..def0769015d7a4 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -1042,9 +1042,6 @@ _PyJit_TryInitializeTracing( assert(curr_instr->op.code == JUMP_BACKWARD_JIT || curr_instr->op.code == RESUME_CHECK_JIT || (exit != NULL)); tracer->initial_state.jump_backward_instr = curr_instr; - if (_PyOpcode_Caches[_PyOpcode_Deopt[close_loop_instr->op.code]]) { - close_loop_instr[1].counter = trigger_backoff_counter(); - } tracer->is_tracing = true; return 1; } diff --git a/Python/specialize.c b/Python/specialize.c index 3130ed4aa5c8c7..d20e7f4a2c2fd0 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -45,7 +45,7 @@ do { \ void _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters) { - #if ENABLE_SPECIALIZATION_FT + #if ENABLE_SPECIALIZATION _Py_BackoffCounter jump_counter, adaptive_counter, resume_counter; if (enable_counters) { PyThreadState *tstate = _PyThreadState_GET(); @@ -59,7 +59,6 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters adaptive_counter = initial_unreachable_backoff_counter(); resume_counter = initial_unreachable_backoff_counter(); } - (void)resume_counter; int opcode = 0; int oparg = 0; /* The last code unit cannot have a cache, so we don't need to check it */ From 400bdcb94448ed196248c2f2d059699502f0f779 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 17:26:30 +0800 Subject: [PATCH 37/43] trace over RESUME --- Modules/_testinternalcapi/test_cases.c.h | 14 ++++++++++++-- Python/bytecodes.c | 16 ++++++++++++++-- Python/generated_cases.c.h | 14 ++++++++++++-- Python/optimizer.c | 9 +++++++++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index fe88b55c64ac3f..6a75f2d4f3b5aa 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -5686,12 +5686,22 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; if (IS_JIT_TRACING()) { + int og_opcode = executor->vm_data.opcode; + int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; + if (og_opcode == RESUME_CHECK_JIT) { + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + opcode = og_opcode; + oparg = og_oparg; + DISPATCH_GOTO_NON_TRACING(); + } JUMP_TO_LABEL(stop_tracing); } - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 9485fa2d74e4b4..be1e34f6e42cf2 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3180,12 +3180,24 @@ dummy_func( tier1 inst(ENTER_EXECUTOR, (--)) { #ifdef _Py_TIER2 + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; if (IS_JIT_TRACING()) { + int og_opcode = executor->vm_data.opcode; + int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; + // Continue tracing (skip over the executor). If it's a RESUME + // trace to form longer, more optimizeable traces. + if (og_opcode == RESUME_CHECK_JIT) { + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + opcode = og_opcode; + oparg = og_oparg; + DISPATCH_GOTO_NON_TRACING(); + } goto stop_tracing; } - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 9460b5a5e846f3..572c0cce874d5b 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5686,12 +5686,22 @@ INSTRUCTION_STATS(ENTER_EXECUTOR); opcode = ENTER_EXECUTOR; #ifdef _Py_TIER2 + PyCodeObject *code = _PyFrame_GetCode(frame); + _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; if (IS_JIT_TRACING()) { + int og_opcode = executor->vm_data.opcode; + int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; + if (og_opcode == RESUME_CHECK_JIT) { + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { + PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); + } + opcode = og_opcode; + oparg = og_oparg; + DISPATCH_GOTO_NON_TRACING(); + } JUMP_TO_LABEL(stop_tracing); } - PyCodeObject *code = _PyFrame_GetCode(frame); - _PyExecutorObject *executor = code->co_executors->executors[oparg & 255]; assert(executor->vm_data.index == INSTR_OFFSET() - 1); assert(executor->vm_data.code == code); assert(executor->vm_data.valid); diff --git a/Python/optimizer.c b/Python/optimizer.c index def0769015d7a4..5cb672a24f9a49 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -632,6 +632,15 @@ _PyJit_translate_single_bytecode_to_trace( target--; } + // We want to trace over RESUME traces. Otherwise, functions with lots of RESUME + // end up with many fragmented traces which perform badly. + // See for example, the richards benchmark in pyperformance. + if (opcode == ENTER_EXECUTOR) { + _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; + opcode = executor->vm_data.opcode; + oparg = (oparg & ~255) | executor->vm_data.oparg; + } + if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]] > 0) { uint16_t backoff = (this_instr + 1)->counter.value_and_backoff; // adaptive_counter_cooldown is a fresh specialization. From b044f13da4a9e0b411f1aaf40a509edac5fe77d4 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:49:03 +0000 Subject: [PATCH 38/43] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst new file mode 100644 index 00000000000000..9808a27e9ea1eb --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-13-09-48-57.gh-issue-127958.U-znTv.rst @@ -0,0 +1 @@ +Support tracing from function entrypoints in the JIT. Patch by Ken Jin. From 5013a83d1303baeca825d2624f1ffa62b5c016cd Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 18:00:40 +0800 Subject: [PATCH 39/43] fix non-jit builds --- Lib/test/test_dis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 77443aa5d9a3cc..f4210db5bd788e 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -941,7 +941,7 @@ def loop_test(): LOAD_FAST_BORROW 0 (i) CALL_PY_GENERAL 1 POP_TOP - JUMP_BACKWARD{: <6} 16 (to L1) + JUMP_BACKWARD_{: <6} 16 (to L1) %3d L2: END_FOR POP_ITER @@ -1371,7 +1371,7 @@ def test_loop_quicken(self): got = self.get_disassembly(loop_test, adaptive=True) jit = sys._jit.is_enabled() resume_str = "_JIT" if jit else "" - jit_str = "_JIT" if jit else "NO_JIT" + jit_str = "JIT " if jit else "NO_JIT" expected = dis_loop_test_quickened_code.format(resume_str, jit_str) self.do_disassembly_compare(got, expected) From af09d44e22d3b6f148d68af46f10e543222afa54 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Fri, 13 Mar 2026 18:18:57 +0800 Subject: [PATCH 40/43] fix test_opt --- Lib/test/test_capi/test_opt.py | 16 ++++++++-------- Modules/_testinternalcapi.c | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 0a7f802b3fb2e0..d1b53efa01460d 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1464,14 +1464,14 @@ class Bar: pass res, ex = self._run_with_optimizer(thing, Foo()) - opnames = list(iter_opnames(ex)) - self.assertIsNotNone(ex) - self.assertEqual(res, TIER2_THRESHOLD * 6 + 1) - call = opnames.index("_CALL_BUILTIN_FAST") - load_attr_top = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", 0, call) - load_attr_bottom = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", call) - self.assertEqual(opnames[:load_attr_top].count("_GUARD_TYPE_VERSION"), 1) - self.assertEqual(opnames[call:load_attr_bottom].count("_CHECK_VALIDITY"), 2) + if ex is not None: + opnames = list(iter_opnames(ex)) + self.assertEqual(res, TIER2_THRESHOLD * 6 + 1) + call = opnames.index("_CALL_BUILTIN_FAST") + load_attr_top = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", 0, call) + load_attr_bottom = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", call) + self.assertEqual(opnames[:load_attr_top].count("_GUARD_TYPE_VERSION"), 1) + self.assertEqual(opnames[call:load_attr_bottom].count("_CHECK_VALIDITY"), 2) def test_guard_type_version_removed_escaping(self): diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index b7d5d5bad92053..e7bc0a6b7555ca 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -3023,7 +3023,7 @@ module_exec(PyObject *module) return 1; } - long resume_threshold = interp->opt_config.resume_initial_value + 1; + long resume_threshold = interp->opt_config.resume_initial_value + 2; if (PyModule_Add(module, "TIER2_RESUME_THRESHOLD", // + 1 more due to one loop spent on tracing. PyLong_FromLong(resume_threshold)) < 0) { From 4a0a53086b7252affe748cfa9afc2a554613968c Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Sun, 15 Mar 2026 16:56:06 +0800 Subject: [PATCH 41/43] Partially address review --- Lib/test/test_capi/test_opt.py | 43 +++++++++--------------- Lib/test/test_compile.py | 2 +- Modules/_testinternalcapi.c | 3 +- Modules/_testinternalcapi/test_cases.c.h | 2 +- Python/bytecodes.c | 2 +- Python/ceval.c | 2 +- Python/generated_cases.c.h | 2 +- 7 files changed, 23 insertions(+), 33 deletions(-) diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index d1b53efa01460d..89491a3f52fa5c 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -44,25 +44,9 @@ def get_all_executors(func): code = func.__code__ co_code = code.co_code executors = [] - seen = set() for i in range(0, len(co_code), 2): try: - exec = _opcode.get_executor(code, i) - if id(exec) in seen: - continue - executors.append(exec) - seen.add(id(exec)) - # Add the side exit executors as well. - ops = get_ops(exec) - for idx, op in enumerate(ops): - opname = op[0] - if opname == "_EXIT_TRACE": - exit = op[3] - link_to = _testinternalcapi.get_exit_executor(exit) - if id(link_to) in seen: - continue - executors.append(link_to) - seen.add(id(link_to)) + executors.append(_opcode.get_executor(code, i)) except ValueError: pass return executors @@ -345,10 +329,16 @@ def testfunc(x): return testfunc(x-1) sys.setrecursionlimit(TIER2_RESUME_THRESHOLD * 2) - testfunc(TIER2_RESUME_THRESHOLD) + for _ in range((TIER2_RESUME_THRESHOLD + 99)//100): + testfunc(101) ex = get_first_executor(testfunc) self.assertIsNotNone(ex) + uops = get_opnames(ex) + # 0. _START_EXECUTOR + # 1. _MAKE_WARM + # 2. _TIER2_RESUME_CHECK + self.assertEqual(uops[2], "_TIER2_RESUME_CHECK") def test_jump_forward(self): def testfunc(n): @@ -1447,7 +1437,7 @@ def test_guard_type_version_removed_invalidation(self): def thing(a): x = 0 - for i in range(TIER2_THRESHOLD * 2 + 1): + for i in range(TIER2_THRESHOLD + 1): x += a.attr # The first TIER2_THRESHOLD iterations we set the attribute on # this dummy class, which shouldn't trigger the type watcher. @@ -1464,14 +1454,13 @@ class Bar: pass res, ex = self._run_with_optimizer(thing, Foo()) - if ex is not None: - opnames = list(iter_opnames(ex)) - self.assertEqual(res, TIER2_THRESHOLD * 6 + 1) - call = opnames.index("_CALL_BUILTIN_FAST") - load_attr_top = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", 0, call) - load_attr_bottom = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", call) - self.assertEqual(opnames[:load_attr_top].count("_GUARD_TYPE_VERSION"), 1) - self.assertEqual(opnames[call:load_attr_bottom].count("_CHECK_VALIDITY"), 2) + opnames = list(iter_opnames(ex)) + self.assertEqual(res, TIER2_THRESHOLD * 2 + 2) + call = opnames.index("_CALL_BUILTIN_FAST") + load_attr_top = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", 0, call) + load_attr_bottom = opnames.index("_POP_TOP_LOAD_CONST_INLINE_BORROW", call) + self.assertEqual(opnames[:load_attr_top].count("_GUARD_TYPE_VERSION"), 1) + self.assertEqual(opnames[call:load_attr_bottom].count("_CHECK_VALIDITY"), 2) def test_guard_type_version_removed_escaping(self): diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index dff1eee9f12cbf..ac8837359c1445 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -2458,7 +2458,7 @@ def test_lambda_return_position(self): for i, pos in enumerate(positions): with self.subTest(i=i, pos=pos): start_line, end_line, start_col, end_col = pos - if i == 0 or i == 1: + if i <= 1: # ignore the RESUME and CACHE in the beginning continue self.assertEqual(start_line, 1) diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index e7bc0a6b7555ca..4f381983dfe139 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -3023,9 +3023,10 @@ module_exec(PyObject *module) return 1; } + // + 1 to specialize from RESUME to RESUME_CHECK_JIT + // + 1 more due to one loop spent on tracing. long resume_threshold = interp->opt_config.resume_initial_value + 2; if (PyModule_Add(module, "TIER2_RESUME_THRESHOLD", - // + 1 more due to one loop spent on tracing. PyLong_FromLong(resume_threshold)) < 0) { return 1; } diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 6a75f2d4f3b5aa..6bd2de67870f08 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -5714,7 +5714,7 @@ if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } - DISPATCH_GOTO_NON_TRACING(); + DISPATCH_GOTO(); } assert(executor != tstate->interp->cold_executor); tstate->jit_exit = NULL; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index be1e34f6e42cf2..a0ffd18c3b198c 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3212,7 +3212,7 @@ dummy_func( if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } - DISPATCH_GOTO_NON_TRACING(); + DISPATCH_GOTO(); } assert(executor != tstate->interp->cold_executor); tstate->jit_exit = NULL; diff --git a/Python/ceval.c b/Python/ceval.c index f7fcb5d2764496..da41851e7448a6 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1138,7 +1138,7 @@ _PyObjectArray_Free(PyObject **array, PyObject **scratch) #if _Py_TIER2 // 0 for success, -1 for error. -static Py_NO_INLINE int +static int stop_tracing_and_jit(PyThreadState *tstate, _PyInterpreterFrame *frame) { int _is_sys_tracing = (tstate->c_tracefunc != NULL) || (tstate->c_profilefunc != NULL); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 572c0cce874d5b..6c800531cd3d06 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5714,7 +5714,7 @@ if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } - DISPATCH_GOTO_NON_TRACING(); + DISPATCH_GOTO(); } assert(executor != tstate->interp->cold_executor); tstate->jit_exit = NULL; From 747d4023d4e73acda95411eb5a5137b3ceee4021 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Sun, 15 Mar 2026 17:06:15 +0800 Subject: [PATCH 42/43] factor out tracing decision, try making _JIT faster --- Include/internal/pycore_optimizer.h | 2 ++ Modules/_testinternalcapi/test_cases.c.h | 10 +++++----- Python/bytecodes.c | 8 +++----- Python/generated_cases.c.h | 10 +++++----- Python/optimizer.c | 16 +++++++++++++--- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index c63f0167a0f64a..96a7ee02c3a31e 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -361,6 +361,8 @@ _PyJit_TryInitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, int oparg, _PyExecutorObject *current_executor); PyAPI_FUNC(void) _PyJit_FinalizeTracing(PyThreadState *tstate, int err); +PyAPI_FUNC(bool) _PyJit_EnterExecutorShouldStopTracing(int og_opcode); + void _PyPrintExecutor(_PyExecutorObject *executor, const _PyUOpInstruction *marker); void _PyJit_TracerFree(_PyThreadStateImpl *_tstate); diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 6bd2de67870f08..a9ac528dbb6460 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -5692,7 +5692,7 @@ int og_opcode = executor->vm_data.opcode; int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; - if (og_opcode == RESUME_CHECK_JIT) { + if (_PyJit_EnterExecutorShouldStopTracing(og_opcode)) { if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } @@ -7794,8 +7794,8 @@ #ifdef _Py_TIER2 bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && - (backoff_counter_triggers(counter) && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; @@ -10590,8 +10590,8 @@ #ifdef _Py_TIER2 bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && - (backoff_counter_triggers(counter) && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index a0ffd18c3b198c..9cde95a550f89f 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3118,8 +3118,8 @@ dummy_func( #ifdef _Py_TIER2 bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && - (backoff_counter_triggers(counter) && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { /* Back up over EXTENDED_ARGs so executor is inserted at the correct place */ @@ -3186,9 +3186,7 @@ dummy_func( int og_opcode = executor->vm_data.opcode; int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; - // Continue tracing (skip over the executor). If it's a RESUME - // trace to form longer, more optimizeable traces. - if (og_opcode == RESUME_CHECK_JIT) { + if (_PyJit_EnterExecutorShouldStopTracing(og_opcode)) { if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 6c800531cd3d06..f9e8053c810275 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -5692,7 +5692,7 @@ int og_opcode = executor->vm_data.opcode; int og_oparg = (oparg & ~255) | executor->vm_data.oparg; next_instr = this_instr; - if (og_opcode == RESUME_CHECK_JIT) { + if (_PyJit_EnterExecutorShouldStopTracing(og_opcode)) { if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) { PAUSE_ADAPTIVE_COUNTER(this_instr[1].counter); } @@ -7793,8 +7793,8 @@ #ifdef _Py_TIER2 bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && - (backoff_counter_triggers(counter) && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; @@ -10587,8 +10587,8 @@ #ifdef _Py_TIER2 bool is_resume = this_instr->op.code == RESUME_CHECK_JIT; _Py_BackoffCounter counter = this_instr[1].counter; - if (!IS_JIT_TRACING() && - (backoff_counter_triggers(counter) && + if ((backoff_counter_triggers(counter) && + !IS_JIT_TRACING() && (this_instr->op.code == JUMP_BACKWARD_JIT || is_resume)) && next_instr->op.code != ENTER_EXECUTOR) { _Py_CODEUNIT *insert_exec_at = this_instr; diff --git a/Python/optimizer.c b/Python/optimizer.c index 5cb672a24f9a49..38bad96ad8ec11 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -632,9 +632,6 @@ _PyJit_translate_single_bytecode_to_trace( target--; } - // We want to trace over RESUME traces. Otherwise, functions with lots of RESUME - // end up with many fragmented traces which perform badly. - // See for example, the richards benchmark in pyperformance. if (opcode == ENTER_EXECUTOR) { _PyExecutorObject *executor = old_code->co_executors->executors[oparg & 255]; opcode = executor->vm_data.opcode; @@ -1104,6 +1101,19 @@ _PyJit_FinalizeTracing(PyThreadState *tstate, int err) tracer->is_tracing = false; } +bool +_PyJit_EnterExecutorShouldStopTracing(int og_opcode) +{ + // Continue tracing (skip over the executor). If it's a RESUME + // trace to form longer, more optimizeable traces. + // We want to trace over RESUME traces. Otherwise, functions with lots of RESUME + // end up with many fragmented traces which perform badly. + // See for example, the richards benchmark in pyperformance. + // For consideration: We may want to consider tracing over side traces + // inserted into bytecode as well in the future. + return og_opcode == RESUME_CHECK_JIT; +} + void _PyJit_TracerFree(_PyThreadStateImpl *_tstate) { From 5ccf8e9954ae3bbe298a2399fb51d00ecdcd6c96 Mon Sep 17 00:00:00 2001 From: Ken Jin Date: Sun, 15 Mar 2026 17:54:12 +0800 Subject: [PATCH 43/43] restore RESUME opt for generators --- Objects/genobject.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Objects/genobject.c b/Objects/genobject.c index 5088500fc4142b..9dece8a7700cab 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -454,6 +454,7 @@ is_resume(_Py_CODEUNIT *instr) return ( code == RESUME || code == RESUME_CHECK || + code == RESUME_CHECK_JIT || code == INSTRUMENTED_RESUME ); }