https://github.com/python/cpython/commit/b420f6be53efdf40f552c94f19a7ce85f882b5e2
commit: b420f6be53efdf40f552c94f19a7ce85f882b5e2
branch: main
author: Mark Shannon <[email protected]>
committer: markshannon <[email protected]>
date: 2025-11-18T13:31:48Z
summary:

GH-139109: Support switch/case dispatch with the tracing interpreter. 
(GH-141703)

files:
M .github/workflows/jit.yml
M Include/internal/pycore_magic_number.h
M Include/internal/pycore_opcode_metadata.h
M Include/internal/pycore_optimizer.h
M Include/internal/pycore_uop_ids.h
M Include/opcode_ids.h
M Lib/_opcode_metadata.py
M Python/bytecodes.c
M Python/ceval.c
M Python/ceval_macros.h
M Python/executor_cases.c.h
M Python/generated_cases.c.h
M Python/instrumentation.c
M Python/opcode_targets.h
M Python/optimizer_cases.c.h
M Tools/cases_generator/analyzer.py
M Tools/cases_generator/target_generator.py
M Tools/cases_generator/tier1_generator.py

diff --git a/.github/workflows/jit.yml b/.github/workflows/jit.yml
index 3349eb042425dd..62325250bd368e 100644
--- a/.github/workflows/jit.yml
+++ b/.github/workflows/jit.yml
@@ -57,10 +57,9 @@ jobs:
       fail-fast: false
       matrix:
         target:
-# To re-enable later when we support these.
-#          - i686-pc-windows-msvc/msvc
-#          - x86_64-pc-windows-msvc/msvc
-#          - aarch64-pc-windows-msvc/msvc
+          - i686-pc-windows-msvc/msvc
+          - x86_64-pc-windows-msvc/msvc
+          - aarch64-pc-windows-msvc/msvc
           - x86_64-apple-darwin/clang
           - aarch64-apple-darwin/clang
           - x86_64-unknown-linux-gnu/gcc
@@ -71,16 +70,15 @@ jobs:
         llvm:
           - 21
         include:
-# To re-enable later when we support these.
-#          - target: i686-pc-windows-msvc/msvc
-#            architecture: Win32
-#            runner: windows-2022
-#          - target: x86_64-pc-windows-msvc/msvc
-#            architecture: x64
-#            runner: windows-2022
-#          - target: aarch64-pc-windows-msvc/msvc
-#            architecture: ARM64
-#            runner: windows-11-arm
+          - target: i686-pc-windows-msvc/msvc
+            architecture: Win32
+            runner: windows-2022
+          - target: x86_64-pc-windows-msvc/msvc
+            architecture: x64
+            runner: windows-2022
+          - target: aarch64-pc-windows-msvc/msvc
+            architecture: ARM64
+            runner: windows-11-arm
           - target: x86_64-apple-darwin/clang
             architecture: x86_64
             runner: macos-15-intel
diff --git a/Include/internal/pycore_magic_number.h 
b/Include/internal/pycore_magic_number.h
index 7ec7bd1c695516..2fb46a6df50bb3 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -286,6 +286,7 @@ Known values:
     Python 3.15a1 3653 (Fix handling of opcodes that may leave operands on the 
stack when optimizing LOAD_FAST)
     Python 3.15a1 3654 (Fix missing exception handlers in logical expression)
     Python 3.15a1 3655 (Fix miscompilation of some module-level annotations)
+    Python 3.15a1 3656 (Add TRACE_RECORD instruction, for platforms with 
switch based interpreter)
 
 
     Python 3.16 will start with 3700
@@ -299,7 +300,7 @@ PC/launcher.c must also be updated.
 
 */
 
-#define PYC_MAGIC_NUMBER 3655
+#define PYC_MAGIC_NUMBER 3656
 /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
    (little-endian) and then appending b'\r\n'. */
 #define PYC_MAGIC_NUMBER_TOKEN \
