From 96236997a8d9f956c554ef81ab2988b3c2f9eb05 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:30:16 +0200 Subject: [PATCH 1/5] Add _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW --- Include/internal/pycore_uop_ids.h | 83 +++++++++++++------------- Include/internal/pycore_uop_metadata.h | 4 ++ Lib/test/test_capi/test_opt.py | 12 ++-- Python/bytecodes.c | 8 +++ Python/executor_cases.c.h | 38 ++++++++++++ Python/optimizer_bytecodes.c | 6 ++ Python/optimizer_cases.c.h | 12 ++++ 7 files changed, 118 insertions(+), 45 deletions(-) diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 71a288a3a39179..1c3a7e3c7a340c 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -263,73 +263,74 @@ extern "C" { #define _MONITOR_JUMP_BACKWARD 478 #define _MONITOR_RESUME 479 #define _NOP NOP +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 480 #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 480 -#define _POP_JUMP_IF_TRUE 481 +#define _POP_JUMP_IF_FALSE 481 +#define _POP_JUMP_IF_TRUE 482 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE 482 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 483 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 484 +#define _POP_TOP_LOAD_CONST_INLINE 483 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 484 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 485 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 485 +#define _PUSH_FRAME 486 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 486 -#define _PY_FRAME_GENERAL 487 -#define _PY_FRAME_KW 488 -#define _QUICKEN_RESUME 489 -#define _REPLACE_WITH_TRUE 490 +#define _PUSH_NULL_CONDITIONAL 487 +#define _PY_FRAME_GENERAL 488 +#define _PY_FRAME_KW 489 +#define _QUICKEN_RESUME 490 +#define _REPLACE_WITH_TRUE 491 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 491 -#define _SEND 492 -#define _SEND_GEN_FRAME 493 +#define _SAVE_RETURN_OFFSET 492 +#define _SEND 493 +#define _SEND_GEN_FRAME 494 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _START_EXECUTOR 494 -#define _STORE_ATTR 495 -#define _STORE_ATTR_INSTANCE_VALUE 496 -#define _STORE_ATTR_SLOT 497 -#define _STORE_ATTR_WITH_HINT 498 +#define _START_EXECUTOR 495 +#define _STORE_ATTR 496 +#define _STORE_ATTR_INSTANCE_VALUE 497 +#define _STORE_ATTR_SLOT 498 +#define _STORE_ATTR_WITH_HINT 499 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 499 -#define _STORE_FAST_0 500 -#define _STORE_FAST_1 501 -#define _STORE_FAST_2 502 -#define _STORE_FAST_3 503 -#define _STORE_FAST_4 504 -#define _STORE_FAST_5 505 -#define _STORE_FAST_6 506 -#define _STORE_FAST_7 507 +#define _STORE_FAST 500 +#define _STORE_FAST_0 501 +#define _STORE_FAST_1 502 +#define _STORE_FAST_2 503 +#define _STORE_FAST_3 504 +#define _STORE_FAST_4 505 +#define _STORE_FAST_5 506 +#define _STORE_FAST_6 507 +#define _STORE_FAST_7 508 #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 508 -#define _STORE_SUBSCR 509 -#define _STORE_SUBSCR_DICT 510 -#define _STORE_SUBSCR_LIST_INT 511 +#define _STORE_SLICE 509 +#define _STORE_SUBSCR 510 +#define _STORE_SUBSCR_DICT 511 +#define _STORE_SUBSCR_LIST_INT 512 #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 512 -#define _TO_BOOL 513 +#define _TIER2_RESUME_CHECK 513 +#define _TO_BOOL 514 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 514 +#define _TO_BOOL_LIST 515 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 515 +#define _TO_BOOL_STR 516 #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 516 -#define _UNPACK_SEQUENCE_LIST 517 -#define _UNPACK_SEQUENCE_TUPLE 518 -#define _UNPACK_SEQUENCE_TWO_TUPLE 519 +#define _UNPACK_SEQUENCE 517 +#define _UNPACK_SEQUENCE_LIST 518 +#define _UNPACK_SEQUENCE_TUPLE 519 +#define _UNPACK_SEQUENCE_TWO_TUPLE 520 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 519 +#define MAX_UOP_ID 520 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 88a2e538447034..4cb380bc9359ad 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -303,6 +303,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG, [_POP_TOP_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, [_POP_TWO_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, + [_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, [_CHECK_FUNCTION] = HAS_DEOPT_FLAG, [_START_EXECUTOR] = 0, [_MAKE_WARM] = 0, @@ -549,6 +550,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_MAYBE_EXPAND_METHOD] = "_MAYBE_EXPAND_METHOD", [_MAYBE_EXPAND_METHOD_KW] = "_MAYBE_EXPAND_METHOD_KW", [_NOP] = "_NOP", + [_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW] = "_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", [_POP_EXCEPT] = "_POP_EXCEPT", [_POP_TOP] = "_POP_TOP", [_POP_TOP_LOAD_CONST_INLINE] = "_POP_TOP_LOAD_CONST_INLINE", @@ -1184,6 +1186,8 @@ int _PyUop_num_popped(int opcode, int oparg) return 1; case _POP_TWO_LOAD_CONST_INLINE_BORROW: return 2; + case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: + return 4; case _CHECK_FUNCTION: return 0; case _START_EXECUTOR: diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 73ce55400adcdf..dccfb447c12a9e 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1955,9 +1955,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_GUARD_THIRD_NULL", uops) self.assertNotIn("_GUARD_CALLABLE_ISINSTANCE", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_is_true(self): def testfunc(n): @@ -1972,9 +1973,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_TO_BOOL_BOOL", uops) self.assertNotIn("_GUARD_IS_TRUE_POP", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_is_false(self): def testfunc(n): @@ -1989,9 +1991,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_TO_BOOL_BOOL", uops) self.assertNotIn("_GUARD_IS_FALSE_POP", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_subclass(self): def testfunc(n): @@ -2006,9 +2009,10 @@ def testfunc(n): self.assertEqual(res, TIER2_THRESHOLD) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_CALL_ISINSTANCE", uops) + self.assertNotIn("_CALL_ISINSTANCE", uops) self.assertNotIn("_TO_BOOL_BOOL", uops) self.assertNotIn("_GUARD_IS_TRUE_POP", uops) + self.assertIn("_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW", uops) def test_call_isinstance_unknown_object(self): def testfunc(n): diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 42e4f581894d1f..8f08636499193d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5327,6 +5327,14 @@ dummy_func( value = PyStackRef_FromPyObjectImmortal(ptr); } + tier2 pure op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop1, pop2 -- value)) { + PyStackRef_CLOSE(pop2); + PyStackRef_CLOSE(pop1); + PyStackRef_CLOSE(null); + PyStackRef_CLOSE(callable); + value = PyStackRef_FromPyObjectImmortal(ptr); + } + tier2 op(_CHECK_FUNCTION, (func_version/2 -- )) { assert(PyStackRef_FunctionCheck(frame->f_funcobj)); PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj); diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 41c9bd5ba7089a..9567f456d53b93 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -7090,6 +7090,44 @@ break; } + case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: { + _PyStackRef pop2; + _PyStackRef pop1; + _PyStackRef null; + _PyStackRef callable; + _PyStackRef value; + pop2 = stack_pointer[-1]; + pop1 = stack_pointer[-2]; + null = stack_pointer[-3]; + callable = stack_pointer[-4]; + PyObject *ptr = (PyObject *)CURRENT_OPERAND0(); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(pop2); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(pop1); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(null); + stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_CLOSE(callable); + stack_pointer = _PyFrame_GetStackPointer(frame); + value = PyStackRef_FromPyObjectImmortal(ptr); + stack_pointer[0] = value; + stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _CHECK_FUNCTION: { uint32_t func_version = (uint32_t)CURRENT_OPERAND0(); assert(PyStackRef_FunctionCheck(frame->f_funcobj)); diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index ad25c68e62aab2..8b8693cd00853f 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -550,6 +550,10 @@ dummy_func(void) { value = sym_new_const(ctx, ptr); } + op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, unused, unused, unused, unused -- value)) { + value = sym_new_const(ctx, ptr); + } + op(_COPY, (bottom, unused[oparg-1] -- bottom, unused[oparg-1], top)) { assert(oparg > 0); top = bottom; @@ -903,9 +907,11 @@ dummy_func(void) { // The below check is equivalent to PyObject_TypeCheck(inst, cls) if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { sym_set_const(res, Py_True); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); } else { sym_set_const(res, Py_False); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); } } } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 5d469765203833..f9510e8f9eb598 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2135,9 +2135,11 @@ if (inst_type && cls_o && sym_matches_type(cls, &PyType_Type)) { if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { sym_set_const(res, Py_True); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); } else { sym_set_const(res, Py_False); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); } } stack_pointer[-4] = res; @@ -2535,6 +2537,16 @@ break; } + case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: { + JitOptSymbol *value; + PyObject *ptr = (PyObject *)this_instr->operand0; + value = sym_new_const(ctx, ptr); + stack_pointer[-4] = value; + stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _CHECK_FUNCTION: { break; } From bc41fc3ab33e05b5938b3273db18cf7e3ecbbff7 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:47:08 +0200 Subject: [PATCH 2/5] Mark null as DEAD --- Python/bytecodes.c | 3 ++- Python/executor_cases.c.h | 8 ++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 8f08636499193d..5c3b110e48c08d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5330,7 +5330,8 @@ dummy_func( tier2 pure op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop1, pop2 -- value)) { PyStackRef_CLOSE(pop2); PyStackRef_CLOSE(pop1); - PyStackRef_CLOSE(null); + (void)null; // Silence compiler warnings about unused variables + DEAD(null); PyStackRef_CLOSE(callable); value = PyStackRef_FromPyObjectImmortal(ptr); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 9567f456d53b93..287f53aa1b4d73 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -7111,12 +7111,8 @@ _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(pop1); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - assert(WITHIN_STACK_BOUNDS()); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(null); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; + (void)null; + stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(callable); From 421f4995377608d3cac27373eacd9d27d17cd721 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:50:06 +0200 Subject: [PATCH 3/5] Simplify logic --- Python/optimizer_bytecodes.c | 10 ++++------ Python/optimizer_cases.c.h | 10 ++++------ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 8b8693cd00853f..fa8183e66e1f38 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -905,14 +905,12 @@ dummy_func(void) { // known types, meaning we can deduce either True or False // The below check is equivalent to PyObject_TypeCheck(inst, cls) + PyObject *out = Py_False; if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { - sym_set_const(res, Py_True); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); - } - else { - sym_set_const(res, Py_False); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); + out = Py_True; } + sym_set_const(res, out); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)out); } } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index f9510e8f9eb598..aa381ae817532b 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -2133,14 +2133,12 @@ PyTypeObject *inst_type = sym_get_type(instance); PyTypeObject *cls_o = (PyTypeObject *)sym_get_const(ctx, cls); if (inst_type && cls_o && sym_matches_type(cls, &PyType_Type)) { + PyObject *out = Py_False; if (inst_type == cls_o || PyType_IsSubtype(inst_type, cls_o)) { - sym_set_const(res, Py_True); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True); - } - else { - sym_set_const(res, Py_False); - REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_False); + out = Py_True; } + sym_set_const(res, out); + REPLACE_OP(this_instr, _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)out); } stack_pointer[-4] = res; stack_pointer += -3; From 24b2632cdc3097989f9aa602b89a1a2f1bb94ee3 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 20:53:00 +0200 Subject: [PATCH 4/5] Add news entry --- .../2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst new file mode 100644 index 00000000000000..98d770cf054926 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-05-19-20-52-53.gh-issue-134268.HPKX1e.rst @@ -0,0 +1,2 @@ +Add ``_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW`` and use it to further +optimize ``CALL_ISINSTANCE``. From 070dbc7c493f3e282bd0f97a5470899a60906696 Mon Sep 17 00:00:00 2001 From: Tomas Roun Date: Mon, 19 May 2025 23:19:52 +0200 Subject: [PATCH 5/5] make regen-cases --- Include/internal/pycore_uop_ids.h | 125 ++++++++++-------------------- 1 file changed, 42 insertions(+), 83 deletions(-) diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index de994a62e0a904..322f3cc093f7bb 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -265,115 +265,74 @@ extern "C" { #define _MONITOR_JUMP_BACKWARD 481 #define _MONITOR_RESUME 482 #define _NOP NOP -#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 480 +#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 483 #define _POP_EXCEPT POP_EXCEPT -#define _POP_JUMP_IF_FALSE 481 -#define _POP_JUMP_IF_TRUE 482 -#define _POP_JUMP_IF_FALSE 483 -#define _POP_JUMP_IF_TRUE 484 +#define _POP_JUMP_IF_FALSE 484 +#define _POP_JUMP_IF_TRUE 485 #define _POP_TOP POP_TOP -#define _POP_TOP_LOAD_CONST_INLINE 483 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 484 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 485 -#define _POP_TOP_LOAD_CONST_INLINE 485 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW 486 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW 487 +#define _POP_TOP_LOAD_CONST_INLINE 486 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW 487 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW 488 #define _PUSH_EXC_INFO PUSH_EXC_INFO -#define _PUSH_FRAME 486 -#define _PUSH_FRAME 488 +#define _PUSH_FRAME 489 #define _PUSH_NULL PUSH_NULL -#define _PUSH_NULL_CONDITIONAL 487 -#define _PY_FRAME_GENERAL 488 -#define _PY_FRAME_KW 489 -#define _QUICKEN_RESUME 490 -#define _REPLACE_WITH_TRUE 491 -#define _PUSH_NULL_CONDITIONAL 489 -#define _PY_FRAME_GENERAL 490 -#define _PY_FRAME_KW 491 -#define _QUICKEN_RESUME 492 -#define _REPLACE_WITH_TRUE 493 +#define _PUSH_NULL_CONDITIONAL 490 +#define _PY_FRAME_GENERAL 491 +#define _PY_FRAME_KW 492 +#define _QUICKEN_RESUME 493 +#define _REPLACE_WITH_TRUE 494 #define _RESUME_CHECK RESUME_CHECK #define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_VALUE RETURN_VALUE -#define _SAVE_RETURN_OFFSET 492 -#define _SEND 493 -#define _SEND_GEN_FRAME 494 -#define _SAVE_RETURN_OFFSET 494 -#define _SEND 495 -#define _SEND_GEN_FRAME 496 +#define _SAVE_RETURN_OFFSET 495 +#define _SEND 496 +#define _SEND_GEN_FRAME 497 #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SET_ADD SET_ADD #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_UPDATE SET_UPDATE -#define _START_EXECUTOR 495 -#define _STORE_ATTR 496 -#define _STORE_ATTR_INSTANCE_VALUE 497 -#define _STORE_ATTR_SLOT 498 -#define _STORE_ATTR_WITH_HINT 499 -#define _START_EXECUTOR 497 -#define _STORE_ATTR 498 -#define _STORE_ATTR_INSTANCE_VALUE 499 -#define _STORE_ATTR_SLOT 500 -#define _STORE_ATTR_WITH_HINT 501 +#define _START_EXECUTOR 498 +#define _STORE_ATTR 499 +#define _STORE_ATTR_INSTANCE_VALUE 500 +#define _STORE_ATTR_SLOT 501 +#define _STORE_ATTR_WITH_HINT 502 #define _STORE_DEREF STORE_DEREF -#define _STORE_FAST 500 -#define _STORE_FAST_0 501 -#define _STORE_FAST_1 502 -#define _STORE_FAST_2 503 -#define _STORE_FAST_3 504 -#define _STORE_FAST_4 505 -#define _STORE_FAST_5 506 -#define _STORE_FAST_6 507 -#define _STORE_FAST_7 508 -#define _STORE_FAST 502 -#define _STORE_FAST_0 503 -#define _STORE_FAST_1 504 -#define _STORE_FAST_2 505 -#define _STORE_FAST_3 506 -#define _STORE_FAST_4 507 -#define _STORE_FAST_5 508 -#define _STORE_FAST_6 509 -#define _STORE_FAST_7 510 +#define _STORE_FAST 503 +#define _STORE_FAST_0 504 +#define _STORE_FAST_1 505 +#define _STORE_FAST_2 506 +#define _STORE_FAST_3 507 +#define _STORE_FAST_4 508 +#define _STORE_FAST_5 509 +#define _STORE_FAST_6 510 +#define _STORE_FAST_7 511 #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_GLOBAL STORE_GLOBAL #define _STORE_NAME STORE_NAME -#define _STORE_SLICE 509 -#define _STORE_SUBSCR 510 -#define _STORE_SUBSCR_DICT 511 -#define _STORE_SUBSCR_LIST_INT 512 -#define _STORE_SLICE 511 -#define _STORE_SUBSCR 512 -#define _STORE_SUBSCR_DICT 513 -#define _STORE_SUBSCR_LIST_INT 514 +#define _STORE_SLICE 512 +#define _STORE_SUBSCR 513 +#define _STORE_SUBSCR_DICT 514 +#define _STORE_SUBSCR_LIST_INT 515 #define _SWAP SWAP -#define _TIER2_RESUME_CHECK 513 -#define _TO_BOOL 514 -#define _TIER2_RESUME_CHECK 515 -#define _TO_BOOL 516 +#define _TIER2_RESUME_CHECK 516 +#define _TO_BOOL 517 #define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_INT TO_BOOL_INT -#define _TO_BOOL_LIST 515 -#define _TO_BOOL_LIST 517 +#define _TO_BOOL_LIST 518 #define _TO_BOOL_NONE TO_BOOL_NONE -#define _TO_BOOL_STR 516 -#define _TO_BOOL_STR 518 +#define _TO_BOOL_STR 519 #define _UNARY_INVERT UNARY_INVERT #define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NOT UNARY_NOT #define _UNPACK_EX UNPACK_EX -#define _UNPACK_SEQUENCE 517 -#define _UNPACK_SEQUENCE_LIST 518 -#define _UNPACK_SEQUENCE_TUPLE 519 -#define _UNPACK_SEQUENCE_TWO_TUPLE 520 -#define _UNPACK_SEQUENCE 519 -#define _UNPACK_SEQUENCE_LIST 520 -#define _UNPACK_SEQUENCE_TUPLE 521 -#define _UNPACK_SEQUENCE_TWO_TUPLE 522 +#define _UNPACK_SEQUENCE 520 +#define _UNPACK_SEQUENCE_LIST 521 +#define _UNPACK_SEQUENCE_TUPLE 522 +#define _UNPACK_SEQUENCE_TWO_TUPLE 523 #define _WITH_EXCEPT_START WITH_EXCEPT_START #define _YIELD_VALUE YIELD_VALUE -#define MAX_UOP_ID 520 -#define MAX_UOP_ID 522 +#define MAX_UOP_ID 523 #ifdef __cplusplus }