]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Move specializing ddetection to specialize inst
authorKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Fri, 24 Oct 2025 19:04:10 +0000 (20:04 +0100)
committerKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Fri, 24 Oct 2025 19:04:10 +0000 (20:04 +0100)
Include/internal/pycore_opcode_metadata.h
Lib/test/test_generated_cases.py
Python/bytecodes.c
Python/ceval_macros.h
Python/generated_cases.c.h
Python/optimizer.c
Tools/cases_generator/generators_common.py

index 288396f34fc3d45ec6e22ea2640d32850e6c7d50..0156e083b7759f7f9738153a4d151a9c61ca3c9a 100644 (file)
@@ -1411,6 +1411,7 @@ _PyOpcode_macro_expansion[256] = {
     [IMPORT_FROM] = { .nuops = 1, .uops = { { _IMPORT_FROM, OPARG_SIMPLE, 0 } } },
     [IMPORT_NAME] = { .nuops = 1, .uops = { { _IMPORT_NAME, OPARG_SIMPLE, 0 } } },
     [IS_OP] = { .nuops = 1, .uops = { { _IS_OP, OPARG_SIMPLE, 0 } } },
+    [JUMP_BACKWARD] = { .nuops = 2, .uops = { { _CHECK_PERIODIC, OPARG_SIMPLE, 1 }, { _JUMP_BACKWARD_NO_INTERRUPT, OPARG_REPLACED, 1 } } },
     [JUMP_BACKWARD_NO_INTERRUPT] = { .nuops = 1, .uops = { { _JUMP_BACKWARD_NO_INTERRUPT, OPARG_REPLACED, 0 } } },
     [JUMP_BACKWARD_NO_JIT] = { .nuops = 2, .uops = { { _CHECK_PERIODIC, OPARG_SIMPLE, 1 }, { _JUMP_BACKWARD_NO_INTERRUPT, OPARG_REPLACED, 1 } } },
     [LIST_APPEND] = { .nuops = 1, .uops = { { _LIST_APPEND, OPARG_SIMPLE, 0 } } },
index 1c04881bca573007b5982f9a5a4240fdea29d251..09ce329bdcd14dbdd90b23bdca654c2215bd2163 100644 (file)
@@ -329,9 +329,6 @@ class TestGeneratedCases(unittest.TestCase):
             if (xxx) {
                 UPDATE_MISS_STATS(OP1);
                 assert(_PyOpcode_Deopt[opcode] == (OP1));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(OP1);
             }
             res = Py_None;
index e53621298553b8ed8ae63112e2347bc7fc769ceb..bcc9f220335cd1195260c1aaf30c329e47de300a 100644 (file)
@@ -2939,7 +2939,7 @@ dummy_func(
             JUMP_BACKWARD_JIT,
         };
 
-        tier1 op(_SPECIALIZE_JUMP_BACKWARD, (--)) {
+        specializing tier1 op(_SPECIALIZE_JUMP_BACKWARD, (--)) {
         #if ENABLE_SPECIALIZATION
             if (this_instr->op.code == JUMP_BACKWARD) {
                 uint8_t desired = tstate->interp->jit ? JUMP_BACKWARD_JIT : JUMP_BACKWARD_NO_JIT;
index a29e5d5cbbfd32ae3dd22a89b1ae9db3f7cc6ee6..9dd7b1dea1653005c7a62b252f59a2ea7020e997 100644 (file)
 #if (_Py_TAIL_CALL_INTERP || USE_COMPUTED_GOTOS) && _Py_TIER2
 #  define IS_JIT_TRACING() (DISPATCH_TABLE_VAR == TRACING_DISPATCH_TABLE)
 // Required to not get stuck in infinite specialization loops due to specialization failure.
-#  define IS_JIT_TRACING_MAKING_PROGRESS() (IS_JIT_TRACING() && tstate->interp->jit_state.specialize_counter <= 2)
+#  define IS_JIT_TRACING_MAKING_PROGRESS() (IS_JIT_TRACING() && tstate->interp->jit_state.specialize_counter < 1)
 #  define ENTER_TRACING() \
     DISPATCH_TABLE_VAR = TRACING_DISPATCH_TABLE;
 #  define LEAVE_TRACING() \
@@ -192,31 +192,12 @@ do { \
         DISPATCH_GOTO_NON_TRACING(); \
     }
 
-#if _Py_TIER2
 #define DISPATCH_SAME_OPARG() \
     { \
-        tstate->interp->jit_state.specialize_counter++; \
         opcode = next_instr->op.code; \
         PRE_DISPATCH_GOTO(); \
         DISPATCH_GOTO_NON_TRACING(); \
     }
-#define DISPATCH_INLINED(NEW_FRAME)                     \
-    do {                                                \
-        assert(tstate->interp->eval_frame == NULL);     \
-        _PyFrame_SetStackPointer(frame, stack_pointer); \
-        assert((NEW_FRAME)->previous == frame);         \
-        frame = tstate->current_frame = (NEW_FRAME);     \
-        CALL_STAT_INC(inlined_py_calls);                \
-        JUMP_TO_LABEL(start_frame);                      \
-    } while (0)
-#else
-
-#define DISPATCH_SAME_OPARG() \
-    { \
-        opcode = next_instr->op.code; \
-        PRE_DISPATCH_GOTO(); \
-        DISPATCH_GOTO(); \
-    }
 
 #define DISPATCH_INLINED(NEW_FRAME)                     \
     do {                                                \
@@ -227,7 +208,6 @@ do { \
         CALL_STAT_INC(inlined_py_calls);                \
         JUMP_TO_LABEL(start_frame);                      \
     } while (0)
-#endif
 
 
 /* Tuple access macros */
index 4dc2599bff529739ce6c4f025883bb9ee44f46c7..8a81a6cdcc4929dcb237c0626489fe86a6aadddb 100644 (file)
@@ -44,6 +44,9 @@
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_BinaryOp(lhs, rhs, next_instr, oparg, LOCALS_ARRAY);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(BINARY_OP);
                 if (!PyFloat_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyFloat_CheckExact(left_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(left_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (PyStackRef_IsNull(res)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
                 if (!PyUnicode_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyUnicode_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!res) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyUnicode_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyUnicode_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (PyStackRef_AsPyObjectBorrow(*target_local) != left_o) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 STAT_INC(BINARY_OP, hit);
                 if (!PyFloat_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyFloat_CheckExact(left_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(left_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (PyStackRef_IsNull(res)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
                 if (!PyDict_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 PyHeapTypeObject *ht = (PyHeapTypeObject *)tp;
                 if (getitem_o == NULL) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 assert(PyFunction_Check(getitem_o));
                 if (((PyFunctionObject *)getitem_o)->func_version != cached_version) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(getitem_o);
                 if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 getitem = PyStackRef_FromPyObjectNew(getitem_o);
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyList_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
                 if (res_o == NULL) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 STAT_INC(BINARY_OP, hit);
                 if (index >= PyList_GET_SIZE(list)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 STAT_INC(BINARY_OP, hit);
                 if (!PySlice_Check(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyList_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyUnicode_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
                 if (PyUnicode_GET_LENGTH(str) <= index) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 Py_UCS4 c = PyUnicode_READ_CHAR(str, index);
                 if (Py_ARRAY_LENGTH(_Py_SINGLETON(strings).ascii) <= c) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 STAT_INC(BINARY_OP, hit);
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyTuple_CheckExact(o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
                 if (index >= PyTuple_GET_SIZE(tuple)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 STAT_INC(BINARY_OP, hit);
                 if (!PyFloat_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!PyFloat_CheckExact(left_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(left_o)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
             }
                 if (PyStackRef_IsNull(res)) {
                     UPDATE_MISS_STATS(BINARY_OP);
                     assert(_PyOpcode_Deopt[opcode] == (BINARY_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(BINARY_OP);
                 }
                 PyStackRef_CLOSE_SPECIALIZED(right, _PyLong_ExactDealloc);
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_Call(callable, next_instr, oparg + !PyStackRef_IsNull(self_or_null));
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(CALL);
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyStackRef_IsNull(self_or_null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (!PyType_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyTypeObject *tp = (PyTypeObject *)callable_o;
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 assert(tp->tp_new == PyBaseObject_Type.tp_new);
                 if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize + _Py_InitCleanup.co_framesize)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (Py_TYPE(PyStackRef_AsPyObjectBorrow(callable)) != &PyMethod_Type) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyFunction_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyFunctionObject *func = (PyFunctionObject *)callable_o;
                 if (func->func_version != func_version) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (code->co_argcount != oparg + (!PyStackRef_IsNull(self_or_null))) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->py_recursion_remaining <= 1) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (Py_TYPE(callable_o) != &PyMethod_Type) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyObject *func = ((PyMethodObject *)callable_o)->im_func;
                 if (!PyFunction_Check(func)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (((PyFunctionObject *)func)->func_version != func_version) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->py_recursion_remaining <= 1) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyType_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyTypeObject *tp = (PyTypeObject *)callable_o;
                 if (tp->tp_vectorcall == NULL) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (!PyCFunction_CheckExact(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (PyCFunction_GET_FLAGS(callable_o) != METH_FASTCALL) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (!PyCFunction_CheckExact(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (PyCFunction_GET_FLAGS(callable_o) != (METH_FASTCALL | METH_KEYWORDS)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (total_args != 1) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (!PyCFunction_CheckExact(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (PyCFunction_GET_FLAGS(callable_o) != METH_O) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (_Py_ReachedRecursionLimit(tstate)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (callable_o != interp->callable_cache.isinstance) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_CallKw(callable, next_instr, oparg + !PyStackRef_IsNull(self_or_null));
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(CALL_KW);
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
             }
                 if (Py_TYPE(callable_o) != &PyMethod_Type) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
                 PyObject *func = ((PyMethodObject *)callable_o)->im_func;
                 if (!PyFunction_Check(func)) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
                 if (((PyFunctionObject *)func)->func_version != func_version) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
             }
                 if (PyFunction_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
                 if (Py_TYPE(callable_o) == &PyMethod_Type) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
             }
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
             }
                 if (!PyFunction_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
                 PyFunctionObject *func = (PyFunctionObject *)callable_o;
                 if (func->func_version != func_version) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
             }
                 if (tstate->py_recursion_remaining <= 1) {
                     UPDATE_MISS_STATS(CALL_KW);
                     assert(_PyOpcode_Deopt[opcode] == (CALL_KW));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL_KW);
                 }
             }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (callable_o != interp->callable_cache.len) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (callable_o != interp->callable_cache.list_append) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (o == NULL) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyList_CheckExact(o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyList_CheckExact(self_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (!LOCK_OBJECT(self_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (total_args == 0) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
                 if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDef *meth = method->d_method;
                 if (meth->ml_flags != METH_FASTCALL) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyObject *self = PyStackRef_AsPyObjectBorrow(arguments[0]);
                 if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (total_args == 0) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
                 if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDef *meth = method->d_method;
                 if (meth->ml_flags != (METH_FASTCALL|METH_KEYWORDS)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyTypeObject *d_type = method->d_common.d_type;
                 if (!Py_IS_TYPE(self, d_type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (total_args != 1) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDescrObject *method = (PyMethodDescrObject *)callable_o;
                 if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDef *meth = method->d_method;
                 if (!Py_IS_TYPE(self, method->d_common.d_type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (meth->ml_flags != METH_NOARGS) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (_Py_ReachedRecursionLimit(tstate)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (total_args != 2) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (!Py_IS_TYPE(method, &PyMethodDescr_Type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyMethodDef *meth = method->d_method;
                 if (meth->ml_flags != METH_O) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (_Py_ReachedRecursionLimit(tstate)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 _PyStackRef arg_stackref = arguments[1];
                                 method->d_common.d_type)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 STAT_INC(CALL, hit);
                 if (PyFunction_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 if (Py_TYPE(callable_o) == &PyMethod_Type) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyFunction_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyFunctionObject *func = (PyFunctionObject *)callable_o;
                 if (func->func_version != func_version) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (code->co_argcount != oparg + (!PyStackRef_IsNull(self_or_null))) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->py_recursion_remaining <= 1) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyFunction_Check(callable_o)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
                 PyFunctionObject *func = (PyFunctionObject *)callable_o;
                 if (func->func_version != func_version) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (tstate->py_recursion_remaining <= 1) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (callable_o != (PyObject *)&PyUnicode_Type) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (callable_o != (PyObject *)&PyTuple_Type) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (!PyStackRef_IsNull(null)) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                 if (callable_o != (PyObject *)&PyType_Type) {
                     UPDATE_MISS_STATS(CALL);
                     assert(_PyOpcode_Deopt[opcode] == (CALL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CALL);
                 }
             }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_CompareOp(left, right, next_instr, oparg);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(COMPARE_OP);
                 if (!PyFloat_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(COMPARE_OP);
                     assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(COMPARE_OP);
                 }
             }
                 if (!PyFloat_CheckExact(left_o)) {
                     UPDATE_MISS_STATS(COMPARE_OP);
                     assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(COMPARE_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(COMPARE_OP);
                     assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(COMPARE_OP);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(left_o)) {
                     UPDATE_MISS_STATS(COMPARE_OP);
                     assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(COMPARE_OP);
                 }
             }
                 if (!PyUnicode_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(COMPARE_OP);
                     assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(COMPARE_OP);
                 }
             }
                 if (!PyUnicode_CheckExact(o)) {
                     UPDATE_MISS_STATS(COMPARE_OP);
                     assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(COMPARE_OP);
                 }
             }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_ContainsOp(right, next_instr);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(CONTAINS_OP);
                 if (!PyDict_CheckExact(o)) {
                     UPDATE_MISS_STATS(CONTAINS_OP);
                     assert(_PyOpcode_Deopt[opcode] == (CONTAINS_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CONTAINS_OP);
                 }
             }
                 if (!PyAnySet_CheckExact(o)) {
                     UPDATE_MISS_STATS(CONTAINS_OP);
                     assert(_PyOpcode_Deopt[opcode] == (CONTAINS_OP));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(CONTAINS_OP);
                 }
             }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_ForIter(iter, null_or_index, next_instr, oparg);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(FOR_ITER);
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
             }
                 if (Py_TYPE(gen) != &PyGen_Type) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 #ifdef Py_GIL_DISABLED
                 if (!_PyObject_IsUniquelyReferenced((PyObject *)gen)) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 #endif
                 if (gen->gi_frame_state >= FRAME_EXECUTING) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 STAT_INC(FOR_ITER, hit);
                 iter = stack_pointer[-2];
                 PyObject *iter_o = PyStackRef_AsPyObjectBorrow(iter);
                 if (Py_TYPE(iter_o) != &PyList_Type) {
-                    UPDATE_MISS_STATS(FOR_ITER);
-                    assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
+                    UPDATE_MISS_STATS(FOR_ITER);
+                    assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 assert(PyStackRef_IsTaggedInt(null_or_index));
                 if (!_Py_IsOwnedByCurrentThread(iter_o) && !_PyObject_GC_IS_SHARED(iter_o)) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 #endif
                 if (result < 0) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 if (result == 0) {
                 if (Py_TYPE(r) != &PyRangeIter_Type) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 #ifdef Py_GIL_DISABLED
                 if (!_PyObject_IsUniquelyReferenced((PyObject *)r)) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 #endif
                 if (Py_TYPE(iter_o) != &PyTuple_Type) {
                     UPDATE_MISS_STATS(FOR_ITER);
                     assert(_PyOpcode_Deopt[opcode] == (FOR_ITER));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(FOR_ITER);
                 }
                 assert(PyStackRef_IsTaggedInt(null_or_index));
                     uint8_t desired = tstate->interp->jit ? JUMP_BACKWARD_JIT : JUMP_BACKWARD_NO_JIT;
                     FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, desired);
                     next_instr = this_instr;
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 #endif
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_LoadAttr(owner, next_instr, name);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(LOAD_ATTR);
                 if (!PyType_Check(owner_o)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 assert(type_version != 0);
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (!PyType_Check(owner_o)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 assert(type_version != 0);
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(((PyTypeObject *)owner_o)->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
             if (tstate->interp->eval_frame) {
                 UPDATE_MISS_STATS(LOAD_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_ATTR);
             }
             PyTypeObject *cls = Py_TYPE(owner_o);
             if (FT_ATOMIC_LOAD_UINT_RELAXED(cls->tp_version_tag) != type_version) {
                 UPDATE_MISS_STATS(LOAD_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_ATTR);
             }
             assert(Py_IS_TYPE(getattribute, &PyFunction_Type));
             if (f->func_version != func_version) {
                 UPDATE_MISS_STATS(LOAD_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_ATTR);
             }
             PyCodeObject *code = (PyCodeObject *)f->func_code;
             if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                 UPDATE_MISS_STATS(LOAD_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_ATTR);
             }
             STAT_INC(LOAD_ATTR, hit);
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (attr_o == NULL) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 #ifdef Py_GIL_DISABLED
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (dict != NULL) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (!FT_ATOMIC_LOAD_UINT8(ivs->valid)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (Py_TYPE(owner_o)->tp_getattro != PyModule_Type.tp_getattro) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner_o)->md_dict;
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != dict_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 assert(keys->dk_kind == DICT_KEYS_UNICODE);
                 if (attr_o == NULL) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 #ifdef Py_GIL_DISABLED
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (!FT_ATOMIC_LOAD_UINT8(ivs->valid)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != keys_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if ((code->co_flags & (CO_VARKEYWORDS | CO_VARARGS | CO_OPTIMIZED)) != CO_OPTIMIZED) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 if (code->co_kwonlyargcount) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 if (code->co_argcount != 1) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 if (!_PyThreadState_HasStackSpace(tstate, code->co_framesize)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 STAT_INC(LOAD_ATTR, hit);
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (attr_o == NULL) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 #ifdef Py_GIL_DISABLED
                 if (!increfed) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 #else
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
             }
                 if (dict == NULL) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 PyDictKeysObject *dk = FT_ATOMIC_LOAD_PTR(dict->ma_keys);
                 if (!_Py_IsOwnedByCurrentThread((PyObject *)dict) && !_PyObject_GC_IS_SHARED(dict)) {
                     UPDATE_MISS_STATS(LOAD_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_ATTR);
                 }
                 #endif
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(LOAD_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(LOAD_ATTR);
                     }
                 }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(LOAD_GLOBAL);
                 if (!PyDict_CheckExact(dict)) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 assert(DK_IS_UNICODE(keys));
                 if (!PyDict_CheckExact(dict)) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 assert(DK_IS_UNICODE(keys));
                 if (res_o == NULL) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 #if Py_GIL_DISABLED
                 if (!increfed) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 #else
                 if (!PyDict_CheckExact(dict)) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 PyDictKeysObject *keys = FT_ATOMIC_LOAD_PTR_ACQUIRE(dict->ma_keys);
                 if (FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) != version) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 assert(DK_IS_UNICODE(keys));
                 if (res_o == NULL) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 #if Py_GIL_DISABLED
                 if (!increfed) {
                     UPDATE_MISS_STATS(LOAD_GLOBAL);
                     assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(LOAD_GLOBAL);
                 }
                 #else
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_LoadSuperAttr(global_super_st, class_st, next_instr, load_method);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(LOAD_SUPER_ATTR);
             if (global_super != (PyObject *)&PySuper_Type) {
                 UPDATE_MISS_STATS(LOAD_SUPER_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_SUPER_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_SUPER_ATTR);
             }
             if (!PyType_Check(class)) {
                 UPDATE_MISS_STATS(LOAD_SUPER_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_SUPER_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_SUPER_ATTR);
             }
             STAT_INC(LOAD_SUPER_ATTR, hit);
             if (global_super != (PyObject *)&PySuper_Type) {
                 UPDATE_MISS_STATS(LOAD_SUPER_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_SUPER_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_SUPER_ATTR);
             }
             if (!PyType_Check(class)) {
                 UPDATE_MISS_STATS(LOAD_SUPER_ATTR);
                 assert(_PyOpcode_Deopt[opcode] == (LOAD_SUPER_ATTR));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(LOAD_SUPER_ATTR);
             }
             STAT_INC(LOAD_SUPER_ATTR, hit);
             if (_Py_emscripten_signal_clock == 0) {
                 UPDATE_MISS_STATS(RESUME);
                 assert(_PyOpcode_Deopt[opcode] == (RESUME));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(RESUME);
             }
             _Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
             if (eval_breaker != version) {
                 UPDATE_MISS_STATS(RESUME);
                 assert(_PyOpcode_Deopt[opcode] == (RESUME));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(RESUME);
             }
             #ifdef Py_GIL_DISABLED
                 ((_PyThreadStateImpl *)tstate)->tlbc_index) {
                 UPDATE_MISS_STATS(RESUME);
                 assert(_PyOpcode_Deopt[opcode] == (RESUME));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(RESUME);
             }
             #endif
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_Send(receiver, next_instr);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(SEND);
                 if (tstate->interp->eval_frame) {
                     UPDATE_MISS_STATS(SEND);
                     assert(_PyOpcode_Deopt[opcode] == (SEND));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(SEND);
                 }
             }
                 if (Py_TYPE(gen) != &PyGen_Type && Py_TYPE(gen) != &PyCoro_Type) {
                     UPDATE_MISS_STATS(SEND);
                     assert(_PyOpcode_Deopt[opcode] == (SEND));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(SEND);
                 }
                 if (gen->gi_frame_state >= FRAME_EXECUTING) {
                     UPDATE_MISS_STATS(SEND);
                     assert(_PyOpcode_Deopt[opcode] == (SEND));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(SEND);
                 }
                 STAT_INC(SEND, hit);
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_StoreAttr(owner, next_instr, name);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(STORE_ATTR);
                 if (!LOCK_OBJECT(owner_o)) {
                     UPDATE_MISS_STATS(STORE_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_ATTR);
                 }
                 PyTypeObject *tp = Py_TYPE(owner_o);
                     if (true) {
                         UPDATE_MISS_STATS(STORE_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(STORE_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(STORE_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(STORE_ATTR);
                     }
                 }
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(STORE_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_ATTR);
                 }
             }
                 if (!LOCK_OBJECT(owner_o)) {
                     UPDATE_MISS_STATS(STORE_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_ATTR);
                 }
                 char *addr = (char *)owner_o + index;
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(STORE_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_ATTR);
                 }
             }
                 if (dict == NULL) {
                     UPDATE_MISS_STATS(STORE_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_ATTR);
                 }
                 if (!LOCK_OBJECT(dict)) {
                     UPDATE_MISS_STATS(STORE_ATTR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_ATTR);
                 }
                 assert(PyDict_CheckExact((PyObject *)dict));
                     if (true) {
                         UPDATE_MISS_STATS(STORE_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(STORE_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(STORE_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(STORE_ATTR);
                     }
                 }
                     if (true) {
                         UPDATE_MISS_STATS(STORE_ATTR);
                         assert(_PyOpcode_Deopt[opcode] == (STORE_ATTR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(STORE_ATTR);
                     }
                 }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_StoreSubscr(container, sub, next_instr);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(STORE_SUBSCR);
                 if (!PyDict_CheckExact(o)) {
                     UPDATE_MISS_STATS(STORE_SUBSCR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_SUBSCR);
                 }
             }
                 if (!_PyLong_CheckExactAndCompact(value_o)) {
                     UPDATE_MISS_STATS(STORE_SUBSCR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_SUBSCR);
                 }
             }
                 if (!PyList_CheckExact(o)) {
                     UPDATE_MISS_STATS(STORE_SUBSCR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_SUBSCR);
                 }
             }
                 if (!_PyLong_IsNonNegativeCompact((PyLongObject *)sub)) {
                     UPDATE_MISS_STATS(STORE_SUBSCR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_SUBSCR);
                 }
                 Py_ssize_t index = ((PyLongObject*)sub)->long_value.ob_digit[0];
                 if (!LOCK_OBJECT(list)) {
                     UPDATE_MISS_STATS(STORE_SUBSCR);
                     assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(STORE_SUBSCR);
                 }
                 if (index >= PyList_GET_SIZE(list)) {
                     if (true) {
                         UPDATE_MISS_STATS(STORE_SUBSCR);
                         assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(STORE_SUBSCR);
                     }
                 }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_ToBool(value, next_instr);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(TO_BOOL);
                 if (FT_ATOMIC_LOAD_UINT_RELAXED(tp->tp_version_tag) != type_version) {
                     UPDATE_MISS_STATS(TO_BOOL);
                     assert(_PyOpcode_Deopt[opcode] == (TO_BOOL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(TO_BOOL);
                 }
             }
             if (!PyStackRef_BoolCheck(value)) {
                 UPDATE_MISS_STATS(TO_BOOL);
                 assert(_PyOpcode_Deopt[opcode] == (TO_BOOL));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(TO_BOOL);
             }
             STAT_INC(TO_BOOL, hit);
             if (!PyLong_CheckExact(value_o)) {
                 UPDATE_MISS_STATS(TO_BOOL);
                 assert(_PyOpcode_Deopt[opcode] == (TO_BOOL));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(TO_BOOL);
             }
             STAT_INC(TO_BOOL, hit);
                 if (!PyList_CheckExact(o)) {
                     UPDATE_MISS_STATS(TO_BOOL);
                     assert(_PyOpcode_Deopt[opcode] == (TO_BOOL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(TO_BOOL);
                 }
             }
             if (!PyStackRef_IsNone(value)) {
                 UPDATE_MISS_STATS(TO_BOOL);
                 assert(_PyOpcode_Deopt[opcode] == (TO_BOOL));
-                #if _Py_TIER2
-                tstate->interp->jit_state.specialize_counter++;
-                #endif
                 JUMP_TO_PREDICTED(TO_BOOL);
             }
             STAT_INC(TO_BOOL, hit);
                 if (!PyUnicode_CheckExact(value_o)) {
                     UPDATE_MISS_STATS(TO_BOOL);
                     assert(_PyOpcode_Deopt[opcode] == (TO_BOOL));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(TO_BOOL);
                 }
             }
                     _PyFrame_SetStackPointer(frame, stack_pointer);
                     _Py_Specialize_UnpackSequence(seq, next_instr, oparg);
                     stack_pointer = _PyFrame_GetStackPointer(frame);
+                    #if _Py_TIER2
+                    tstate->interp->jit_state.specialize_counter++;
+                    #endif
                     DISPATCH_SAME_OPARG();
                 }
                 OPCODE_DEFERRED_INC(UNPACK_SEQUENCE);
                 if (!PyList_CheckExact(o)) {
                     UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                     assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                 }
             }
                 if (!LOCK_OBJECT(seq_o)) {
                     UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                     assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                 }
                 if (PyList_GET_SIZE(seq_o) != oparg) {
                     if (true) {
                         UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                         assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                        #if _Py_TIER2
-                        tstate->interp->jit_state.specialize_counter++;
-                        #endif
                         JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                     }
                 }
                 if (!PyTuple_CheckExact(o)) {
                     UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                     assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                 }
             }
                 if (PyTuple_GET_SIZE(seq_o) != oparg) {
                     UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                     assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                 }
                 STAT_INC(UNPACK_SEQUENCE, hit);
                 if (!PyTuple_CheckExact(o)) {
                     UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                     assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                 }
             }
                 if (PyTuple_GET_SIZE(seq_o) != 2) {
                     UPDATE_MISS_STATS(UNPACK_SEQUENCE);
                     assert(_PyOpcode_Deopt[opcode] == (UNPACK_SEQUENCE));
-                    #if _Py_TIER2
-                    tstate->interp->jit_state.specialize_counter++;
-                    #endif
                     JUMP_TO_PREDICTED(UNPACK_SEQUENCE);
                 }
                 STAT_INC(UNPACK_SEQUENCE, hit);
index 31c9995c4ed6b42f977b02124cf0ae55fad034de..0c8202f60f10307c574520c98b9d49de1b0c8243 100644 (file)
@@ -594,7 +594,7 @@ _PyJit_translate_single_bytecode_to_trace(
     int oparg = tstate->interp->jit_state.prev_instr_oparg;
     int opcode = this_instr->op.code;
     // Failed specialization twice in a row. Deopt!
-    if (tstate->interp->jit_state.specialize_counter >= 3) {
+    if (tstate->interp->jit_state.specialize_counter >= 1) {
         opcode = _PyOpcode_Deopt[opcode];
     }
     int rewind_oparg = oparg;
index fed0b4c1643a30acddf76551ccdbe1f0695d125a..5cba378933e9e6c97dc04378e6e2d255ab52607d 100644 (file)
@@ -7,6 +7,7 @@ from analyzer import (
     analysis_error,
     Label,
     CodeSection,
+    Uop,
 )
 from cwriter import CWriter
 from typing import Callable, TextIO, Iterator, Iterable
@@ -129,6 +130,7 @@ class Emitter:
             "INSTRUCTION_SIZE": self.instruction_size,
             "stack_pointer": self.stack_pointer,
             "JUMPBY": self.jumpby,
+            "DISPATCH_SAME_OPARG": self.dispatch_same_oparg,
         }
         self.out = out
         self.labels = labels
@@ -149,6 +151,26 @@ class Emitter:
         self.emit(tkn)
         return False
 
+    def dispatch_same_oparg(
+        self,
+        tkn: Token,
+        tkn_iter: TokenIterator,
+        uop: CodeSection,
+        storage: Storage,
+        inst: Instruction | None,
+    ) -> bool:
+        assert isinstance(uop, Uop)
+        assert "specializing" in uop.annotations, uop.name
+        self.out.start_line()
+        self.emit("#if _Py_TIER2\n")
+        self.emit("tstate->interp->jit_state.specialize_counter++;\n")
+        self.emit("#endif\n")
+        self.emit(tkn)
+        emit_to(self.out, tkn_iter, "SEMI")
+        self.emit(";\n")
+        self.out.start_line()
+        return False
+
     def deopt_if(
         self,
         tkn: Token,
@@ -170,9 +192,6 @@ class Emitter:
         family_name = inst.family.name
         self.emit(f"UPDATE_MISS_STATS({family_name});\n")
         self.emit(f"assert(_PyOpcode_Deopt[opcode] == ({family_name}));\n")
-        self.emit(f"#if _Py_TIER2\n")
-        self.emit(f"tstate->interp->jit_state.specialize_counter++;\n")
-        self.emit(f"#endif\n")
         self.emit(f"JUMP_TO_PREDICTED({self.jump_prefix}{family_name});\n")
         self.emit("}\n")
         return not always_true(first_tkn)