diff --git a/Include/internal/pycore_opcode_metadata.h 
b/Include/internal/pycore_opcode_metadata.h
index 548627dc7982ec..cca88818c575df 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -488,6 +488,8 @@ int _PyOpcode_num_popped(int opcode, int oparg)  {
             return 1;
         case TO_BOOL_STR:
             return 1;
+        case TRACE_RECORD:
+            return 0;
         case UNARY_INVERT:
             return 1;
         case UNARY_NEGATIVE:
@@ -971,6 +973,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg)  {
             return 1;
         case TO_BOOL_STR:
             return 1;
+        case TRACE_RECORD:
+            return 0;
         case UNARY_INVERT:
             return 1;
         case UNARY_NEGATIVE:
@@ -1287,6 +1291,7 @@ const struct opcode_metadata 
_PyOpcode_opcode_metadata[267] = {
     [TO_BOOL_LIST] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG 
},
     [TO_BOOL_NONE] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG },
     [TO_BOOL_STR] = { true, INSTR_FMT_IXC00, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG 
},
+    [TRACE_RECORD] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | 
HAS_ESCAPES_FLAG },
     [UNARY_INVERT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
     [UNARY_NEGATIVE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG 
},
     [UNARY_NOT] = { true, INSTR_FMT_IX, HAS_PURE_FLAG },
@@ -1738,6 +1743,7 @@ const char *_PyOpcode_OpName[267] = {
     [TO_BOOL_LIST] = "TO_BOOL_LIST",
     [TO_BOOL_NONE] = "TO_BOOL_NONE",
     [TO_BOOL_STR] = "TO_BOOL_STR",
+    [TRACE_RECORD] = "TRACE_RECORD",
     [UNARY_INVERT] = "UNARY_INVERT",
     [UNARY_NEGATIVE] = "UNARY_NEGATIVE",
     [UNARY_NOT] = "UNARY_NOT",
@@ -1809,7 +1815,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
     [230] = 230,
     [231] = 231,
     [232] = 232,
-    [233] = 233,
     [BINARY_OP] = BINARY_OP,
     [BINARY_OP_ADD_FLOAT] = BINARY_OP,
     [BINARY_OP_ADD_INT] = BINARY_OP,
@@ -2025,6 +2030,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
     [TO_BOOL_LIST] = TO_BOOL,
     [TO_BOOL_NONE] = TO_BOOL,
     [TO_BOOL_STR] = TO_BOOL,
+    [TRACE_RECORD] = TRACE_RECORD,
     [UNARY_INVERT] = UNARY_INVERT,
     [UNARY_NEGATIVE] = UNARY_NEGATIVE,
     [UNARY_NOT] = UNARY_NOT,
@@ -2070,7 +2076,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
     case 230: \
     case 231: \
     case 232: \
-    case 233: \
         ;
 struct pseudo_targets {
     uint8_t as_sequence;
diff --git a/Include/internal/pycore_optimizer.h 
b/Include/internal/pycore_optimizer.h
index 0307a174e77346..e7177552cf666e 100644
--- a/Include/internal/pycore_optimizer.h
+++ b/Include/internal/pycore_optimizer.h
@@ -364,7 +364,7 @@ extern void 
_Py_ClearExecutorDeletionList(PyInterpreterState *interp);
 
 int _PyJit_translate_single_bytecode_to_trace(PyThreadState *tstate, 
_PyInterpreterFrame *frame, _Py_CODEUNIT *next_instr, int stop_tracing_opcode);
 
-int
+PyAPI_FUNC(int)
 _PyJit_TryInitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame,
     _Py_CODEUNIT *curr_instr, _Py_CODEUNIT *start_instr,
     _Py_CODEUNIT *close_loop_instr, int curr_stackdepth, int chain_depth, 
_PyExitData *exit,
diff --git a/Include/internal/pycore_uop_ids.h 
b/Include/internal/pycore_uop_ids.h
index 7a33a5b84fd21a..c38f28f9db161b 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -352,6 +352,7 @@ extern "C" {
 #define _TO_BOOL_LIST 550
 #define _TO_BOOL_NONE TO_BOOL_NONE
 #define _TO_BOOL_STR 551
+#define _TRACE_RECORD TRACE_RECORD
 #define _UNARY_INVERT UNARY_INVERT
 #define _UNARY_NEGATIVE UNARY_NEGATIVE
 #define _UNARY_NOT UNARY_NOT
diff --git a/Include/opcode_ids.h b/Include/opcode_ids.h
index 1d5c74adefcd35..0d066c169019a7 100644
--- a/Include/opcode_ids.h
+++ b/Include/opcode_ids.h
@@ -213,28 +213,29 @@ extern "C" {
 #define UNPACK_SEQUENCE_LIST                   207
 #define UNPACK_SEQUENCE_TUPLE                  208
 #define UNPACK_SEQUENCE_TWO_TUPLE              209
-#define INSTRUMENTED_END_FOR                   234
-#define INSTRUMENTED_POP_ITER                  235
-#define INSTRUMENTED_END_SEND                  236
-#define INSTRUMENTED_FOR_ITER                  237
-#define INSTRUMENTED_INSTRUCTION               238
-#define INSTRUMENTED_JUMP_FORWARD              239
-#define INSTRUMENTED_NOT_TAKEN                 240
-#define INSTRUMENTED_POP_JUMP_IF_TRUE          241
-#define INSTRUMENTED_POP_JUMP_IF_FALSE         242
-#define INSTRUMENTED_POP_JUMP_IF_NONE          243
-#define INSTRUMENTED_POP_JUMP_IF_NOT_NONE      244
-#define INSTRUMENTED_RESUME                    245
-#define INSTRUMENTED_RETURN_VALUE              246
-#define INSTRUMENTED_YIELD_VALUE               247
-#define INSTRUMENTED_END_ASYNC_FOR             248
-#define INSTRUMENTED_LOAD_SUPER_ATTR           249
-#define INSTRUMENTED_CALL                      250
-#define INSTRUMENTED_CALL_KW                   251
-#define INSTRUMENTED_CALL_FUNCTION_EX          252
-#define INSTRUMENTED_JUMP_BACKWARD             253
-#define INSTRUMENTED_LINE                      254
-#define ENTER_EXECUTOR                         255
+#define INSTRUMENTED_END_FOR                   233
+#define INSTRUMENTED_POP_ITER                  234
+#define INSTRUMENTED_END_SEND                  235
+#define INSTRUMENTED_FOR_ITER                  236
+#define INSTRUMENTED_INSTRUCTION               237
+#define INSTRUMENTED_JUMP_FORWARD              238
+#define INSTRUMENTED_NOT_TAKEN                 239
+#define INSTRUMENTED_POP_JUMP_IF_TRUE          240
+#define INSTRUMENTED_POP_JUMP_IF_FALSE         241
+#define INSTRUMENTED_POP_JUMP_IF_NONE          242
+#define INSTRUMENTED_POP_JUMP_IF_NOT_NONE      243
+#define INSTRUMENTED_RESUME                    244
+#define INSTRUMENTED_RETURN_VALUE              245
+#define INSTRUMENTED_YIELD_VALUE               246
+#define INSTRUMENTED_END_ASYNC_FOR             247
+#define INSTRUMENTED_LOAD_SUPER_ATTR           248
+#define INSTRUMENTED_CALL                      249
+#define INSTRUMENTED_CALL_KW                   250
+#define INSTRUMENTED_CALL_FUNCTION_EX          251
+#define INSTRUMENTED_JUMP_BACKWARD             252
+#define INSTRUMENTED_LINE                      253
+#define ENTER_EXECUTOR                         254
+#define TRACE_RECORD                           255
 #define ANNOTATIONS_PLACEHOLDER                256
 #define JUMP                                   257
 #define JUMP_IF_FALSE                          258
@@ -249,7 +250,7 @@ extern "C" {
 
 #define HAVE_ARGUMENT                           43
 #define MIN_SPECIALIZED_OPCODE                 129
-#define MIN_INSTRUMENTED_OPCODE                234
+#define MIN_INSTRUMENTED_OPCODE                233
 
 #ifdef __cplusplus
 }
diff --git a/Lib/_opcode_metadata.py b/Lib/_opcode_metadata.py
index f168d169a32948..e681cb17e43e04 100644
--- a/Lib/_opcode_metadata.py
+++ b/Lib/_opcode_metadata.py
@@ -208,8 +208,9 @@
     'CACHE': 0,
     'RESERVED': 17,
     'RESUME': 128,
-    'INSTRUMENTED_LINE': 254,
-    'ENTER_EXECUTOR': 255,
+    'INSTRUMENTED_LINE': 253,
+    'ENTER_EXECUTOR': 254,
+    'TRACE_RECORD': 255,
     'BINARY_SLICE': 1,
     'BUILD_TEMPLATE': 2,
     'CALL_FUNCTION_EX': 4,
@@ -328,26 +329,26 @@
     'UNPACK_EX': 118,
     'UNPACK_SEQUENCE': 119,
     'YIELD_VALUE': 120,
-    'INSTRUMENTED_END_FOR': 234,
-    'INSTRUMENTED_POP_ITER': 235,
-    'INSTRUMENTED_END_SEND': 236,
-    'INSTRUMENTED_FOR_ITER': 237,
-    'INSTRUMENTED_INSTRUCTION': 238,
-    'INSTRUMENTED_JUMP_FORWARD': 239,
-    'INSTRUMENTED_NOT_TAKEN': 240,
-    'INSTRUMENTED_POP_JUMP_IF_TRUE': 241,
-    'INSTRUMENTED_POP_JUMP_IF_FALSE': 242,
-    'INSTRUMENTED_POP_JUMP_IF_NONE': 243,
-    'INSTRUMENTED_POP_JUMP_IF_NOT_NONE': 244,
-    'INSTRUMENTED_RESUME': 245,
-    'INSTRUMENTED_RETURN_VALUE': 246,
-    'INSTRUMENTED_YIELD_VALUE': 247,
-    'INSTRUMENTED_END_ASYNC_FOR': 248,
-    'INSTRUMENTED_LOAD_SUPER_ATTR': 249,
-    'INSTRUMENTED_CALL': 250,
-    'INSTRUMENTED_CALL_KW': 251,
-    'INSTRUMENTED_CALL_FUNCTION_EX': 252,
-    'INSTRUMENTED_JUMP_BACKWARD': 253,
+    'INSTRUMENTED_END_FOR': 233,
+    'INSTRUMENTED_POP_ITER': 234,
+    'INSTRUMENTED_END_SEND': 235,
+    'INSTRUMENTED_FOR_ITER': 236,
+    'INSTRUMENTED_INSTRUCTION': 237,
+    'INSTRUMENTED_JUMP_FORWARD': 238,
+    'INSTRUMENTED_NOT_TAKEN': 239,
+    'INSTRUMENTED_POP_JUMP_IF_TRUE': 240,
+    'INSTRUMENTED_POP_JUMP_IF_FALSE': 241,
+    'INSTRUMENTED_POP_JUMP_IF_NONE': 242,
+    'INSTRUMENTED_POP_JUMP_IF_NOT_NONE': 243,
+    'INSTRUMENTED_RESUME': 244,
+    'INSTRUMENTED_RETURN_VALUE': 245,
+    'INSTRUMENTED_YIELD_VALUE': 246,
+    'INSTRUMENTED_END_ASYNC_FOR': 247,
+    'INSTRUMENTED_LOAD_SUPER_ATTR': 248,
+    'INSTRUMENTED_CALL': 249,
+    'INSTRUMENTED_CALL_KW': 250,
+    'INSTRUMENTED_CALL_FUNCTION_EX': 251,
+    'INSTRUMENTED_JUMP_BACKWARD': 252,
     'ANNOTATIONS_PLACEHOLDER': 256,
     'JUMP': 257,
     'JUMP_IF_FALSE': 258,
@@ -362,4 +363,4 @@
 }
 
 HAVE_ARGUMENT = 43
-MIN_INSTRUMENTED_OPCODE = 234
+MIN_INSTRUMENTED_OPCODE = 233
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 565eaa7a599175..12ee506e4f2bc4 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -5636,10 +5636,12 @@ dummy_func(
             DISPATCH();
         }
 
-        label(record_previous_inst) {
+        inst(TRACE_RECORD, (--)) {
 #if _Py_TIER2
             assert(IS_JIT_TRACING());
-            int opcode = next_instr->op.code;
+            next_instr = this_instr;
+            frame->instr_ptr = prev_instr;
+            opcode = next_instr->op.code;
             bool stop_tracing = (opcode == WITH_EXCEPT_START ||
                 opcode == RERAISE || opcode == CLEANUP_THROW ||
                 opcode == PUSH_EXC_INFO || opcode == INTERPRETER_EXIT);
@@ -5675,7 +5677,8 @@ dummy_func(
             }
             DISPATCH_GOTO_NON_TRACING();
 #else
-            Py_FatalError("JIT label executed in non-jit build.");
+            (void)prev_instr;
+            Py_FatalError("JIT instruction executed in non-jit build.");
 #endif
         }
 
diff --git a/Python/ceval.c b/Python/ceval.c
index 25294ebd993f6c..14fef42ea967d6 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1179,6 +1179,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, 
_PyInterpreterFrame *frame, int
     uint8_t opcode;    /* Current opcode */
     int oparg;         /* Current opcode argument, if any */
     assert(tstate->current_frame == NULL || 
tstate->current_frame->stackpointer != NULL);
+#if !USE_COMPUTED_GOTOS
+    uint8_t tracing_mode = 0;
+    uint8_t dispatch_code;
+#endif
 #endif
     _PyEntryFrame entry;
 
diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h
index 05a2760671e847..c30638c221a03f 100644
--- a/Python/ceval_macros.h
+++ b/Python/ceval_macros.h
@@ -134,8 +134,8 @@
 #  define LABEL(name) name:
 #else
 #  define TARGET(op) case op: TARGET_##op:
-#  define DISPATCH_GOTO() goto dispatch_opcode
-#  define DISPATCH_GOTO_NON_TRACING() goto dispatch_opcode
+#  define DISPATCH_GOTO() dispatch_code = opcode | tracing_mode ; goto 
dispatch_opcode
+#  define DISPATCH_GOTO_NON_TRACING() dispatch_code = opcode; goto 
dispatch_opcode
 #  define JUMP_TO_LABEL(name) goto name;
 #  define JUMP_TO_PREDICTED(name) goto PREDICTED_##name;
 #  define LABEL(name) name:
@@ -148,9 +148,9 @@
 #  define LEAVE_TRACING() \
     DISPATCH_TABLE_VAR = DISPATCH_TABLE;
 #else
-#  define IS_JIT_TRACING() (0)
-#  define ENTER_TRACING()
-#  define LEAVE_TRACING()
+#  define IS_JIT_TRACING() (tracing_mode != 0)
+#  define ENTER_TRACING() tracing_mode = 255
+#  define LEAVE_TRACING() tracing_mode = 0
 #endif
 
 /* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 6796abf84ac5f4..e1edd20b778d27 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -7579,5 +7579,7 @@
             break;
         }
 
+        /* _TRACE_RECORD is not a viable micro-op for tier 2 because it uses 
the 'this_instr' variable */
+
 
 #undef TIER_TWO
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 0d4678df68ce2d..b83b7c528e9150 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -11,7 +11,7 @@
 #if !_Py_TAIL_CALL_INTERP
 #if !USE_COMPUTED_GOTOS
     dispatch_opcode:
-        switch (opcode)
+        switch (dispatch_code)
 #endif
         {
 #endif /* _Py_TAIL_CALL_INTERP */
@@ -11683,6 +11683,68 @@
             DISPATCH();
         }
 
+        TARGET(TRACE_RECORD) {
+            #if _Py_TAIL_CALL_INTERP
+            int opcode = TRACE_RECORD;
+            (void)(opcode);
+            #endif
+            _Py_CODEUNIT* const prev_instr = frame->instr_ptr;
+            _Py_CODEUNIT* const this_instr = next_instr;
+            (void)this_instr;
+            frame->instr_ptr = next_instr;
+            next_instr += 1;
+            INSTRUCTION_STATS(TRACE_RECORD);
+            opcode = TRACE_RECORD;
+            #if _Py_TIER2
+            assert(IS_JIT_TRACING());
+            next_instr = this_instr;
+            frame->instr_ptr = prev_instr;
+            opcode = next_instr->op.code;
+            bool stop_tracing = (opcode == WITH_EXCEPT_START ||
+                                 opcode == RERAISE || opcode == CLEANUP_THROW 
||
+                                 opcode == PUSH_EXC_INFO || opcode == 
INTERPRETER_EXIT);
+            _PyFrame_SetStackPointer(frame, stack_pointer);
+            int full = !_PyJit_translate_single_bytecode_to_trace(tstate, 
frame, next_instr, stop_tracing ? _DEOPT : 0);
+            stack_pointer = _PyFrame_GetStackPointer(frame);
+            if (full) {
+                LEAVE_TRACING();
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                int err = stop_tracing_and_jit(tstate, frame);
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+                if (err < 0) {
+                    JUMP_TO_LABEL(error);
+                }
+                DISPATCH_GOTO_NON_TRACING();
+            }
+            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
+            if ((_tstate->jit_tracer_state.prev_state.instr->op.code == 
CALL_LIST_APPEND &&
+                 opcode == POP_TOP) ||
+                (_tstate->jit_tracer_state.prev_state.instr->op.code == 
BINARY_OP_INPLACE_ADD_UNICODE &&
+                 opcode == STORE_FAST)) {
+                _tstate->jit_tracer_state.prev_state.instr_is_super = true;
+            }
+            else {
+                _tstate->jit_tracer_state.prev_state.instr = next_instr;
+            }
+            PyObject *prev_code = 
PyStackRef_AsPyObjectBorrow(frame->f_executable);
+            if (_tstate->jit_tracer_state.prev_state.instr_code != 
(PyCodeObject *)prev_code) {
+                _PyFrame_SetStackPointer(frame, stack_pointer);
+                Py_SETREF(_tstate->jit_tracer_state.prev_state.instr_code, 
(PyCodeObject*)Py_NewRef((prev_code)));
+                stack_pointer = _PyFrame_GetStackPointer(frame);
+            }
+            _tstate->jit_tracer_state.prev_state.instr_frame = frame;
+            _tstate->jit_tracer_state.prev_state.instr_oparg = oparg;
+            _tstate->jit_tracer_state.prev_state.instr_stacklevel = 
PyStackRef_IsNone(frame->f_executable) ? 2 : STACK_LEVEL();
+            if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
+                (&next_instr[1])->counter = trigger_backoff_counter();
+            }
+            DISPATCH_GOTO_NON_TRACING();
+            #else
+            (void)prev_instr;
+            Py_FatalError("JIT instruction executed in non-jit build.");
+            #endif
+        }
+
         TARGET(UNARY_INVERT) {
             #if _Py_TAIL_CALL_INTERP
             int opcode = UNARY_INVERT;
@@ -12254,55 +12316,6 @@ JUMP_TO_LABEL(error);
             DISPATCH();
         }
 
-        LABEL(record_previous_inst)
-        {
-            #if _Py_TIER2
-            assert(IS_JIT_TRACING());
-            int opcode = next_instr->op.code;
-            bool stop_tracing = (opcode == WITH_EXCEPT_START ||
-                                 opcode == RERAISE || opcode == CLEANUP_THROW 
||
-                                 opcode == PUSH_EXC_INFO || opcode == 
INTERPRETER_EXIT);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            int full = !_PyJit_translate_single_bytecode_to_trace(tstate, 
frame, next_instr, stop_tracing ? _DEOPT : 0);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
-            if (full) {
-                LEAVE_TRACING();
-                _PyFrame_SetStackPointer(frame, stack_pointer);
-                int err = stop_tracing_and_jit(tstate, frame);
-                stack_pointer = _PyFrame_GetStackPointer(frame);
-                if (err < 0) {
-                    JUMP_TO_LABEL(error);
-                }
-                DISPATCH_GOTO_NON_TRACING();
-            }
-            _PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
-            if ((_tstate->jit_tracer_state.prev_state.instr->op.code == 
CALL_LIST_APPEND &&
-                 opcode == POP_TOP) ||
-                (_tstate->jit_tracer_state.prev_state.instr->op.code == 
BINARY_OP_INPLACE_ADD_UNICODE &&
-                 opcode == STORE_FAST)) {
-                _tstate->jit_tracer_state.prev_state.instr_is_super = true;
-            }
-            else {
-                _tstate->jit_tracer_state.prev_state.instr = next_instr;
-            }
-            PyObject *prev_code = 
PyStackRef_AsPyObjectBorrow(frame->f_executable);
-            if (_tstate->jit_tracer_state.prev_state.instr_code != 
(PyCodeObject *)prev_code) {
-                _PyFrame_SetStackPointer(frame, stack_pointer);
-                Py_SETREF(_tstate->jit_tracer_state.prev_state.instr_code, 
(PyCodeObject*)Py_NewRef((prev_code)));
-                stack_pointer = _PyFrame_GetStackPointer(frame);
-            }
-            _tstate->jit_tracer_state.prev_state.instr_frame = frame;
-            _tstate->jit_tracer_state.prev_state.instr_oparg = oparg;
-            _tstate->jit_tracer_state.prev_state.instr_stacklevel = 
PyStackRef_IsNone(frame->f_executable) ? 2 : STACK_LEVEL();
-            if (_PyOpcode_Caches[_PyOpcode_Deopt[opcode]]) {
-                (&next_instr[1])->counter = trigger_backoff_counter();
-            }
-            DISPATCH_GOTO_NON_TRACING();
-            #else
-            Py_FatalError("JIT label executed in non-jit build.");
-            #endif
-        }
-
         LABEL(stop_tracing)
         {
             #if _Py_TIER2
diff --git a/Python/instrumentation.c b/Python/instrumentation.c
index 81e46a331e0b9e..72b7433022fdea 100644
--- a/Python/instrumentation.c
+++ b/Python/instrumentation.c
@@ -191,7 +191,7 @@ is_instrumented(int opcode)
 {
     assert(opcode != 0);
     assert(opcode != RESERVED);
-    return opcode != ENTER_EXECUTOR && opcode >= MIN_INSTRUMENTED_OPCODE;
+    return opcode < ENTER_EXECUTOR && opcode >= MIN_INSTRUMENTED_OPCODE;
 }
 
 #ifndef NDEBUG
@@ -526,7 +526,7 @@ valid_opcode(int opcode)
     if (IS_VALID_OPCODE(opcode) &&
         opcode != CACHE &&
         opcode != RESERVED &&
-        opcode < 255)
+        opcode < 254)
     {
        return true;
     }
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index 1b9196503b570b..b2fa7d01e8f6c2 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -233,7 +233,6 @@ static void *opcode_targets_table[256] = {
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
-    &&_unknown_opcode,
     &&TARGET_INSTRUMENTED_END_FOR,
     &&TARGET_INSTRUMENTED_POP_ITER,
     &&TARGET_INSTRUMENTED_END_SEND,
@@ -256,220 +255,220 @@ static void *opcode_targets_table[256] = {
     &&TARGET_INSTRUMENTED_JUMP_BACKWARD,
     &&TARGET_INSTRUMENTED_LINE,
     &&TARGET_ENTER_EXECUTOR,
+    &&TARGET_TRACE_RECORD,
 };
 #if _Py_TIER2
 static void *opcode_tracing_targets_table[256] = {
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&_unknown_opcode,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
     &&_unknown_opcode,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
@@ -493,28 +492,29 @@ static void *opcode_tracing_targets_table[256] = {
     &&_unknown_opcode,
     &&_unknown_opcode,
     &&_unknown_opcode,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
-    &&record_previous_inst,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
+    &&TARGET_TRACE_RECORD,
 };
 #endif
 #else /* _Py_TAIL_CALL_INTERP */
@@ -528,7 +528,6 @@ Py_PRESERVE_NONE_CC static PyObject 
*_TAIL_CALL_error(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject 
*_TAIL_CALL_exception_unwind(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_exit_unwind(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_start_frame(TAIL_CALL_PARAMS);
-Py_PRESERVE_NONE_CC static PyObject 
*_TAIL_CALL_record_previous_inst(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_stop_tracing(TAIL_CALL_PARAMS);
 
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_BINARY_OP(TAIL_CALL_PARAMS);
@@ -746,6 +745,7 @@ Py_PRESERVE_NONE_CC static PyObject 
*_TAIL_CALL_TO_BOOL_INT(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_TO_BOOL_LIST(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_TO_BOOL_NONE(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_TO_BOOL_STR(TAIL_CALL_PARAMS);
+Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_TRACE_RECORD(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_UNARY_INVERT(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject 
*_TAIL_CALL_UNARY_NEGATIVE(TAIL_CALL_PARAMS);
 Py_PRESERVE_NONE_CC static PyObject *_TAIL_CALL_UNARY_NOT(TAIL_CALL_PARAMS);
@@ -983,6 +983,7 @@ static py_tail_call_funcptr 
instruction_funcptr_handler_table[256] = {
     [TO_BOOL_LIST] = _TAIL_CALL_TO_BOOL_LIST,
     [TO_BOOL_NONE] = _TAIL_CALL_TO_BOOL_NONE,
     [TO_BOOL_STR] = _TAIL_CALL_TO_BOOL_STR,
+    [TRACE_RECORD] = _TAIL_CALL_TRACE_RECORD,
     [UNARY_INVERT] = _TAIL_CALL_UNARY_INVERT,
     [UNARY_NEGATIVE] = _TAIL_CALL_UNARY_NEGATIVE,
     [UNARY_NOT] = _TAIL_CALL_UNARY_NOT,
@@ -1023,234 +1024,234 @@ static py_tail_call_funcptr 
instruction_funcptr_handler_table[256] = {
     [230] = _TAIL_CALL_UNKNOWN_OPCODE,
     [231] = _TAIL_CALL_UNKNOWN_OPCODE,
     [232] = _TAIL_CALL_UNKNOWN_OPCODE,
-    [233] = _TAIL_CALL_UNKNOWN_OPCODE,
 };
 static py_tail_call_funcptr instruction_funcptr_tracing_table[256] = {
-    [BINARY_OP] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_ADD_FLOAT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_ADD_INT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_ADD_UNICODE] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_EXTEND] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_INPLACE_ADD_UNICODE] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_MULTIPLY_FLOAT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_MULTIPLY_INT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBSCR_DICT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBSCR_GETITEM] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBSCR_LIST_INT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBSCR_LIST_SLICE] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBSCR_STR_INT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBSCR_TUPLE_INT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBTRACT_FLOAT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_OP_SUBTRACT_INT] = _TAIL_CALL_record_previous_inst,
-    [BINARY_SLICE] = _TAIL_CALL_record_previous_inst,
-    [BUILD_INTERPOLATION] = _TAIL_CALL_record_previous_inst,
-    [BUILD_LIST] = _TAIL_CALL_record_previous_inst,
-    [BUILD_MAP] = _TAIL_CALL_record_previous_inst,
-    [BUILD_SET] = _TAIL_CALL_record_previous_inst,
-    [BUILD_SLICE] = _TAIL_CALL_record_previous_inst,
-    [BUILD_STRING] = _TAIL_CALL_record_previous_inst,
-    [BUILD_TEMPLATE] = _TAIL_CALL_record_previous_inst,
-    [BUILD_TUPLE] = _TAIL_CALL_record_previous_inst,
-    [CACHE] = _TAIL_CALL_record_previous_inst,
-    [CALL] = _TAIL_CALL_record_previous_inst,
-    [CALL_ALLOC_AND_ENTER_INIT] = _TAIL_CALL_record_previous_inst,
-    [CALL_BOUND_METHOD_EXACT_ARGS] = _TAIL_CALL_record_previous_inst,
-    [CALL_BOUND_METHOD_GENERAL] = _TAIL_CALL_record_previous_inst,
-    [CALL_BUILTIN_CLASS] = _TAIL_CALL_record_previous_inst,
-    [CALL_BUILTIN_FAST] = _TAIL_CALL_record_previous_inst,
-    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = _TAIL_CALL_record_previous_inst,
-    [CALL_BUILTIN_O] = _TAIL_CALL_record_previous_inst,
-    [CALL_FUNCTION_EX] = _TAIL_CALL_record_previous_inst,
-    [CALL_INTRINSIC_1] = _TAIL_CALL_record_previous_inst,
-    [CALL_INTRINSIC_2] = _TAIL_CALL_record_previous_inst,
-    [CALL_ISINSTANCE] = _TAIL_CALL_record_previous_inst,
-    [CALL_KW] = _TAIL_CALL_record_previous_inst,
-    [CALL_KW_BOUND_METHOD] = _TAIL_CALL_record_previous_inst,
-    [CALL_KW_NON_PY] = _TAIL_CALL_record_previous_inst,
-    [CALL_KW_PY] = _TAIL_CALL_record_previous_inst,
-    [CALL_LEN] = _TAIL_CALL_record_previous_inst,
-    [CALL_LIST_APPEND] = _TAIL_CALL_record_previous_inst,
-    [CALL_METHOD_DESCRIPTOR_FAST] = _TAIL_CALL_record_previous_inst,
-    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = 
_TAIL_CALL_record_previous_inst,
-    [CALL_METHOD_DESCRIPTOR_NOARGS] = _TAIL_CALL_record_previous_inst,
-    [CALL_METHOD_DESCRIPTOR_O] = _TAIL_CALL_record_previous_inst,
-    [CALL_NON_PY_GENERAL] = _TAIL_CALL_record_previous_inst,
-    [CALL_PY_EXACT_ARGS] = _TAIL_CALL_record_previous_inst,
-    [CALL_PY_GENERAL] = _TAIL_CALL_record_previous_inst,
-    [CALL_STR_1] = _TAIL_CALL_record_previous_inst,
-    [CALL_TUPLE_1] = _TAIL_CALL_record_previous_inst,
-    [CALL_TYPE_1] = _TAIL_CALL_record_previous_inst,
-    [CHECK_EG_MATCH] = _TAIL_CALL_record_previous_inst,
-    [CHECK_EXC_MATCH] = _TAIL_CALL_record_previous_inst,
-    [CLEANUP_THROW] = _TAIL_CALL_record_previous_inst,
-    [COMPARE_OP] = _TAIL_CALL_record_previous_inst,
-    [COMPARE_OP_FLOAT] = _TAIL_CALL_record_previous_inst,
-    [COMPARE_OP_INT] = _TAIL_CALL_record_previous_inst,
-    [COMPARE_OP_STR] = _TAIL_CALL_record_previous_inst,
-    [CONTAINS_OP] = _TAIL_CALL_record_previous_inst,
-    [CONTAINS_OP_DICT] = _TAIL_CALL_record_previous_inst,
-    [CONTAINS_OP_SET] = _TAIL_CALL_record_previous_inst,
-    [CONVERT_VALUE] = _TAIL_CALL_record_previous_inst,
-    [COPY] = _TAIL_CALL_record_previous_inst,
-    [COPY_FREE_VARS] = _TAIL_CALL_record_previous_inst,
-    [DELETE_ATTR] = _TAIL_CALL_record_previous_inst,
-    [DELETE_DEREF] = _TAIL_CALL_record_previous_inst,
-    [DELETE_FAST] = _TAIL_CALL_record_previous_inst,
-    [DELETE_GLOBAL] = _TAIL_CALL_record_previous_inst,
-    [DELETE_NAME] = _TAIL_CALL_record_previous_inst,
-    [DELETE_SUBSCR] = _TAIL_CALL_record_previous_inst,
-    [DICT_MERGE] = _TAIL_CALL_record_previous_inst,
-    [DICT_UPDATE] = _TAIL_CALL_record_previous_inst,
-    [END_ASYNC_FOR] = _TAIL_CALL_record_previous_inst,
-    [END_FOR] = _TAIL_CALL_record_previous_inst,
-    [END_SEND] = _TAIL_CALL_record_previous_inst,
-    [ENTER_EXECUTOR] = _TAIL_CALL_record_previous_inst,
-    [EXIT_INIT_CHECK] = _TAIL_CALL_record_previous_inst,
-    [EXTENDED_ARG] = _TAIL_CALL_record_previous_inst,
-    [FORMAT_SIMPLE] = _TAIL_CALL_record_previous_inst,
-    [FORMAT_WITH_SPEC] = _TAIL_CALL_record_previous_inst,
-    [FOR_ITER] = _TAIL_CALL_record_previous_inst,
-    [FOR_ITER_GEN] = _TAIL_CALL_record_previous_inst,
-    [FOR_ITER_LIST] = _TAIL_CALL_record_previous_inst,
-    [FOR_ITER_RANGE] = _TAIL_CALL_record_previous_inst,
-    [FOR_ITER_TUPLE] = _TAIL_CALL_record_previous_inst,
-    [GET_AITER] = _TAIL_CALL_record_previous_inst,
-    [GET_ANEXT] = _TAIL_CALL_record_previous_inst,
-    [GET_AWAITABLE] = _TAIL_CALL_record_previous_inst,
-    [GET_ITER] = _TAIL_CALL_record_previous_inst,
-    [GET_LEN] = _TAIL_CALL_record_previous_inst,
-    [GET_YIELD_FROM_ITER] = _TAIL_CALL_record_previous_inst,
-    [IMPORT_FROM] = _TAIL_CALL_record_previous_inst,
-    [IMPORT_NAME] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_CALL] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_CALL_FUNCTION_EX] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_CALL_KW] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_END_ASYNC_FOR] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_END_FOR] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_END_SEND] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_FOR_ITER] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_INSTRUCTION] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_JUMP_BACKWARD] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_JUMP_FORWARD] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_LINE] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_LOAD_SUPER_ATTR] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_NOT_TAKEN] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_POP_ITER] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_POP_JUMP_IF_FALSE] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_POP_JUMP_IF_NONE] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_POP_JUMP_IF_TRUE] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_RESUME] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_RETURN_VALUE] = _TAIL_CALL_record_previous_inst,
-    [INSTRUMENTED_YIELD_VALUE] = _TAIL_CALL_record_previous_inst,
-    [INTERPRETER_EXIT] = _TAIL_CALL_record_previous_inst,
-    [IS_OP] = _TAIL_CALL_record_previous_inst,
-    [JUMP_BACKWARD] = _TAIL_CALL_record_previous_inst,
-    [JUMP_BACKWARD_JIT] = _TAIL_CALL_record_previous_inst,
-    [JUMP_BACKWARD_NO_INTERRUPT] = _TAIL_CALL_record_previous_inst,
-    [JUMP_BACKWARD_NO_JIT] = _TAIL_CALL_record_previous_inst,
-    [JUMP_FORWARD] = _TAIL_CALL_record_previous_inst,
-    [LIST_APPEND] = _TAIL_CALL_record_previous_inst,
-    [LIST_EXTEND] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_CLASS] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_INSTANCE_VALUE] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_METHOD_LAZY_DICT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_METHOD_NO_DICT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_METHOD_WITH_VALUES] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_MODULE] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_PROPERTY] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_SLOT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_ATTR_WITH_HINT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_BUILD_CLASS] = _TAIL_CALL_record_previous_inst,
-    [LOAD_COMMON_CONSTANT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_CONST] = _TAIL_CALL_record_previous_inst,
-    [LOAD_DEREF] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FAST] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FAST_AND_CLEAR] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FAST_BORROW] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FAST_BORROW_LOAD_FAST_BORROW] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FAST_CHECK] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FAST_LOAD_FAST] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FROM_DICT_OR_DEREF] = _TAIL_CALL_record_previous_inst,
-    [LOAD_FROM_DICT_OR_GLOBALS] = _TAIL_CALL_record_previous_inst,
-    [LOAD_GLOBAL] = _TAIL_CALL_record_previous_inst,
-    [LOAD_GLOBAL_BUILTIN] = _TAIL_CALL_record_previous_inst,
-    [LOAD_GLOBAL_MODULE] = _TAIL_CALL_record_previous_inst,
-    [LOAD_LOCALS] = _TAIL_CALL_record_previous_inst,
-    [LOAD_NAME] = _TAIL_CALL_record_previous_inst,
-    [LOAD_SMALL_INT] = _TAIL_CALL_record_previous_inst,
-    [LOAD_SPECIAL] = _TAIL_CALL_record_previous_inst,
-    [LOAD_SUPER_ATTR] = _TAIL_CALL_record_previous_inst,
-    [LOAD_SUPER_ATTR_ATTR] = _TAIL_CALL_record_previous_inst,
-    [LOAD_SUPER_ATTR_METHOD] = _TAIL_CALL_record_previous_inst,
-    [MAKE_CELL] = _TAIL_CALL_record_previous_inst,
-    [MAKE_FUNCTION] = _TAIL_CALL_record_previous_inst,
-    [MAP_ADD] = _TAIL_CALL_record_previous_inst,
-    [MATCH_CLASS] = _TAIL_CALL_record_previous_inst,
-    [MATCH_KEYS] = _TAIL_CALL_record_previous_inst,
-    [MATCH_MAPPING] = _TAIL_CALL_record_previous_inst,
-    [MATCH_SEQUENCE] = _TAIL_CALL_record_previous_inst,
-    [NOP] = _TAIL_CALL_record_previous_inst,
-    [NOT_TAKEN] = _TAIL_CALL_record_previous_inst,
-    [POP_EXCEPT] = _TAIL_CALL_record_previous_inst,
-    [POP_ITER] = _TAIL_CALL_record_previous_inst,
-    [POP_JUMP_IF_FALSE] = _TAIL_CALL_record_previous_inst,
-    [POP_JUMP_IF_NONE] = _TAIL_CALL_record_previous_inst,
-    [POP_JUMP_IF_NOT_NONE] = _TAIL_CALL_record_previous_inst,
-    [POP_JUMP_IF_TRUE] = _TAIL_CALL_record_previous_inst,
-    [POP_TOP] = _TAIL_CALL_record_previous_inst,
-    [PUSH_EXC_INFO] = _TAIL_CALL_record_previous_inst,
-    [PUSH_NULL] = _TAIL_CALL_record_previous_inst,
-    [RAISE_VARARGS] = _TAIL_CALL_record_previous_inst,
-    [RERAISE] = _TAIL_CALL_record_previous_inst,
-    [RESERVED] = _TAIL_CALL_record_previous_inst,
-    [RESUME] = _TAIL_CALL_record_previous_inst,
-    [RESUME_CHECK] = _TAIL_CALL_record_previous_inst,
-    [RETURN_GENERATOR] = _TAIL_CALL_record_previous_inst,
-    [RETURN_VALUE] = _TAIL_CALL_record_previous_inst,
-    [SEND] = _TAIL_CALL_record_previous_inst,
-    [SEND_GEN] = _TAIL_CALL_record_previous_inst,
-    [SETUP_ANNOTATIONS] = _TAIL_CALL_record_previous_inst,
-    [SET_ADD] = _TAIL_CALL_record_previous_inst,
-    [SET_FUNCTION_ATTRIBUTE] = _TAIL_CALL_record_previous_inst,
-    [SET_UPDATE] = _TAIL_CALL_record_previous_inst,
-    [STORE_ATTR] = _TAIL_CALL_record_previous_inst,
-    [STORE_ATTR_INSTANCE_VALUE] = _TAIL_CALL_record_previous_inst,
-    [STORE_ATTR_SLOT] = _TAIL_CALL_record_previous_inst,
-    [STORE_ATTR_WITH_HINT] = _TAIL_CALL_record_previous_inst,
-    [STORE_DEREF] = _TAIL_CALL_record_previous_inst,
-    [STORE_FAST] = _TAIL_CALL_record_previous_inst,
-    [STORE_FAST_LOAD_FAST] = _TAIL_CALL_record_previous_inst,
-    [STORE_FAST_STORE_FAST] = _TAIL_CALL_record_previous_inst,
-    [STORE_GLOBAL] = _TAIL_CALL_record_previous_inst,
-    [STORE_NAME] = _TAIL_CALL_record_previous_inst,
-    [STORE_SLICE] = _TAIL_CALL_record_previous_inst,
-    [STORE_SUBSCR] = _TAIL_CALL_record_previous_inst,
-    [STORE_SUBSCR_DICT] = _TAIL_CALL_record_previous_inst,
-    [STORE_SUBSCR_LIST_INT] = _TAIL_CALL_record_previous_inst,
-    [SWAP] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL_ALWAYS_TRUE] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL_BOOL] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL_INT] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL_LIST] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL_NONE] = _TAIL_CALL_record_previous_inst,
-    [TO_BOOL_STR] = _TAIL_CALL_record_previous_inst,
-    [UNARY_INVERT] = _TAIL_CALL_record_previous_inst,
-    [UNARY_NEGATIVE] = _TAIL_CALL_record_previous_inst,
-    [UNARY_NOT] = _TAIL_CALL_record_previous_inst,
-    [UNPACK_EX] = _TAIL_CALL_record_previous_inst,
-    [UNPACK_SEQUENCE] = _TAIL_CALL_record_previous_inst,
-    [UNPACK_SEQUENCE_LIST] = _TAIL_CALL_record_previous_inst,
-    [UNPACK_SEQUENCE_TUPLE] = _TAIL_CALL_record_previous_inst,
-    [UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_record_previous_inst,
-    [WITH_EXCEPT_START] = _TAIL_CALL_record_previous_inst,
-    [YIELD_VALUE] = _TAIL_CALL_record_previous_inst,
+    [BINARY_OP] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_ADD_FLOAT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_ADD_INT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_ADD_UNICODE] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_EXTEND] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_INPLACE_ADD_UNICODE] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_MULTIPLY_FLOAT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_MULTIPLY_INT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBSCR_DICT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBSCR_GETITEM] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBSCR_LIST_INT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBSCR_LIST_SLICE] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBSCR_STR_INT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBSCR_TUPLE_INT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBTRACT_FLOAT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_OP_SUBTRACT_INT] = _TAIL_CALL_TRACE_RECORD,
+    [BINARY_SLICE] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_INTERPOLATION] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_LIST] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_MAP] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_SET] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_SLICE] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_STRING] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_TEMPLATE] = _TAIL_CALL_TRACE_RECORD,
+    [BUILD_TUPLE] = _TAIL_CALL_TRACE_RECORD,
+    [CACHE] = _TAIL_CALL_TRACE_RECORD,
+    [CALL] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_ALLOC_AND_ENTER_INIT] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_BOUND_METHOD_EXACT_ARGS] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_BOUND_METHOD_GENERAL] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_BUILTIN_CLASS] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_BUILTIN_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_BUILTIN_FAST_WITH_KEYWORDS] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_BUILTIN_O] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_FUNCTION_EX] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_INTRINSIC_1] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_INTRINSIC_2] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_ISINSTANCE] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_KW] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_KW_BOUND_METHOD] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_KW_NON_PY] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_KW_PY] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_LEN] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_LIST_APPEND] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_METHOD_DESCRIPTOR_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_METHOD_DESCRIPTOR_NOARGS] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_METHOD_DESCRIPTOR_O] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_NON_PY_GENERAL] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_PY_EXACT_ARGS] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_PY_GENERAL] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_STR_1] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_TUPLE_1] = _TAIL_CALL_TRACE_RECORD,
+    [CALL_TYPE_1] = _TAIL_CALL_TRACE_RECORD,
+    [CHECK_EG_MATCH] = _TAIL_CALL_TRACE_RECORD,
+    [CHECK_EXC_MATCH] = _TAIL_CALL_TRACE_RECORD,
+    [CLEANUP_THROW] = _TAIL_CALL_TRACE_RECORD,
+    [COMPARE_OP] = _TAIL_CALL_TRACE_RECORD,
+    [COMPARE_OP_FLOAT] = _TAIL_CALL_TRACE_RECORD,
+    [COMPARE_OP_INT] = _TAIL_CALL_TRACE_RECORD,
+    [COMPARE_OP_STR] = _TAIL_CALL_TRACE_RECORD,
+    [CONTAINS_OP] = _TAIL_CALL_TRACE_RECORD,
+    [CONTAINS_OP_DICT] = _TAIL_CALL_TRACE_RECORD,
+    [CONTAINS_OP_SET] = _TAIL_CALL_TRACE_RECORD,
+    [CONVERT_VALUE] = _TAIL_CALL_TRACE_RECORD,
+    [COPY] = _TAIL_CALL_TRACE_RECORD,
+    [COPY_FREE_VARS] = _TAIL_CALL_TRACE_RECORD,
+    [DELETE_ATTR] = _TAIL_CALL_TRACE_RECORD,
+    [DELETE_DEREF] = _TAIL_CALL_TRACE_RECORD,
+    [DELETE_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [DELETE_GLOBAL] = _TAIL_CALL_TRACE_RECORD,
+    [DELETE_NAME] = _TAIL_CALL_TRACE_RECORD,
+    [DELETE_SUBSCR] = _TAIL_CALL_TRACE_RECORD,
+    [DICT_MERGE] = _TAIL_CALL_TRACE_RECORD,
+    [DICT_UPDATE] = _TAIL_CALL_TRACE_RECORD,
+    [END_ASYNC_FOR] = _TAIL_CALL_TRACE_RECORD,
+    [END_FOR] = _TAIL_CALL_TRACE_RECORD,
+    [END_SEND] = _TAIL_CALL_TRACE_RECORD,
+    [ENTER_EXECUTOR] = _TAIL_CALL_TRACE_RECORD,
+    [EXIT_INIT_CHECK] = _TAIL_CALL_TRACE_RECORD,
+    [EXTENDED_ARG] = _TAIL_CALL_TRACE_RECORD,
+    [FORMAT_SIMPLE] = _TAIL_CALL_TRACE_RECORD,
+    [FORMAT_WITH_SPEC] = _TAIL_CALL_TRACE_RECORD,
+    [FOR_ITER] = _TAIL_CALL_TRACE_RECORD,
+    [FOR_ITER_GEN] = _TAIL_CALL_TRACE_RECORD,
+    [FOR_ITER_LIST] = _TAIL_CALL_TRACE_RECORD,
+    [FOR_ITER_RANGE] = _TAIL_CALL_TRACE_RECORD,
+    [FOR_ITER_TUPLE] = _TAIL_CALL_TRACE_RECORD,
+    [GET_AITER] = _TAIL_CALL_TRACE_RECORD,
+    [GET_ANEXT] = _TAIL_CALL_TRACE_RECORD,
+    [GET_AWAITABLE] = _TAIL_CALL_TRACE_RECORD,
+    [GET_ITER] = _TAIL_CALL_TRACE_RECORD,
+    [GET_LEN] = _TAIL_CALL_TRACE_RECORD,
+    [GET_YIELD_FROM_ITER] = _TAIL_CALL_TRACE_RECORD,
+    [IMPORT_FROM] = _TAIL_CALL_TRACE_RECORD,
+    [IMPORT_NAME] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_CALL] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_CALL_FUNCTION_EX] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_CALL_KW] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_END_ASYNC_FOR] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_END_FOR] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_END_SEND] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_FOR_ITER] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_INSTRUCTION] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_JUMP_BACKWARD] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_JUMP_FORWARD] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_LINE] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_LOAD_SUPER_ATTR] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_NOT_TAKEN] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_POP_ITER] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_POP_JUMP_IF_FALSE] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_POP_JUMP_IF_NONE] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_POP_JUMP_IF_NOT_NONE] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_POP_JUMP_IF_TRUE] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_RESUME] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_RETURN_VALUE] = _TAIL_CALL_TRACE_RECORD,
+    [INSTRUMENTED_YIELD_VALUE] = _TAIL_CALL_TRACE_RECORD,
+    [INTERPRETER_EXIT] = _TAIL_CALL_TRACE_RECORD,
+    [IS_OP] = _TAIL_CALL_TRACE_RECORD,
+    [JUMP_BACKWARD] = _TAIL_CALL_TRACE_RECORD,
+    [JUMP_BACKWARD_JIT] = _TAIL_CALL_TRACE_RECORD,
+    [JUMP_BACKWARD_NO_INTERRUPT] = _TAIL_CALL_TRACE_RECORD,
+    [JUMP_BACKWARD_NO_JIT] = _TAIL_CALL_TRACE_RECORD,
+    [JUMP_FORWARD] = _TAIL_CALL_TRACE_RECORD,
+    [LIST_APPEND] = _TAIL_CALL_TRACE_RECORD,
+    [LIST_EXTEND] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_CLASS] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_INSTANCE_VALUE] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_METHOD_LAZY_DICT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_METHOD_NO_DICT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_METHOD_WITH_VALUES] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_MODULE] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_PROPERTY] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_SLOT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_ATTR_WITH_HINT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_BUILD_CLASS] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_COMMON_CONSTANT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_CONST] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_DEREF] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FAST_AND_CLEAR] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FAST_BORROW] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FAST_BORROW_LOAD_FAST_BORROW] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FAST_CHECK] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FAST_LOAD_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FROM_DICT_OR_DEREF] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_FROM_DICT_OR_GLOBALS] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_GLOBAL] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_GLOBAL_BUILTIN] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_GLOBAL_MODULE] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_LOCALS] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_NAME] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_SMALL_INT] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_SPECIAL] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_SUPER_ATTR] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_SUPER_ATTR_ATTR] = _TAIL_CALL_TRACE_RECORD,
+    [LOAD_SUPER_ATTR_METHOD] = _TAIL_CALL_TRACE_RECORD,
+    [MAKE_CELL] = _TAIL_CALL_TRACE_RECORD,
+    [MAKE_FUNCTION] = _TAIL_CALL_TRACE_RECORD,
+    [MAP_ADD] = _TAIL_CALL_TRACE_RECORD,
+    [MATCH_CLASS] = _TAIL_CALL_TRACE_RECORD,
+    [MATCH_KEYS] = _TAIL_CALL_TRACE_RECORD,
+    [MATCH_MAPPING] = _TAIL_CALL_TRACE_RECORD,
+    [MATCH_SEQUENCE] = _TAIL_CALL_TRACE_RECORD,
+    [NOP] = _TAIL_CALL_TRACE_RECORD,
+    [NOT_TAKEN] = _TAIL_CALL_TRACE_RECORD,
+    [POP_EXCEPT] = _TAIL_CALL_TRACE_RECORD,
+    [POP_ITER] = _TAIL_CALL_TRACE_RECORD,
+    [POP_JUMP_IF_FALSE] = _TAIL_CALL_TRACE_RECORD,
+    [POP_JUMP_IF_NONE] = _TAIL_CALL_TRACE_RECORD,
+    [POP_JUMP_IF_NOT_NONE] = _TAIL_CALL_TRACE_RECORD,
+    [POP_JUMP_IF_TRUE] = _TAIL_CALL_TRACE_RECORD,
+    [POP_TOP] = _TAIL_CALL_TRACE_RECORD,
+    [PUSH_EXC_INFO] = _TAIL_CALL_TRACE_RECORD,
+    [PUSH_NULL] = _TAIL_CALL_TRACE_RECORD,
+    [RAISE_VARARGS] = _TAIL_CALL_TRACE_RECORD,
+    [RERAISE] = _TAIL_CALL_TRACE_RECORD,
+    [RESERVED] = _TAIL_CALL_TRACE_RECORD,
+    [RESUME] = _TAIL_CALL_TRACE_RECORD,
+    [RESUME_CHECK] = _TAIL_CALL_TRACE_RECORD,
+    [RETURN_GENERATOR] = _TAIL_CALL_TRACE_RECORD,
+    [RETURN_VALUE] = _TAIL_CALL_TRACE_RECORD,
+    [SEND] = _TAIL_CALL_TRACE_RECORD,
+    [SEND_GEN] = _TAIL_CALL_TRACE_RECORD,
+    [SETUP_ANNOTATIONS] = _TAIL_CALL_TRACE_RECORD,
+    [SET_ADD] = _TAIL_CALL_TRACE_RECORD,
+    [SET_FUNCTION_ATTRIBUTE] = _TAIL_CALL_TRACE_RECORD,
+    [SET_UPDATE] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_ATTR] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_ATTR_INSTANCE_VALUE] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_ATTR_SLOT] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_ATTR_WITH_HINT] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_DEREF] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_FAST_LOAD_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_FAST_STORE_FAST] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_GLOBAL] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_NAME] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_SLICE] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_SUBSCR] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_SUBSCR_DICT] = _TAIL_CALL_TRACE_RECORD,
+    [STORE_SUBSCR_LIST_INT] = _TAIL_CALL_TRACE_RECORD,
+    [SWAP] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL_ALWAYS_TRUE] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL_BOOL] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL_INT] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL_LIST] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL_NONE] = _TAIL_CALL_TRACE_RECORD,
+    [TO_BOOL_STR] = _TAIL_CALL_TRACE_RECORD,
+    [TRACE_RECORD] = _TAIL_CALL_TRACE_RECORD,
+    [UNARY_INVERT] = _TAIL_CALL_TRACE_RECORD,
+    [UNARY_NEGATIVE] = _TAIL_CALL_TRACE_RECORD,
+    [UNARY_NOT] = _TAIL_CALL_TRACE_RECORD,
+    [UNPACK_EX] = _TAIL_CALL_TRACE_RECORD,
+    [UNPACK_SEQUENCE] = _TAIL_CALL_TRACE_RECORD,
+    [UNPACK_SEQUENCE_LIST] = _TAIL_CALL_TRACE_RECORD,
+    [UNPACK_SEQUENCE_TUPLE] = _TAIL_CALL_TRACE_RECORD,
+    [UNPACK_SEQUENCE_TWO_TUPLE] = _TAIL_CALL_TRACE_RECORD,
+    [WITH_EXCEPT_START] = _TAIL_CALL_TRACE_RECORD,
+    [YIELD_VALUE] = _TAIL_CALL_TRACE_RECORD,
     [121] = _TAIL_CALL_UNKNOWN_OPCODE,
     [122] = _TAIL_CALL_UNKNOWN_OPCODE,
     [123] = _TAIL_CALL_UNKNOWN_OPCODE,
@@ -1281,6 +1282,5 @@ static py_tail_call_funcptr 
instruction_funcptr_tracing_table[256] = {
     [230] = _TAIL_CALL_UNKNOWN_OPCODE,
     [231] = _TAIL_CALL_UNKNOWN_OPCODE,
     [232] = _TAIL_CALL_UNKNOWN_OPCODE,
-    [233] = _TAIL_CALL_UNKNOWN_OPCODE,
 };
 #endif /* _Py_TAIL_CALL_INTERP */
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index 01263fe8c7a78f..9ebd113df2dabf 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -3483,3 +3483,5 @@
             break;
         }
 
+        /* _TRACE_RECORD is not a viable micro-op for tier 2 */
+
diff --git a/Tools/cases_generator/analyzer.py 
b/Tools/cases_generator/analyzer.py
index d39013db4f7fd6..93aa4899fe6ec8 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -1195,8 +1195,9 @@ def assign_opcodes(
     # This is an historical oddity.
     instmap["BINARY_OP_INPLACE_ADD_UNICODE"] = 3
 
-    instmap["INSTRUMENTED_LINE"] = 254
-    instmap["ENTER_EXECUTOR"] = 255
+    instmap["INSTRUMENTED_LINE"] = 253
+    instmap["ENTER_EXECUTOR"] = 254
+    instmap["TRACE_RECORD"] = 255
 
     instrumented = [name for name in instructions if 
name.startswith("INSTRUMENTED")]
 
@@ -1221,7 +1222,7 @@ def assign_opcodes(
     # Specialized ops appear in their own section
     # Instrumented opcodes are at the end of the valid range
     min_internal = instmap["RESUME"] + 1
-    min_instrumented = 254 - (len(instrumented) - 1)
+    min_instrumented = 254 - len(instrumented)
     assert min_internal + len(specialized) < min_instrumented
 
     next_opcode = 1
diff --git a/Tools/cases_generator/target_generator.py 
b/Tools/cases_generator/target_generator.py
index 36fa1d7fa4908b..f633f704485819 100644
--- a/Tools/cases_generator/target_generator.py
+++ b/Tools/cases_generator/target_generator.py
@@ -34,7 +34,7 @@ def write_opcode_targets(analysis: Analysis, out: CWriter) -> 
None:
     targets = ["&&_unknown_opcode,\n"] * 256
     for name, op in analysis.opmap.items():
         if op < 256:
-            targets[op] = f"&&record_previous_inst,\n"
+            targets[op] = f"&&TARGET_TRACE_RECORD,\n"
     out.emit("#if _Py_TIER2\n")
     out.emit("static void *opcode_tracing_targets_table[256] = {\n")
     for target in targets:
@@ -84,7 +84,7 @@ def write_tailcall_dispatch_table(analysis: Analysis, out: 
CWriter) -> None:
     # Emit the tracing dispatch table.
     out.emit("static py_tail_call_funcptr 
instruction_funcptr_tracing_table[256] = {\n")
     for name in sorted(analysis.instructions.keys()):
-        out.emit(f"[{name}] = _TAIL_CALL_record_previous_inst,\n")
+        out.emit(f"[{name}] = _TAIL_CALL_TRACE_RECORD,\n")
     named_values = analysis.opmap.values()
     for rest in range(256):
         if rest not in named_values:
diff --git a/Tools/cases_generator/tier1_generator.py 
b/Tools/cases_generator/tier1_generator.py
index 94ffb0118f0786..c7ff5de681e6fa 100644
--- a/Tools/cases_generator/tier1_generator.py
+++ b/Tools/cases_generator/tier1_generator.py
@@ -160,7 +160,7 @@ def generate_tier1(
 #if !_Py_TAIL_CALL_INTERP
 #if !USE_COMPUTED_GOTOS
     dispatch_opcode:
-        switch (opcode)
+        switch (dispatch_code)
 #endif
         {{
 #endif /* _Py_TAIL_CALL_INTERP */

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to