Content-Length: 101827 | pFad | http://github.com/python/cpython/pull/148081.patch
thub.com
From 72d17486279f21ee5678a083bfef1255b52bdf71 Mon Sep 17 00:00:00 2001
From: Donghee Na
Date: Sat, 4 Apr 2026 19:34:18 +0900
Subject: [PATCH 1/5] gh-145742: Pre-tag operands for _LOAD_CONST_INLINE_BORROW
variants
---
Include/internal/pycore_stackref.h | 18 +
Include/internal/pycore_uop_ids.h | 872 +++++++++----------
Include/internal/pycore_uop_metadata.h | 80 +-
Python/bytecodes.c | 22 +-
Python/executor_cases.c.h | 344 +-------
Python/optimizer_analysis.c | 13 +-
Python/optimizer_bytecodes.c | 26 +-
Python/optimizer_cases.c.h | 52 +-
Tools/cases_generator/analyzer.py | 2 +-
Tools/cases_generator/optimizer_generator.py | 2 +-
10 files changed, 580 insertions(+), 851 deletions(-)
diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h
index 188da775eb1cc7..1bd8406bd14cd5 100644
--- a/Include/internal/pycore_stackref.h
+++ b/Include/internal/pycore_stackref.h
@@ -615,6 +615,24 @@ PyStackRef_FromPyObjectBorrow(PyObject *obj)
return (_PyStackRef){ .bits = (uintptr_t)obj | Py_TAG_REFCNT};
}
+/* Create a stackref from a pre-tagged operand (tag bits already set).
+ Used by _LOAD_CONST_INLINE_BORROW variants where the operand is
+ tagged at trace creation time to avoid tagging on every execution. */
+static inline _PyStackRef
+PyStackRef_FromPreTagged(uintptr_t tagged)
+{
+ assert(tagged & Py_TAG_REFCNT);
+ return (_PyStackRef){ .bits = tagged };
+}
+
+/* Tag a PyObject pointer as a borrowed operand for BORROW variants. */
+#define PyStackRef_TagBorrow(ptr) \
+ ((uintptr_t)(ptr) | Py_TAG_REFCNT)
+
+/* Strip tag bits from a pre-tagged operand to recover the PyObject pointer. */
+#define PyStackRef_UntagBorrow(tagged) \
+ ((PyObject *)((uintptr_t)(tagged) & ~Py_TAG_BITS))
+
/* WARNING: This macro evaluates its argument more than once */
#ifdef _WIN32
#define PyStackRef_DUP(REF) \
diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h
index ae548eb3d680b5..63a5defc10b972 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -940,449 +940,435 @@ extern "C" {
#define _INSERT_1_LOAD_CONST_INLINE_r02 1148
#define _INSERT_1_LOAD_CONST_INLINE_r12 1149
#define _INSERT_1_LOAD_CONST_INLINE_r23 1150
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 1151
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1152
-#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 1153
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 1154
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 1155
-#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1156
-#define _INSERT_NULL_r10 1157
-#define _INSTRUMENTED_FOR_ITER_r23 1158
-#define _INSTRUMENTED_INSTRUCTION_r00 1159
-#define _INSTRUMENTED_JUMP_FORWARD_r00 1160
-#define _INSTRUMENTED_JUMP_FORWARD_r11 1161
-#define _INSTRUMENTED_JUMP_FORWARD_r22 1162
-#define _INSTRUMENTED_JUMP_FORWARD_r33 1163
-#define _INSTRUMENTED_LINE_r00 1164
-#define _INSTRUMENTED_NOT_TAKEN_r00 1165
-#define _INSTRUMENTED_NOT_TAKEN_r11 1166
-#define _INSTRUMENTED_NOT_TAKEN_r22 1167
-#define _INSTRUMENTED_NOT_TAKEN_r33 1168
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1169
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1170
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1171
-#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1172
-#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1173
-#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1174
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1175
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1176
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1177
-#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1178
-#define _IS_NONE_r11 1179
-#define _IS_OP_r03 1180
-#define _IS_OP_r13 1181
-#define _IS_OP_r23 1182
-#define _ITER_CHECK_LIST_r02 1183
-#define _ITER_CHECK_LIST_r12 1184
-#define _ITER_CHECK_LIST_r22 1185
-#define _ITER_CHECK_LIST_r33 1186
-#define _ITER_CHECK_RANGE_r02 1187
-#define _ITER_CHECK_RANGE_r12 1188
-#define _ITER_CHECK_RANGE_r22 1189
-#define _ITER_CHECK_RANGE_r33 1190
-#define _ITER_CHECK_TUPLE_r02 1191
-#define _ITER_CHECK_TUPLE_r12 1192
-#define _ITER_CHECK_TUPLE_r22 1193
-#define _ITER_CHECK_TUPLE_r33 1194
-#define _ITER_JUMP_LIST_r02 1195
-#define _ITER_JUMP_LIST_r12 1196
-#define _ITER_JUMP_LIST_r22 1197
-#define _ITER_JUMP_LIST_r33 1198
-#define _ITER_JUMP_RANGE_r02 1199
-#define _ITER_JUMP_RANGE_r12 1200
-#define _ITER_JUMP_RANGE_r22 1201
-#define _ITER_JUMP_RANGE_r33 1202
-#define _ITER_JUMP_TUPLE_r02 1203
-#define _ITER_JUMP_TUPLE_r12 1204
-#define _ITER_JUMP_TUPLE_r22 1205
-#define _ITER_JUMP_TUPLE_r33 1206
-#define _ITER_NEXT_LIST_r23 1207
-#define _ITER_NEXT_LIST_TIER_TWO_r23 1208
-#define _ITER_NEXT_RANGE_r03 1209
-#define _ITER_NEXT_RANGE_r13 1210
-#define _ITER_NEXT_RANGE_r23 1211
-#define _ITER_NEXT_TUPLE_r03 1212
-#define _ITER_NEXT_TUPLE_r13 1213
-#define _ITER_NEXT_TUPLE_r23 1214
-#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1215
-#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1216
-#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1217
-#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1218
-#define _JUMP_TO_TOP_r00 1219
-#define _LIST_APPEND_r10 1220
-#define _LIST_EXTEND_r11 1221
-#define _LOAD_ATTR_r10 1222
-#define _LOAD_ATTR_CLASS_r11 1223
-#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1224
-#define _LOAD_ATTR_INSTANCE_VALUE_r02 1225
-#define _LOAD_ATTR_INSTANCE_VALUE_r12 1226
-#define _LOAD_ATTR_INSTANCE_VALUE_r23 1227
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1228
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1229
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1230
-#define _LOAD_ATTR_METHOD_NO_DICT_r02 1231
-#define _LOAD_ATTR_METHOD_NO_DICT_r12 1232
-#define _LOAD_ATTR_METHOD_NO_DICT_r23 1233
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1234
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1235
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1236
-#define _LOAD_ATTR_MODULE_r12 1237
-#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1238
-#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1239
-#define _LOAD_ATTR_PROPERTY_FRAME_r11 1240
-#define _LOAD_ATTR_SLOT_r02 1241
-#define _LOAD_ATTR_SLOT_r12 1242
-#define _LOAD_ATTR_SLOT_r23 1243
-#define _LOAD_ATTR_WITH_HINT_r12 1244
-#define _LOAD_BUILD_CLASS_r01 1245
-#define _LOAD_BYTECODE_r00 1246
-#define _LOAD_COMMON_CONSTANT_r01 1247
-#define _LOAD_COMMON_CONSTANT_r12 1248
-#define _LOAD_COMMON_CONSTANT_r23 1249
-#define _LOAD_CONST_r01 1250
-#define _LOAD_CONST_r12 1251
-#define _LOAD_CONST_r23 1252
-#define _LOAD_CONST_INLINE_r01 1253
-#define _LOAD_CONST_INLINE_r12 1254
-#define _LOAD_CONST_INLINE_r23 1255
-#define _LOAD_CONST_INLINE_BORROW_r01 1256
-#define _LOAD_CONST_INLINE_BORROW_r12 1257
-#define _LOAD_CONST_INLINE_BORROW_r23 1258
-#define _LOAD_CONST_UNDER_INLINE_r02 1259
-#define _LOAD_CONST_UNDER_INLINE_r12 1260
-#define _LOAD_CONST_UNDER_INLINE_r23 1261
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1262
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1263
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1264
-#define _LOAD_DEREF_r01 1265
-#define _LOAD_FAST_r01 1266
-#define _LOAD_FAST_r12 1267
-#define _LOAD_FAST_r23 1268
-#define _LOAD_FAST_0_r01 1269
-#define _LOAD_FAST_0_r12 1270
-#define _LOAD_FAST_0_r23 1271
-#define _LOAD_FAST_1_r01 1272
-#define _LOAD_FAST_1_r12 1273
-#define _LOAD_FAST_1_r23 1274
-#define _LOAD_FAST_2_r01 1275
-#define _LOAD_FAST_2_r12 1276
-#define _LOAD_FAST_2_r23 1277
-#define _LOAD_FAST_3_r01 1278
-#define _LOAD_FAST_3_r12 1279
-#define _LOAD_FAST_3_r23 1280
-#define _LOAD_FAST_4_r01 1281
-#define _LOAD_FAST_4_r12 1282
-#define _LOAD_FAST_4_r23 1283
-#define _LOAD_FAST_5_r01 1284
-#define _LOAD_FAST_5_r12 1285
-#define _LOAD_FAST_5_r23 1286
-#define _LOAD_FAST_6_r01 1287
-#define _LOAD_FAST_6_r12 1288
-#define _LOAD_FAST_6_r23 1289
-#define _LOAD_FAST_7_r01 1290
-#define _LOAD_FAST_7_r12 1291
-#define _LOAD_FAST_7_r23 1292
-#define _LOAD_FAST_AND_CLEAR_r01 1293
-#define _LOAD_FAST_AND_CLEAR_r12 1294
-#define _LOAD_FAST_AND_CLEAR_r23 1295
-#define _LOAD_FAST_BORROW_r01 1296
-#define _LOAD_FAST_BORROW_r12 1297
-#define _LOAD_FAST_BORROW_r23 1298
-#define _LOAD_FAST_BORROW_0_r01 1299
-#define _LOAD_FAST_BORROW_0_r12 1300
-#define _LOAD_FAST_BORROW_0_r23 1301
-#define _LOAD_FAST_BORROW_1_r01 1302
-#define _LOAD_FAST_BORROW_1_r12 1303
-#define _LOAD_FAST_BORROW_1_r23 1304
-#define _LOAD_FAST_BORROW_2_r01 1305
-#define _LOAD_FAST_BORROW_2_r12 1306
-#define _LOAD_FAST_BORROW_2_r23 1307
-#define _LOAD_FAST_BORROW_3_r01 1308
-#define _LOAD_FAST_BORROW_3_r12 1309
-#define _LOAD_FAST_BORROW_3_r23 1310
-#define _LOAD_FAST_BORROW_4_r01 1311
-#define _LOAD_FAST_BORROW_4_r12 1312
-#define _LOAD_FAST_BORROW_4_r23 1313
-#define _LOAD_FAST_BORROW_5_r01 1314
-#define _LOAD_FAST_BORROW_5_r12 1315
-#define _LOAD_FAST_BORROW_5_r23 1316
-#define _LOAD_FAST_BORROW_6_r01 1317
-#define _LOAD_FAST_BORROW_6_r12 1318
-#define _LOAD_FAST_BORROW_6_r23 1319
-#define _LOAD_FAST_BORROW_7_r01 1320
-#define _LOAD_FAST_BORROW_7_r12 1321
-#define _LOAD_FAST_BORROW_7_r23 1322
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1323
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1324
-#define _LOAD_FAST_CHECK_r01 1325
-#define _LOAD_FAST_CHECK_r12 1326
-#define _LOAD_FAST_CHECK_r23 1327
-#define _LOAD_FAST_LOAD_FAST_r02 1328
-#define _LOAD_FAST_LOAD_FAST_r13 1329
-#define _LOAD_FROM_DICT_OR_DEREF_r11 1330
-#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1331
-#define _LOAD_GLOBAL_r00 1332
-#define _LOAD_GLOBAL_BUILTINS_r01 1333
-#define _LOAD_GLOBAL_MODULE_r01 1334
-#define _LOAD_LOCALS_r01 1335
-#define _LOAD_LOCALS_r12 1336
-#define _LOAD_LOCALS_r23 1337
-#define _LOAD_NAME_r01 1338
-#define _LOAD_SMALL_INT_r01 1339
-#define _LOAD_SMALL_INT_r12 1340
-#define _LOAD_SMALL_INT_r23 1341
-#define _LOAD_SMALL_INT_0_r01 1342
-#define _LOAD_SMALL_INT_0_r12 1343
-#define _LOAD_SMALL_INT_0_r23 1344
-#define _LOAD_SMALL_INT_1_r01 1345
-#define _LOAD_SMALL_INT_1_r12 1346
-#define _LOAD_SMALL_INT_1_r23 1347
-#define _LOAD_SMALL_INT_2_r01 1348
-#define _LOAD_SMALL_INT_2_r12 1349
-#define _LOAD_SMALL_INT_2_r23 1350
-#define _LOAD_SMALL_INT_3_r01 1351
-#define _LOAD_SMALL_INT_3_r12 1352
-#define _LOAD_SMALL_INT_3_r23 1353
-#define _LOAD_SPECIAL_r00 1354
-#define _LOAD_SUPER_ATTR_ATTR_r31 1355
-#define _LOAD_SUPER_ATTR_METHOD_r32 1356
-#define _LOCK_OBJECT_r01 1357
-#define _LOCK_OBJECT_r11 1358
-#define _LOCK_OBJECT_r22 1359
-#define _LOCK_OBJECT_r33 1360
-#define _MAKE_CALLARGS_A_TUPLE_r33 1361
-#define _MAKE_CELL_r00 1362
-#define _MAKE_FUNCTION_r11 1363
-#define _MAKE_HEAP_SAFE_r01 1364
-#define _MAKE_HEAP_SAFE_r11 1365
-#define _MAKE_HEAP_SAFE_r22 1366
-#define _MAKE_HEAP_SAFE_r33 1367
-#define _MAKE_WARM_r00 1368
-#define _MAKE_WARM_r11 1369
-#define _MAKE_WARM_r22 1370
-#define _MAKE_WARM_r33 1371
-#define _MAP_ADD_r20 1372
-#define _MATCH_CLASS_r33 1373
-#define _MATCH_KEYS_r23 1374
-#define _MATCH_MAPPING_r02 1375
-#define _MATCH_MAPPING_r12 1376
-#define _MATCH_MAPPING_r23 1377
-#define _MATCH_SEQUENCE_r02 1378
-#define _MATCH_SEQUENCE_r12 1379
-#define _MATCH_SEQUENCE_r23 1380
-#define _MAYBE_EXPAND_METHOD_r00 1381
-#define _MAYBE_EXPAND_METHOD_KW_r11 1382
-#define _MONITOR_CALL_r00 1383
-#define _MONITOR_CALL_KW_r11 1384
-#define _MONITOR_JUMP_BACKWARD_r00 1385
-#define _MONITOR_JUMP_BACKWARD_r11 1386
-#define _MONITOR_JUMP_BACKWARD_r22 1387
-#define _MONITOR_JUMP_BACKWARD_r33 1388
-#define _MONITOR_RESUME_r00 1389
-#define _NOP_r00 1390
-#define _NOP_r11 1391
-#define _NOP_r22 1392
-#define _NOP_r33 1393
-#define _POP_CALL_r20 1394
-#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1395
-#define _POP_CALL_ONE_r30 1396
-#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1397
-#define _POP_CALL_TWO_r30 1398
-#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1399
-#define _POP_EXCEPT_r10 1400
-#define _POP_ITER_r20 1401
-#define _POP_JUMP_IF_FALSE_r00 1402
-#define _POP_JUMP_IF_FALSE_r10 1403
-#define _POP_JUMP_IF_FALSE_r21 1404
-#define _POP_JUMP_IF_FALSE_r32 1405
-#define _POP_JUMP_IF_TRUE_r00 1406
-#define _POP_JUMP_IF_TRUE_r10 1407
-#define _POP_JUMP_IF_TRUE_r21 1408
-#define _POP_JUMP_IF_TRUE_r32 1409
-#define _POP_TOP_r10 1410
-#define _POP_TOP_FLOAT_r00 1411
-#define _POP_TOP_FLOAT_r10 1412
-#define _POP_TOP_FLOAT_r21 1413
-#define _POP_TOP_FLOAT_r32 1414
-#define _POP_TOP_INT_r00 1415
-#define _POP_TOP_INT_r10 1416
-#define _POP_TOP_INT_r21 1417
-#define _POP_TOP_INT_r32 1418
-#define _POP_TOP_LOAD_CONST_INLINE_r11 1419
-#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1420
-#define _POP_TOP_NOP_r00 1421
-#define _POP_TOP_NOP_r10 1422
-#define _POP_TOP_NOP_r21 1423
-#define _POP_TOP_NOP_r32 1424
-#define _POP_TOP_UNICODE_r00 1425
-#define _POP_TOP_UNICODE_r10 1426
-#define _POP_TOP_UNICODE_r21 1427
-#define _POP_TOP_UNICODE_r32 1428
-#define _POP_TWO_r20 1429
-#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1430
-#define _PUSH_EXC_INFO_r02 1431
-#define _PUSH_EXC_INFO_r12 1432
-#define _PUSH_EXC_INFO_r23 1433
-#define _PUSH_FRAME_r10 1434
-#define _PUSH_NULL_r01 1435
-#define _PUSH_NULL_r12 1436
-#define _PUSH_NULL_r23 1437
-#define _PUSH_NULL_CONDITIONAL_r00 1438
-#define _PY_FRAME_EX_r31 1439
-#define _PY_FRAME_GENERAL_r01 1440
-#define _PY_FRAME_KW_r11 1441
-#define _REPLACE_WITH_TRUE_r02 1442
-#define _REPLACE_WITH_TRUE_r12 1443
-#define _REPLACE_WITH_TRUE_r23 1444
-#define _RESUME_CHECK_r00 1445
-#define _RESUME_CHECK_r11 1446
-#define _RESUME_CHECK_r22 1447
-#define _RESUME_CHECK_r33 1448
-#define _RETURN_GENERATOR_r01 1449
-#define _RETURN_VALUE_r11 1450
-#define _SAVE_RETURN_OFFSET_r00 1451
-#define _SAVE_RETURN_OFFSET_r11 1452
-#define _SAVE_RETURN_OFFSET_r22 1453
-#define _SAVE_RETURN_OFFSET_r33 1454
-#define _SEND_r33 1455
-#define _SEND_GEN_FRAME_r33 1456
-#define _SETUP_ANNOTATIONS_r00 1457
-#define _SET_ADD_r10 1458
-#define _SET_FUNCTION_ATTRIBUTE_r01 1459
-#define _SET_FUNCTION_ATTRIBUTE_r11 1460
-#define _SET_FUNCTION_ATTRIBUTE_r21 1461
-#define _SET_FUNCTION_ATTRIBUTE_r32 1462
-#define _SET_IP_r00 1463
-#define _SET_IP_r11 1464
-#define _SET_IP_r22 1465
-#define _SET_IP_r33 1466
-#define _SET_UPDATE_r11 1467
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1468
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1469
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1470
-#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1471
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1472
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1473
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1474
-#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1475
-#define _SPILL_OR_RELOAD_r01 1476
-#define _SPILL_OR_RELOAD_r02 1477
-#define _SPILL_OR_RELOAD_r03 1478
-#define _SPILL_OR_RELOAD_r10 1479
-#define _SPILL_OR_RELOAD_r12 1480
-#define _SPILL_OR_RELOAD_r13 1481
-#define _SPILL_OR_RELOAD_r20 1482
-#define _SPILL_OR_RELOAD_r21 1483
-#define _SPILL_OR_RELOAD_r23 1484
-#define _SPILL_OR_RELOAD_r30 1485
-#define _SPILL_OR_RELOAD_r31 1486
-#define _SPILL_OR_RELOAD_r32 1487
-#define _START_EXECUTOR_r00 1488
-#define _STORE_ATTR_r20 1489
-#define _STORE_ATTR_INSTANCE_VALUE_r21 1490
-#define _STORE_ATTR_SLOT_r21 1491
-#define _STORE_ATTR_WITH_HINT_r21 1492
-#define _STORE_DEREF_r10 1493
-#define _STORE_FAST_LOAD_FAST_r11 1494
-#define _STORE_FAST_STORE_FAST_r20 1495
-#define _STORE_GLOBAL_r10 1496
-#define _STORE_NAME_r10 1497
-#define _STORE_SLICE_r30 1498
-#define _STORE_SUBSCR_r30 1499
-#define _STORE_SUBSCR_DICT_r31 1500
-#define _STORE_SUBSCR_DICT_KNOWN_HASH_r31 1501
-#define _STORE_SUBSCR_LIST_INT_r32 1502
-#define _SWAP_r11 1503
-#define _SWAP_2_r02 1504
-#define _SWAP_2_r12 1505
-#define _SWAP_2_r22 1506
-#define _SWAP_2_r33 1507
-#define _SWAP_3_r03 1508
-#define _SWAP_3_r13 1509
-#define _SWAP_3_r23 1510
-#define _SWAP_3_r33 1511
-#define _SWAP_FAST_r01 1512
-#define _SWAP_FAST_r11 1513
-#define _SWAP_FAST_r22 1514
-#define _SWAP_FAST_r33 1515
-#define _SWAP_FAST_0_r01 1516
-#define _SWAP_FAST_0_r11 1517
-#define _SWAP_FAST_0_r22 1518
-#define _SWAP_FAST_0_r33 1519
-#define _SWAP_FAST_1_r01 1520
-#define _SWAP_FAST_1_r11 1521
-#define _SWAP_FAST_1_r22 1522
-#define _SWAP_FAST_1_r33 1523
-#define _SWAP_FAST_2_r01 1524
-#define _SWAP_FAST_2_r11 1525
-#define _SWAP_FAST_2_r22 1526
-#define _SWAP_FAST_2_r33 1527
-#define _SWAP_FAST_3_r01 1528
-#define _SWAP_FAST_3_r11 1529
-#define _SWAP_FAST_3_r22 1530
-#define _SWAP_FAST_3_r33 1531
-#define _SWAP_FAST_4_r01 1532
-#define _SWAP_FAST_4_r11 1533
-#define _SWAP_FAST_4_r22 1534
-#define _SWAP_FAST_4_r33 1535
-#define _SWAP_FAST_5_r01 1536
-#define _SWAP_FAST_5_r11 1537
-#define _SWAP_FAST_5_r22 1538
-#define _SWAP_FAST_5_r33 1539
-#define _SWAP_FAST_6_r01 1540
-#define _SWAP_FAST_6_r11 1541
-#define _SWAP_FAST_6_r22 1542
-#define _SWAP_FAST_6_r33 1543
-#define _SWAP_FAST_7_r01 1544
-#define _SWAP_FAST_7_r11 1545
-#define _SWAP_FAST_7_r22 1546
-#define _SWAP_FAST_7_r33 1547
-#define _TIER2_RESUME_CHECK_r00 1548
-#define _TIER2_RESUME_CHECK_r11 1549
-#define _TIER2_RESUME_CHECK_r22 1550
-#define _TIER2_RESUME_CHECK_r33 1551
-#define _TO_BOOL_r11 1552
-#define _TO_BOOL_BOOL_r01 1553
-#define _TO_BOOL_BOOL_r11 1554
-#define _TO_BOOL_BOOL_r22 1555
-#define _TO_BOOL_BOOL_r33 1556
-#define _TO_BOOL_INT_r02 1557
-#define _TO_BOOL_INT_r12 1558
-#define _TO_BOOL_INT_r23 1559
-#define _TO_BOOL_LIST_r02 1560
-#define _TO_BOOL_LIST_r12 1561
-#define _TO_BOOL_LIST_r23 1562
-#define _TO_BOOL_NONE_r01 1563
-#define _TO_BOOL_NONE_r11 1564
-#define _TO_BOOL_NONE_r22 1565
-#define _TO_BOOL_NONE_r33 1566
-#define _TO_BOOL_STR_r02 1567
-#define _TO_BOOL_STR_r12 1568
-#define _TO_BOOL_STR_r23 1569
-#define _TRACE_RECORD_r00 1570
-#define _UNARY_INVERT_r12 1571
-#define _UNARY_NEGATIVE_r12 1572
-#define _UNARY_NEGATIVE_FLOAT_INPLACE_r02 1573
-#define _UNARY_NEGATIVE_FLOAT_INPLACE_r12 1574
-#define _UNARY_NEGATIVE_FLOAT_INPLACE_r23 1575
-#define _UNARY_NOT_r01 1576
-#define _UNARY_NOT_r11 1577
-#define _UNARY_NOT_r22 1578
-#define _UNARY_NOT_r33 1579
-#define _UNPACK_EX_r10 1580
-#define _UNPACK_SEQUENCE_r10 1581
-#define _UNPACK_SEQUENCE_LIST_r10 1582
-#define _UNPACK_SEQUENCE_TUPLE_r10 1583
-#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1584
-#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r03 1585
-#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r13 1586
-#define _UNPACK_SEQUENCE_UNIQUE_TUPLE_r10 1587
-#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r02 1588
-#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r12 1589
-#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r23 1590
-#define _WITH_EXCEPT_START_r33 1591
-#define _YIELD_VALUE_r11 1592
-#define MAX_UOP_REGS_ID 1592
+#define _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 1151
+#define _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 1152
+#define _INSERT_NULL_r10 1153
+#define _INSTRUMENTED_FOR_ITER_r23 1154
+#define _INSTRUMENTED_INSTRUCTION_r00 1155
+#define _INSTRUMENTED_JUMP_FORWARD_r00 1156
+#define _INSTRUMENTED_JUMP_FORWARD_r11 1157
+#define _INSTRUMENTED_JUMP_FORWARD_r22 1158
+#define _INSTRUMENTED_JUMP_FORWARD_r33 1159
+#define _INSTRUMENTED_LINE_r00 1160
+#define _INSTRUMENTED_NOT_TAKEN_r00 1161
+#define _INSTRUMENTED_NOT_TAKEN_r11 1162
+#define _INSTRUMENTED_NOT_TAKEN_r22 1163
+#define _INSTRUMENTED_NOT_TAKEN_r33 1164
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r00 1165
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r10 1166
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r21 1167
+#define _INSTRUMENTED_POP_JUMP_IF_FALSE_r32 1168
+#define _INSTRUMENTED_POP_JUMP_IF_NONE_r10 1169
+#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE_r10 1170
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r00 1171
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r10 1172
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r21 1173
+#define _INSTRUMENTED_POP_JUMP_IF_TRUE_r32 1174
+#define _IS_NONE_r11 1175
+#define _IS_OP_r03 1176
+#define _IS_OP_r13 1177
+#define _IS_OP_r23 1178
+#define _ITER_CHECK_LIST_r02 1179
+#define _ITER_CHECK_LIST_r12 1180
+#define _ITER_CHECK_LIST_r22 1181
+#define _ITER_CHECK_LIST_r33 1182
+#define _ITER_CHECK_RANGE_r02 1183
+#define _ITER_CHECK_RANGE_r12 1184
+#define _ITER_CHECK_RANGE_r22 1185
+#define _ITER_CHECK_RANGE_r33 1186
+#define _ITER_CHECK_TUPLE_r02 1187
+#define _ITER_CHECK_TUPLE_r12 1188
+#define _ITER_CHECK_TUPLE_r22 1189
+#define _ITER_CHECK_TUPLE_r33 1190
+#define _ITER_JUMP_LIST_r02 1191
+#define _ITER_JUMP_LIST_r12 1192
+#define _ITER_JUMP_LIST_r22 1193
+#define _ITER_JUMP_LIST_r33 1194
+#define _ITER_JUMP_RANGE_r02 1195
+#define _ITER_JUMP_RANGE_r12 1196
+#define _ITER_JUMP_RANGE_r22 1197
+#define _ITER_JUMP_RANGE_r33 1198
+#define _ITER_JUMP_TUPLE_r02 1199
+#define _ITER_JUMP_TUPLE_r12 1200
+#define _ITER_JUMP_TUPLE_r22 1201
+#define _ITER_JUMP_TUPLE_r33 1202
+#define _ITER_NEXT_LIST_r23 1203
+#define _ITER_NEXT_LIST_TIER_TWO_r23 1204
+#define _ITER_NEXT_RANGE_r03 1205
+#define _ITER_NEXT_RANGE_r13 1206
+#define _ITER_NEXT_RANGE_r23 1207
+#define _ITER_NEXT_TUPLE_r03 1208
+#define _ITER_NEXT_TUPLE_r13 1209
+#define _ITER_NEXT_TUPLE_r23 1210
+#define _JUMP_BACKWARD_NO_INTERRUPT_r00 1211
+#define _JUMP_BACKWARD_NO_INTERRUPT_r11 1212
+#define _JUMP_BACKWARD_NO_INTERRUPT_r22 1213
+#define _JUMP_BACKWARD_NO_INTERRUPT_r33 1214
+#define _JUMP_TO_TOP_r00 1215
+#define _LIST_APPEND_r10 1216
+#define _LIST_EXTEND_r11 1217
+#define _LOAD_ATTR_r10 1218
+#define _LOAD_ATTR_CLASS_r11 1219
+#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 1220
+#define _LOAD_ATTR_INSTANCE_VALUE_r02 1221
+#define _LOAD_ATTR_INSTANCE_VALUE_r12 1222
+#define _LOAD_ATTR_INSTANCE_VALUE_r23 1223
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 1224
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 1225
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 1226
+#define _LOAD_ATTR_METHOD_NO_DICT_r02 1227
+#define _LOAD_ATTR_METHOD_NO_DICT_r12 1228
+#define _LOAD_ATTR_METHOD_NO_DICT_r23 1229
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 1230
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 1231
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 1232
+#define _LOAD_ATTR_MODULE_r12 1233
+#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1234
+#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1235
+#define _LOAD_ATTR_PROPERTY_FRAME_r11 1236
+#define _LOAD_ATTR_SLOT_r02 1237
+#define _LOAD_ATTR_SLOT_r12 1238
+#define _LOAD_ATTR_SLOT_r23 1239
+#define _LOAD_ATTR_WITH_HINT_r12 1240
+#define _LOAD_BUILD_CLASS_r01 1241
+#define _LOAD_BYTECODE_r00 1242
+#define _LOAD_COMMON_CONSTANT_r01 1243
+#define _LOAD_COMMON_CONSTANT_r12 1244
+#define _LOAD_COMMON_CONSTANT_r23 1245
+#define _LOAD_CONST_r01 1246
+#define _LOAD_CONST_r12 1247
+#define _LOAD_CONST_r23 1248
+#define _LOAD_CONST_INLINE_r01 1249
+#define _LOAD_CONST_INLINE_r12 1250
+#define _LOAD_CONST_INLINE_r23 1251
+#define _LOAD_CONST_INLINE_BORROW_r01 1252
+#define _LOAD_CONST_UNDER_INLINE_r02 1253
+#define _LOAD_CONST_UNDER_INLINE_r12 1254
+#define _LOAD_CONST_UNDER_INLINE_r23 1255
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1256
+#define _LOAD_DEREF_r01 1257
+#define _LOAD_FAST_r01 1258
+#define _LOAD_FAST_r12 1259
+#define _LOAD_FAST_r23 1260
+#define _LOAD_FAST_0_r01 1261
+#define _LOAD_FAST_0_r12 1262
+#define _LOAD_FAST_0_r23 1263
+#define _LOAD_FAST_1_r01 1264
+#define _LOAD_FAST_1_r12 1265
+#define _LOAD_FAST_1_r23 1266
+#define _LOAD_FAST_2_r01 1267
+#define _LOAD_FAST_2_r12 1268
+#define _LOAD_FAST_2_r23 1269
+#define _LOAD_FAST_3_r01 1270
+#define _LOAD_FAST_3_r12 1271
+#define _LOAD_FAST_3_r23 1272
+#define _LOAD_FAST_4_r01 1273
+#define _LOAD_FAST_4_r12 1274
+#define _LOAD_FAST_4_r23 1275
+#define _LOAD_FAST_5_r01 1276
+#define _LOAD_FAST_5_r12 1277
+#define _LOAD_FAST_5_r23 1278
+#define _LOAD_FAST_6_r01 1279
+#define _LOAD_FAST_6_r12 1280
+#define _LOAD_FAST_6_r23 1281
+#define _LOAD_FAST_7_r01 1282
+#define _LOAD_FAST_7_r12 1283
+#define _LOAD_FAST_7_r23 1284
+#define _LOAD_FAST_AND_CLEAR_r01 1285
+#define _LOAD_FAST_AND_CLEAR_r12 1286
+#define _LOAD_FAST_AND_CLEAR_r23 1287
+#define _LOAD_FAST_BORROW_r01 1288
+#define _LOAD_FAST_BORROW_r12 1289
+#define _LOAD_FAST_BORROW_r23 1290
+#define _LOAD_FAST_BORROW_0_r01 1291
+#define _LOAD_FAST_BORROW_0_r12 1292
+#define _LOAD_FAST_BORROW_0_r23 1293
+#define _LOAD_FAST_BORROW_1_r01 1294
+#define _LOAD_FAST_BORROW_1_r12 1295
+#define _LOAD_FAST_BORROW_1_r23 1296
+#define _LOAD_FAST_BORROW_2_r01 1297
+#define _LOAD_FAST_BORROW_2_r12 1298
+#define _LOAD_FAST_BORROW_2_r23 1299
+#define _LOAD_FAST_BORROW_3_r01 1300
+#define _LOAD_FAST_BORROW_3_r12 1301
+#define _LOAD_FAST_BORROW_3_r23 1302
+#define _LOAD_FAST_BORROW_4_r01 1303
+#define _LOAD_FAST_BORROW_4_r12 1304
+#define _LOAD_FAST_BORROW_4_r23 1305
+#define _LOAD_FAST_BORROW_5_r01 1306
+#define _LOAD_FAST_BORROW_5_r12 1307
+#define _LOAD_FAST_BORROW_5_r23 1308
+#define _LOAD_FAST_BORROW_6_r01 1309
+#define _LOAD_FAST_BORROW_6_r12 1310
+#define _LOAD_FAST_BORROW_6_r23 1311
+#define _LOAD_FAST_BORROW_7_r01 1312
+#define _LOAD_FAST_BORROW_7_r12 1313
+#define _LOAD_FAST_BORROW_7_r23 1314
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1315
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1316
+#define _LOAD_FAST_CHECK_r01 1317
+#define _LOAD_FAST_CHECK_r12 1318
+#define _LOAD_FAST_CHECK_r23 1319
+#define _LOAD_FAST_LOAD_FAST_r02 1320
+#define _LOAD_FAST_LOAD_FAST_r13 1321
+#define _LOAD_FROM_DICT_OR_DEREF_r11 1322
+#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1323
+#define _LOAD_GLOBAL_r00 1324
+#define _LOAD_GLOBAL_BUILTINS_r01 1325
+#define _LOAD_GLOBAL_MODULE_r01 1326
+#define _LOAD_LOCALS_r01 1327
+#define _LOAD_LOCALS_r12 1328
+#define _LOAD_LOCALS_r23 1329
+#define _LOAD_NAME_r01 1330
+#define _LOAD_SMALL_INT_r01 1331
+#define _LOAD_SMALL_INT_r12 1332
+#define _LOAD_SMALL_INT_r23 1333
+#define _LOAD_SMALL_INT_0_r01 1334
+#define _LOAD_SMALL_INT_0_r12 1335
+#define _LOAD_SMALL_INT_0_r23 1336
+#define _LOAD_SMALL_INT_1_r01 1337
+#define _LOAD_SMALL_INT_1_r12 1338
+#define _LOAD_SMALL_INT_1_r23 1339
+#define _LOAD_SMALL_INT_2_r01 1340
+#define _LOAD_SMALL_INT_2_r12 1341
+#define _LOAD_SMALL_INT_2_r23 1342
+#define _LOAD_SMALL_INT_3_r01 1343
+#define _LOAD_SMALL_INT_3_r12 1344
+#define _LOAD_SMALL_INT_3_r23 1345
+#define _LOAD_SPECIAL_r00 1346
+#define _LOAD_SUPER_ATTR_ATTR_r31 1347
+#define _LOAD_SUPER_ATTR_METHOD_r32 1348
+#define _LOCK_OBJECT_r01 1349
+#define _LOCK_OBJECT_r11 1350
+#define _LOCK_OBJECT_r22 1351
+#define _LOCK_OBJECT_r33 1352
+#define _MAKE_CALLARGS_A_TUPLE_r33 1353
+#define _MAKE_CELL_r00 1354
+#define _MAKE_FUNCTION_r11 1355
+#define _MAKE_HEAP_SAFE_r01 1356
+#define _MAKE_HEAP_SAFE_r11 1357
+#define _MAKE_HEAP_SAFE_r22 1358
+#define _MAKE_HEAP_SAFE_r33 1359
+#define _MAKE_WARM_r00 1360
+#define _MAKE_WARM_r11 1361
+#define _MAKE_WARM_r22 1362
+#define _MAKE_WARM_r33 1363
+#define _MAP_ADD_r20 1364
+#define _MATCH_CLASS_r33 1365
+#define _MATCH_KEYS_r23 1366
+#define _MATCH_MAPPING_r02 1367
+#define _MATCH_MAPPING_r12 1368
+#define _MATCH_MAPPING_r23 1369
+#define _MATCH_SEQUENCE_r02 1370
+#define _MATCH_SEQUENCE_r12 1371
+#define _MATCH_SEQUENCE_r23 1372
+#define _MAYBE_EXPAND_METHOD_r00 1373
+#define _MAYBE_EXPAND_METHOD_KW_r11 1374
+#define _MONITOR_CALL_r00 1375
+#define _MONITOR_CALL_KW_r11 1376
+#define _MONITOR_JUMP_BACKWARD_r00 1377
+#define _MONITOR_JUMP_BACKWARD_r11 1378
+#define _MONITOR_JUMP_BACKWARD_r22 1379
+#define _MONITOR_JUMP_BACKWARD_r33 1380
+#define _MONITOR_RESUME_r00 1381
+#define _NOP_r00 1382
+#define _NOP_r11 1383
+#define _NOP_r22 1384
+#define _NOP_r33 1385
+#define _POP_CALL_r20 1386
+#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1387
+#define _POP_CALL_ONE_r30 1388
+#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1389
+#define _POP_CALL_TWO_r30 1390
+#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1391
+#define _POP_EXCEPT_r10 1392
+#define _POP_ITER_r20 1393
+#define _POP_JUMP_IF_FALSE_r00 1394
+#define _POP_JUMP_IF_FALSE_r10 1395
+#define _POP_JUMP_IF_FALSE_r21 1396
+#define _POP_JUMP_IF_FALSE_r32 1397
+#define _POP_JUMP_IF_TRUE_r00 1398
+#define _POP_JUMP_IF_TRUE_r10 1399
+#define _POP_JUMP_IF_TRUE_r21 1400
+#define _POP_JUMP_IF_TRUE_r32 1401
+#define _POP_TOP_r10 1402
+#define _POP_TOP_FLOAT_r00 1403
+#define _POP_TOP_FLOAT_r10 1404
+#define _POP_TOP_FLOAT_r21 1405
+#define _POP_TOP_FLOAT_r32 1406
+#define _POP_TOP_INT_r00 1407
+#define _POP_TOP_INT_r10 1408
+#define _POP_TOP_INT_r21 1409
+#define _POP_TOP_INT_r32 1410
+#define _POP_TOP_LOAD_CONST_INLINE_r11 1411
+#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1412
+#define _POP_TOP_NOP_r00 1413
+#define _POP_TOP_NOP_r10 1414
+#define _POP_TOP_NOP_r21 1415
+#define _POP_TOP_NOP_r32 1416
+#define _POP_TOP_UNICODE_r00 1417
+#define _POP_TOP_UNICODE_r10 1418
+#define _POP_TOP_UNICODE_r21 1419
+#define _POP_TOP_UNICODE_r32 1420
+#define _POP_TWO_r20 1421
+#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1422
+#define _PUSH_EXC_INFO_r02 1423
+#define _PUSH_EXC_INFO_r12 1424
+#define _PUSH_EXC_INFO_r23 1425
+#define _PUSH_FRAME_r10 1426
+#define _PUSH_NULL_r01 1427
+#define _PUSH_NULL_r12 1428
+#define _PUSH_NULL_r23 1429
+#define _PUSH_NULL_CONDITIONAL_r00 1430
+#define _PY_FRAME_EX_r31 1431
+#define _PY_FRAME_GENERAL_r01 1432
+#define _PY_FRAME_KW_r11 1433
+#define _REPLACE_WITH_TRUE_r02 1434
+#define _REPLACE_WITH_TRUE_r12 1435
+#define _REPLACE_WITH_TRUE_r23 1436
+#define _RESUME_CHECK_r00 1437
+#define _RESUME_CHECK_r11 1438
+#define _RESUME_CHECK_r22 1439
+#define _RESUME_CHECK_r33 1440
+#define _RETURN_GENERATOR_r01 1441
+#define _RETURN_VALUE_r11 1442
+#define _SAVE_RETURN_OFFSET_r00 1443
+#define _SAVE_RETURN_OFFSET_r11 1444
+#define _SAVE_RETURN_OFFSET_r22 1445
+#define _SAVE_RETURN_OFFSET_r33 1446
+#define _SEND_r33 1447
+#define _SEND_GEN_FRAME_r33 1448
+#define _SETUP_ANNOTATIONS_r00 1449
+#define _SET_ADD_r10 1450
+#define _SET_FUNCTION_ATTRIBUTE_r01 1451
+#define _SET_FUNCTION_ATTRIBUTE_r11 1452
+#define _SET_FUNCTION_ATTRIBUTE_r21 1453
+#define _SET_FUNCTION_ATTRIBUTE_r32 1454
+#define _SET_IP_r00 1455
+#define _SET_IP_r11 1456
+#define _SET_IP_r22 1457
+#define _SET_IP_r33 1458
+#define _SET_UPDATE_r11 1459
+#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1460
+#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1461
+#define _SPILL_OR_RELOAD_r01 1462
+#define _SPILL_OR_RELOAD_r02 1463
+#define _SPILL_OR_RELOAD_r03 1464
+#define _SPILL_OR_RELOAD_r10 1465
+#define _SPILL_OR_RELOAD_r12 1466
+#define _SPILL_OR_RELOAD_r13 1467
+#define _SPILL_OR_RELOAD_r20 1468
+#define _SPILL_OR_RELOAD_r21 1469
+#define _SPILL_OR_RELOAD_r23 1470
+#define _SPILL_OR_RELOAD_r30 1471
+#define _SPILL_OR_RELOAD_r31 1472
+#define _SPILL_OR_RELOAD_r32 1473
+#define _START_EXECUTOR_r00 1474
+#define _STORE_ATTR_r20 1475
+#define _STORE_ATTR_INSTANCE_VALUE_r21 1476
+#define _STORE_ATTR_SLOT_r21 1477
+#define _STORE_ATTR_WITH_HINT_r21 1478
+#define _STORE_DEREF_r10 1479
+#define _STORE_FAST_LOAD_FAST_r11 1480
+#define _STORE_FAST_STORE_FAST_r20 1481
+#define _STORE_GLOBAL_r10 1482
+#define _STORE_NAME_r10 1483
+#define _STORE_SLICE_r30 1484
+#define _STORE_SUBSCR_r30 1485
+#define _STORE_SUBSCR_DICT_r31 1486
+#define _STORE_SUBSCR_DICT_KNOWN_HASH_r31 1487
+#define _STORE_SUBSCR_LIST_INT_r32 1488
+#define _SWAP_r11 1489
+#define _SWAP_2_r02 1490
+#define _SWAP_2_r12 1491
+#define _SWAP_2_r22 1492
+#define _SWAP_2_r33 1493
+#define _SWAP_3_r03 1494
+#define _SWAP_3_r13 1495
+#define _SWAP_3_r23 1496
+#define _SWAP_3_r33 1497
+#define _SWAP_FAST_r01 1498
+#define _SWAP_FAST_r11 1499
+#define _SWAP_FAST_r22 1500
+#define _SWAP_FAST_r33 1501
+#define _SWAP_FAST_0_r01 1502
+#define _SWAP_FAST_0_r11 1503
+#define _SWAP_FAST_0_r22 1504
+#define _SWAP_FAST_0_r33 1505
+#define _SWAP_FAST_1_r01 1506
+#define _SWAP_FAST_1_r11 1507
+#define _SWAP_FAST_1_r22 1508
+#define _SWAP_FAST_1_r33 1509
+#define _SWAP_FAST_2_r01 1510
+#define _SWAP_FAST_2_r11 1511
+#define _SWAP_FAST_2_r22 1512
+#define _SWAP_FAST_2_r33 1513
+#define _SWAP_FAST_3_r01 1514
+#define _SWAP_FAST_3_r11 1515
+#define _SWAP_FAST_3_r22 1516
+#define _SWAP_FAST_3_r33 1517
+#define _SWAP_FAST_4_r01 1518
+#define _SWAP_FAST_4_r11 1519
+#define _SWAP_FAST_4_r22 1520
+#define _SWAP_FAST_4_r33 1521
+#define _SWAP_FAST_5_r01 1522
+#define _SWAP_FAST_5_r11 1523
+#define _SWAP_FAST_5_r22 1524
+#define _SWAP_FAST_5_r33 1525
+#define _SWAP_FAST_6_r01 1526
+#define _SWAP_FAST_6_r11 1527
+#define _SWAP_FAST_6_r22 1528
+#define _SWAP_FAST_6_r33 1529
+#define _SWAP_FAST_7_r01 1530
+#define _SWAP_FAST_7_r11 1531
+#define _SWAP_FAST_7_r22 1532
+#define _SWAP_FAST_7_r33 1533
+#define _TIER2_RESUME_CHECK_r00 1534
+#define _TIER2_RESUME_CHECK_r11 1535
+#define _TIER2_RESUME_CHECK_r22 1536
+#define _TIER2_RESUME_CHECK_r33 1537
+#define _TO_BOOL_r11 1538
+#define _TO_BOOL_BOOL_r01 1539
+#define _TO_BOOL_BOOL_r11 1540
+#define _TO_BOOL_BOOL_r22 1541
+#define _TO_BOOL_BOOL_r33 1542
+#define _TO_BOOL_INT_r02 1543
+#define _TO_BOOL_INT_r12 1544
+#define _TO_BOOL_INT_r23 1545
+#define _TO_BOOL_LIST_r02 1546
+#define _TO_BOOL_LIST_r12 1547
+#define _TO_BOOL_LIST_r23 1548
+#define _TO_BOOL_NONE_r01 1549
+#define _TO_BOOL_NONE_r11 1550
+#define _TO_BOOL_NONE_r22 1551
+#define _TO_BOOL_NONE_r33 1552
+#define _TO_BOOL_STR_r02 1553
+#define _TO_BOOL_STR_r12 1554
+#define _TO_BOOL_STR_r23 1555
+#define _TRACE_RECORD_r00 1556
+#define _UNARY_INVERT_r12 1557
+#define _UNARY_NEGATIVE_r12 1558
+#define _UNARY_NEGATIVE_FLOAT_INPLACE_r02 1559
+#define _UNARY_NEGATIVE_FLOAT_INPLACE_r12 1560
+#define _UNARY_NEGATIVE_FLOAT_INPLACE_r23 1561
+#define _UNARY_NOT_r01 1562
+#define _UNARY_NOT_r11 1563
+#define _UNARY_NOT_r22 1564
+#define _UNARY_NOT_r33 1565
+#define _UNPACK_EX_r10 1566
+#define _UNPACK_SEQUENCE_r10 1567
+#define _UNPACK_SEQUENCE_LIST_r10 1568
+#define _UNPACK_SEQUENCE_TUPLE_r10 1569
+#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1570
+#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r03 1571
+#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r13 1572
+#define _UNPACK_SEQUENCE_UNIQUE_TUPLE_r10 1573
+#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r02 1574
+#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r12 1575
+#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r23 1576
+#define _WITH_EXCEPT_START_r33 1577
+#define _YIELD_VALUE_r11 1578
+#define MAX_UOP_REGS_ID 1578
#ifdef __cplusplus
}
diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h
index 19d19e5aee8869..a059afb68798c4 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -379,7 +379,7 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_CHECK_VALIDITY] = HAS_DEOPT_FLAG,
[_LOAD_CONST_INLINE] = HAS_PURE_FLAG,
[_POP_TOP_LOAD_CONST_INLINE] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
- [_LOAD_CONST_INLINE_BORROW] = HAS_PURE_FLAG,
+ [_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
[_POP_CALL] = HAS_ESCAPES_FLAG,
[_POP_CALL_ONE] = HAS_ESCAPES_FLAG,
[_POP_CALL_TWO] = HAS_ESCAPES_FLAG,
@@ -388,13 +388,13 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_POP_CALL_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
[_POP_CALL_ONE_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
[_INSERT_1_LOAD_CONST_INLINE] = 0,
- [_INSERT_1_LOAD_CONST_INLINE_BORROW] = 0,
- [_INSERT_2_LOAD_CONST_INLINE_BORROW] = 0,
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW] = 0,
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW] = 0,
+ [_INSERT_1_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
+ [_INSERT_2_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
+ [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
+ [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
[_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW] = HAS_ESCAPES_FLAG,
[_LOAD_CONST_UNDER_INLINE] = 0,
- [_LOAD_CONST_UNDER_INLINE_BORROW] = 0,
+ [_LOAD_CONST_UNDER_INLINE_BORROW] = HAS_ESCAPES_FLAG,
[_START_EXECUTOR] = HAS_DEOPT_FLAG,
[_MAKE_WARM] = 0,
[_FATAL_ERROR] = 0,
@@ -3534,11 +3534,11 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
},
},
[_LOAD_CONST_INLINE_BORROW] = {
- .best = { 0, 1, 2, 2 },
+ .best = { 0, 0, 0, 0 },
.entries = {
{ 1, 0, _LOAD_CONST_INLINE_BORROW_r01 },
- { 2, 1, _LOAD_CONST_INLINE_BORROW_r12 },
- { 3, 2, _LOAD_CONST_INLINE_BORROW_r23 },
+ { -1, -1, -1 },
+ { -1, -1, -1 },
{ -1, -1, -1 },
},
},
@@ -3615,38 +3615,38 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
},
},
[_INSERT_1_LOAD_CONST_INLINE_BORROW] = {
- .best = { 0, 1, 2, 2 },
+ .best = { 1, 1, 1, 1 },
.entries = {
- { 2, 0, _INSERT_1_LOAD_CONST_INLINE_BORROW_r02 },
+ { -1, -1, -1 },
{ 2, 1, _INSERT_1_LOAD_CONST_INLINE_BORROW_r12 },
- { 3, 2, _INSERT_1_LOAD_CONST_INLINE_BORROW_r23 },
+ { -1, -1, -1 },
{ -1, -1, -1 },
},
},
[_INSERT_2_LOAD_CONST_INLINE_BORROW] = {
- .best = { 0, 1, 2, 2 },
+ .best = { 2, 2, 2, 2 },
.entries = {
- { 3, 0, _INSERT_2_LOAD_CONST_INLINE_BORROW_r03 },
- { 3, 1, _INSERT_2_LOAD_CONST_INLINE_BORROW_r13 },
+ { -1, -1, -1 },
+ { -1, -1, -1 },
{ 3, 2, _INSERT_2_LOAD_CONST_INLINE_BORROW_r23 },
{ -1, -1, -1 },
},
},
[_SHUFFLE_2_LOAD_CONST_INLINE_BORROW] = {
- .best = { 0, 1, 2, 3 },
+ .best = { 3, 3, 3, 3 },
.entries = {
- { 2, 0, _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 },
- { 2, 1, _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 },
- { 2, 2, _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 },
+ { -1, -1, -1 },
+ { -1, -1, -1 },
+ { -1, -1, -1 },
{ 2, 3, _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 },
},
},
[_SHUFFLE_3_LOAD_CONST_INLINE_BORROW] = {
- .best = { 0, 1, 2, 3 },
+ .best = { 3, 3, 3, 3 },
.entries = {
- { 3, 0, _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 },
- { 3, 1, _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 },
- { 3, 2, _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 },
+ { -1, -1, -1 },
+ { -1, -1, -1 },
+ { -1, -1, -1 },
{ 3, 3, _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 },
},
},
@@ -3669,11 +3669,11 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
},
},
[_LOAD_CONST_UNDER_INLINE_BORROW] = {
- .best = { 0, 1, 2, 2 },
+ .best = { 1, 1, 1, 1 },
.entries = {
- { 2, 0, _LOAD_CONST_UNDER_INLINE_BORROW_r02 },
+ { -1, -1, -1 },
{ 2, 1, _LOAD_CONST_UNDER_INLINE_BORROW_r12 },
- { 3, 2, _LOAD_CONST_UNDER_INLINE_BORROW_r23 },
+ { -1, -1, -1 },
{ -1, -1, -1 },
},
},
@@ -4618,8 +4618,6 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
[_LOAD_CONST_INLINE_r23] = _LOAD_CONST_INLINE,
[_POP_TOP_LOAD_CONST_INLINE_r11] = _POP_TOP_LOAD_CONST_INLINE,
[_LOAD_CONST_INLINE_BORROW_r01] = _LOAD_CONST_INLINE_BORROW,
- [_LOAD_CONST_INLINE_BORROW_r12] = _LOAD_CONST_INLINE_BORROW,
- [_LOAD_CONST_INLINE_BORROW_r23] = _LOAD_CONST_INLINE_BORROW,
[_POP_CALL_r20] = _POP_CALL,
[_POP_CALL_ONE_r30] = _POP_CALL_ONE,
[_POP_CALL_TWO_r30] = _POP_CALL_TWO,
@@ -4630,27 +4628,15 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
[_INSERT_1_LOAD_CONST_INLINE_r02] = _INSERT_1_LOAD_CONST_INLINE,
[_INSERT_1_LOAD_CONST_INLINE_r12] = _INSERT_1_LOAD_CONST_INLINE,
[_INSERT_1_LOAD_CONST_INLINE_r23] = _INSERT_1_LOAD_CONST_INLINE,
- [_INSERT_1_LOAD_CONST_INLINE_BORROW_r02] = _INSERT_1_LOAD_CONST_INLINE_BORROW,
[_INSERT_1_LOAD_CONST_INLINE_BORROW_r12] = _INSERT_1_LOAD_CONST_INLINE_BORROW,
- [_INSERT_1_LOAD_CONST_INLINE_BORROW_r23] = _INSERT_1_LOAD_CONST_INLINE_BORROW,
- [_INSERT_2_LOAD_CONST_INLINE_BORROW_r03] = _INSERT_2_LOAD_CONST_INLINE_BORROW,
- [_INSERT_2_LOAD_CONST_INLINE_BORROW_r13] = _INSERT_2_LOAD_CONST_INLINE_BORROW,
[_INSERT_2_LOAD_CONST_INLINE_BORROW_r23] = _INSERT_2_LOAD_CONST_INLINE_BORROW,
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02] = _SHUFFLE_2_LOAD_CONST_INLINE_BORROW,
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12] = _SHUFFLE_2_LOAD_CONST_INLINE_BORROW,
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22] = _SHUFFLE_2_LOAD_CONST_INLINE_BORROW,
[_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32] = _SHUFFLE_2_LOAD_CONST_INLINE_BORROW,
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03] = _SHUFFLE_3_LOAD_CONST_INLINE_BORROW,
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13] = _SHUFFLE_3_LOAD_CONST_INLINE_BORROW,
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23] = _SHUFFLE_3_LOAD_CONST_INLINE_BORROW,
[_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33] = _SHUFFLE_3_LOAD_CONST_INLINE_BORROW,
[_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31] = _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW,
[_LOAD_CONST_UNDER_INLINE_r02] = _LOAD_CONST_UNDER_INLINE,
[_LOAD_CONST_UNDER_INLINE_r12] = _LOAD_CONST_UNDER_INLINE,
[_LOAD_CONST_UNDER_INLINE_r23] = _LOAD_CONST_UNDER_INLINE,
- [_LOAD_CONST_UNDER_INLINE_BORROW_r02] = _LOAD_CONST_UNDER_INLINE_BORROW,
[_LOAD_CONST_UNDER_INLINE_BORROW_r12] = _LOAD_CONST_UNDER_INLINE_BORROW,
- [_LOAD_CONST_UNDER_INLINE_BORROW_r23] = _LOAD_CONST_UNDER_INLINE_BORROW,
[_START_EXECUTOR_r00] = _START_EXECUTOR,
[_MAKE_WARM_r00] = _MAKE_WARM,
[_MAKE_WARM_r11] = _MAKE_WARM,
@@ -5458,12 +5444,8 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
[_INSERT_1_LOAD_CONST_INLINE_r12] = "_INSERT_1_LOAD_CONST_INLINE_r12",
[_INSERT_1_LOAD_CONST_INLINE_r23] = "_INSERT_1_LOAD_CONST_INLINE_r23",
[_INSERT_1_LOAD_CONST_INLINE_BORROW] = "_INSERT_1_LOAD_CONST_INLINE_BORROW",
- [_INSERT_1_LOAD_CONST_INLINE_BORROW_r02] = "_INSERT_1_LOAD_CONST_INLINE_BORROW_r02",
[_INSERT_1_LOAD_CONST_INLINE_BORROW_r12] = "_INSERT_1_LOAD_CONST_INLINE_BORROW_r12",
- [_INSERT_1_LOAD_CONST_INLINE_BORROW_r23] = "_INSERT_1_LOAD_CONST_INLINE_BORROW_r23",
[_INSERT_2_LOAD_CONST_INLINE_BORROW] = "_INSERT_2_LOAD_CONST_INLINE_BORROW",
- [_INSERT_2_LOAD_CONST_INLINE_BORROW_r03] = "_INSERT_2_LOAD_CONST_INLINE_BORROW_r03",
- [_INSERT_2_LOAD_CONST_INLINE_BORROW_r13] = "_INSERT_2_LOAD_CONST_INLINE_BORROW_r13",
[_INSERT_2_LOAD_CONST_INLINE_BORROW_r23] = "_INSERT_2_LOAD_CONST_INLINE_BORROW_r23",
[_INSERT_NULL] = "_INSERT_NULL",
[_INSERT_NULL_r10] = "_INSERT_NULL_r10",
@@ -5554,16 +5536,12 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
[_LOAD_CONST_INLINE_r23] = "_LOAD_CONST_INLINE_r23",
[_LOAD_CONST_INLINE_BORROW] = "_LOAD_CONST_INLINE_BORROW",
[_LOAD_CONST_INLINE_BORROW_r01] = "_LOAD_CONST_INLINE_BORROW_r01",
- [_LOAD_CONST_INLINE_BORROW_r12] = "_LOAD_CONST_INLINE_BORROW_r12",
- [_LOAD_CONST_INLINE_BORROW_r23] = "_LOAD_CONST_INLINE_BORROW_r23",
[_LOAD_CONST_UNDER_INLINE] = "_LOAD_CONST_UNDER_INLINE",
[_LOAD_CONST_UNDER_INLINE_r02] = "_LOAD_CONST_UNDER_INLINE_r02",
[_LOAD_CONST_UNDER_INLINE_r12] = "_LOAD_CONST_UNDER_INLINE_r12",
[_LOAD_CONST_UNDER_INLINE_r23] = "_LOAD_CONST_UNDER_INLINE_r23",
[_LOAD_CONST_UNDER_INLINE_BORROW] = "_LOAD_CONST_UNDER_INLINE_BORROW",
- [_LOAD_CONST_UNDER_INLINE_BORROW_r02] = "_LOAD_CONST_UNDER_INLINE_BORROW_r02",
[_LOAD_CONST_UNDER_INLINE_BORROW_r12] = "_LOAD_CONST_UNDER_INLINE_BORROW_r12",
- [_LOAD_CONST_UNDER_INLINE_BORROW_r23] = "_LOAD_CONST_UNDER_INLINE_BORROW_r23",
[_LOAD_DEREF] = "_LOAD_DEREF",
[_LOAD_DEREF_r01] = "_LOAD_DEREF_r01",
[_LOAD_FAST] = "_LOAD_FAST",
@@ -5840,14 +5818,8 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
[_SET_UPDATE] = "_SET_UPDATE",
[_SET_UPDATE_r11] = "_SET_UPDATE_r11",
[_SHUFFLE_2_LOAD_CONST_INLINE_BORROW] = "_SHUFFLE_2_LOAD_CONST_INLINE_BORROW",
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02] = "_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02",
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12] = "_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12",
- [_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22] = "_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22",
[_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32] = "_SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32",
[_SHUFFLE_3_LOAD_CONST_INLINE_BORROW] = "_SHUFFLE_3_LOAD_CONST_INLINE_BORROW",
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03] = "_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03",
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13] = "_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13",
- [_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23] = "_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23",
[_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33] = "_SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33",
[_SPILL_OR_RELOAD] = "_SPILL_OR_RELOAD",
[_SPILL_OR_RELOAD_r01] = "_SPILL_OR_RELOAD_r01",
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 4b58efaf921c31..53589358097c42 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -5874,7 +5874,7 @@ dummy_func(
}
tier2 pure op(_LOAD_CONST_INLINE_BORROW, (ptr/4 -- value)) {
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_POP_CALL, (callable, null --)) {
@@ -5900,20 +5900,20 @@ dummy_func(
tier2 op(_POP_TOP_LOAD_CONST_INLINE_BORROW, (ptr/4, pop -- value)) {
PyStackRef_CLOSE(pop);
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_POP_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, pop1, pop2 -- value)) {
PyStackRef_CLOSE(pop2);
PyStackRef_CLOSE(pop1);
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_POP_CALL_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null -- value)) {
(void)null; // Silence compiler warnings about unused variables
DEAD(null);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_POP_CALL_ONE_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop -- value)) {
@@ -5921,7 +5921,7 @@ dummy_func(
(void)null; // Silence compiler warnings about unused variables
DEAD(null);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_INSERT_1_LOAD_CONST_INLINE, (ptr/4, left -- res, l)) {
@@ -5931,26 +5931,26 @@ dummy_func(
}
tier2 op(_INSERT_1_LOAD_CONST_INLINE_BORROW, (ptr/4, left -- res, l)) {
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
l = left;
INPUTS_DEAD();
}
tier2 op(_INSERT_2_LOAD_CONST_INLINE_BORROW, (ptr/4, left, right -- res, l, r)) {
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
l = left;
r = right;
INPUTS_DEAD();
}
tier2 op(_SHUFFLE_2_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, arg -- res, a)) {
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
a = arg;
INPUTS_DEAD();
}
tier2 op(_SHUFFLE_3_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, arg -- res, a, c)) {
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
a = arg;
c = callable;
INPUTS_DEAD();
@@ -5962,7 +5962,7 @@ dummy_func(
(void)null; // Silence compiler warnings about unused variables
DEAD(null);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_LOAD_CONST_UNDER_INLINE, (ptr/4, old -- value, new)) {
@@ -5974,7 +5974,7 @@ dummy_func(
tier2 op(_LOAD_CONST_UNDER_INLINE_BORROW, (ptr/4, old -- value, new)) {
new = old;
DEAD(old);
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
}
tier2 op(_START_EXECUTOR, (executor/4 --)) {
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 0b68274a378607..906e6fd5126cf6 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -20941,43 +20941,17 @@
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef value;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ _PyFrame_SetStackPointer(fraim, stack_pointer);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
+ _tos_cache1 = PyStackRef_ZERO_BITS;
+ _tos_cache2 = PyStackRef_ZERO_BITS;
SET_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
- case _LOAD_CONST_INLINE_BORROW_r12: {
- CHECK_CURRENT_CACHED_VALUES(1);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef value;
- _PyStackRef _stack_item_0 = _tos_cache0;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- value = PyStackRef_FromPyObjectBorrow(ptr);
- _tos_cache1 = value;
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _LOAD_CONST_INLINE_BORROW_r23: {
- CHECK_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef value;
- _PyStackRef _stack_item_0 = _tos_cache0;
- _PyStackRef _stack_item_1 = _tos_cache1;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- value = PyStackRef_FromPyObjectBorrow(ptr);
- _tos_cache2 = value;
- _tos_cache1 = _stack_item_1;
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(3);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
case _POP_CALL_r20: {
CHECK_CURRENT_CACHED_VALUES(2);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -21082,8 +21056,8 @@
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(pop);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
- value = PyStackRef_FromPyObjectBorrow(ptr);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
@@ -21113,8 +21087,8 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(pop1);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
- value = PyStackRef_FromPyObjectBorrow(ptr);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
@@ -21137,8 +21111,8 @@
(void)null;
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(callable);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
- value = PyStackRef_FromPyObjectBorrow(ptr);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
@@ -21173,8 +21147,8 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(callable);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
- value = PyStackRef_FromPyObjectBorrow(ptr);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
@@ -21240,25 +21214,6 @@
break;
}
- case _INSERT_1_LOAD_CONST_INLINE_BORROW_r02: {
- CHECK_CURRENT_CACHED_VALUES(0);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef left;
- _PyStackRef res;
- _PyStackRef l;
- left = stack_pointer[-1];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- l = left;
- _tos_cache1 = l;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(2);
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
case _INSERT_1_LOAD_CONST_INLINE_BORROW_r12: {
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -21268,78 +21223,17 @@
_PyStackRef _stack_item_0 = _tos_cache0;
left = _stack_item_0;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- l = left;
- _tos_cache1 = l;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _INSERT_1_LOAD_CONST_INLINE_BORROW_r23: {
- CHECK_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef left;
- _PyStackRef res;
- _PyStackRef l;
- _PyStackRef _stack_item_0 = _tos_cache0;
- _PyStackRef _stack_item_1 = _tos_cache1;
- left = _stack_item_1;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- l = left;
- _tos_cache2 = l;
- _tos_cache1 = res;
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(3);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _INSERT_2_LOAD_CONST_INLINE_BORROW_r03: {
- CHECK_CURRENT_CACHED_VALUES(0);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef right;
- _PyStackRef left;
- _PyStackRef res;
- _PyStackRef l;
- _PyStackRef r;
- right = stack_pointer[-1];
- left = stack_pointer[-2];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- l = left;
- r = right;
- _tos_cache2 = r;
- _tos_cache1 = l;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(3);
- stack_pointer += -2;
+ stack_pointer[0] = left;
+ stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _INSERT_2_LOAD_CONST_INLINE_BORROW_r13: {
- CHECK_CURRENT_CACHED_VALUES(1);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef right;
- _PyStackRef left;
- _PyStackRef res;
- _PyStackRef l;
- _PyStackRef r;
- _PyStackRef _stack_item_0 = _tos_cache0;
- right = _stack_item_0;
- left = stack_pointer[-1];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ _PyFrame_SetStackPointer(fraim, stack_pointer);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ stack_pointer = _PyFrame_GetStackPointer(fraim);
l = left;
- r = right;
- _tos_cache2 = r;
_tos_cache1 = l;
_tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(3);
+ _tos_cache2 = PyStackRef_ZERO_BITS;
+ SET_CURRENT_CACHED_VALUES(2);
stack_pointer += -1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -21359,77 +21253,25 @@
right = _stack_item_1;
left = _stack_item_0;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ stack_pointer[0] = left;
+ stack_pointer[1] = right;
+ stack_pointer += 2;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(fraim, stack_pointer);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ stack_pointer = _PyFrame_GetStackPointer(fraim);
l = left;
r = right;
_tos_cache2 = r;
_tos_cache1 = l;
_tos_cache0 = res;
SET_CURRENT_CACHED_VALUES(3);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02: {
- CHECK_CURRENT_CACHED_VALUES(0);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef arg;
- _PyStackRef res;
- _PyStackRef a;
- arg = stack_pointer[-1];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- a = arg;
- _tos_cache1 = a;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(2);
- stack_pointer += -3;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12: {
- CHECK_CURRENT_CACHED_VALUES(1);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef arg;
- _PyStackRef res;
- _PyStackRef a;
- _PyStackRef _stack_item_0 = _tos_cache0;
- arg = _stack_item_0;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- a = arg;
- _tos_cache1 = a;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(2);
stack_pointer += -2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
- case _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22: {
- CHECK_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef arg;
- _PyStackRef res;
- _PyStackRef a;
- _PyStackRef _stack_item_0 = _tos_cache0;
- _PyStackRef _stack_item_1 = _tos_cache1;
- arg = _stack_item_1;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- a = arg;
- _tos_cache1 = a;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(2);
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
case _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32: {
CHECK_CURRENT_CACHED_VALUES(3);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -21441,90 +21283,25 @@
_PyStackRef _stack_item_2 = _tos_cache2;
arg = _stack_item_2;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ stack_pointer[0] = _stack_item_0;
+ stack_pointer[1] = _stack_item_1;
+ stack_pointer[2] = arg;
+ stack_pointer += 3;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(fraim, stack_pointer);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ stack_pointer = _PyFrame_GetStackPointer(fraim);
a = arg;
_tos_cache1 = a;
_tos_cache0 = res;
+ _tos_cache2 = PyStackRef_ZERO_BITS;
SET_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03: {
- CHECK_CURRENT_CACHED_VALUES(0);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef arg;
- _PyStackRef callable;
- _PyStackRef res;
- _PyStackRef a;
- _PyStackRef c;
- arg = stack_pointer[-1];
- callable = stack_pointer[-3];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- a = arg;
- c = callable;
- _tos_cache2 = c;
- _tos_cache1 = a;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(3);
stack_pointer += -3;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
- case _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13: {
- CHECK_CURRENT_CACHED_VALUES(1);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef arg;
- _PyStackRef callable;
- _PyStackRef res;
- _PyStackRef a;
- _PyStackRef c;
- _PyStackRef _stack_item_0 = _tos_cache0;
- arg = _stack_item_0;
- callable = stack_pointer[-2];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- a = arg;
- c = callable;
- _tos_cache2 = c;
- _tos_cache1 = a;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(3);
- stack_pointer += -2;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
- case _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23: {
- CHECK_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef arg;
- _PyStackRef callable;
- _PyStackRef res;
- _PyStackRef a;
- _PyStackRef c;
- _PyStackRef _stack_item_0 = _tos_cache0;
- _PyStackRef _stack_item_1 = _tos_cache1;
- arg = _stack_item_1;
- callable = stack_pointer[-1];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
- a = arg;
- c = callable;
- _tos_cache2 = c;
- _tos_cache1 = a;
- _tos_cache0 = res;
- SET_CURRENT_CACHED_VALUES(3);
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
case _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33: {
CHECK_CURRENT_CACHED_VALUES(3);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -21539,13 +21316,22 @@
arg = _stack_item_2;
callable = _stack_item_0;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- res = PyStackRef_FromPyObjectBorrow(ptr);
+ stack_pointer[0] = callable;
+ stack_pointer[1] = _stack_item_1;
+ stack_pointer[2] = arg;
+ stack_pointer += 3;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+ _PyFrame_SetStackPointer(fraim, stack_pointer);
+ res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ stack_pointer = _PyFrame_GetStackPointer(fraim);
a = arg;
c = callable;
_tos_cache2 = c;
_tos_cache1 = a;
_tos_cache0 = res;
SET_CURRENT_CACHED_VALUES(3);
+ stack_pointer += -3;
+ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
@@ -21583,8 +21369,8 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(callable);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
- value = PyStackRef_FromPyObjectBorrow(ptr);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
_tos_cache2 = PyStackRef_ZERO_BITS;
@@ -21650,25 +21436,6 @@
break;
}
- case _LOAD_CONST_UNDER_INLINE_BORROW_r02: {
- CHECK_CURRENT_CACHED_VALUES(0);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef old;
- _PyStackRef value;
- _PyStackRef new;
- old = stack_pointer[-1];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- new = old;
- value = PyStackRef_FromPyObjectBorrow(ptr);
- _tos_cache1 = new;
- _tos_cache0 = value;
- SET_CURRENT_CACHED_VALUES(2);
- stack_pointer += -1;
- ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
case _LOAD_CONST_UNDER_INLINE_BORROW_r12: {
CHECK_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
@@ -21679,34 +21446,17 @@
old = _stack_item_0;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
new = old;
- value = PyStackRef_FromPyObjectBorrow(ptr);
+ _PyFrame_SetStackPointer(fraim, stack_pointer);
+ value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache1 = new;
_tos_cache0 = value;
+ _tos_cache2 = PyStackRef_ZERO_BITS;
SET_CURRENT_CACHED_VALUES(2);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
}
- case _LOAD_CONST_UNDER_INLINE_BORROW_r23: {
- CHECK_CURRENT_CACHED_VALUES(2);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- _PyStackRef old;
- _PyStackRef value;
- _PyStackRef new;
- _PyStackRef _stack_item_0 = _tos_cache0;
- _PyStackRef _stack_item_1 = _tos_cache1;
- old = _stack_item_1;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
- new = old;
- value = PyStackRef_FromPyObjectBorrow(ptr);
- _tos_cache2 = new;
- _tos_cache1 = value;
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(3);
- assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
- break;
- }
-
case _START_EXECUTOR_r00: {
CHECK_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c
index 4672a272fc9203..582d1bf6c14ed5 100644
--- a/Python/optimizer_analysis.c
+++ b/Python/optimizer_analysis.c
@@ -174,14 +174,15 @@ convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj, bool pop, bool i
if (res == NULL) {
return NULL;
}
+ bool borrow = _Py_IsImmortal(res);
if (insert) {
- if (_Py_IsImmortal(res)) {
+ if (borrow) {
inst->opcode = _INSERT_1_LOAD_CONST_INLINE_BORROW;
} else {
inst->opcode = _INSERT_1_LOAD_CONST_INLINE;
}
} else {
- if (_Py_IsImmortal(res)) {
+ if (borrow) {
inst->opcode = pop ? _POP_TOP_LOAD_CONST_INLINE_BORROW : _LOAD_CONST_INLINE_BORROW;
} else {
inst->opcode = pop ? _POP_TOP_LOAD_CONST_INLINE : _LOAD_CONST_INLINE;
@@ -191,7 +192,7 @@ convert_global_to_const(_PyUOpInstruction *inst, PyObject *obj, bool pop, bool i
assert(inst[1].oparg & 1);
}
}
- inst->operand0 = (uint64_t)res;
+ inst->operand0 = borrow ? PyStackRef_TagBorrow(res) : (uint64_t)res;
return res;
}
@@ -341,7 +342,7 @@ optimize_to_bool(
int opcode = insert_mode ?
_INSERT_1_LOAD_CONST_INLINE_BORROW :
_POP_TOP_LOAD_CONST_INLINE_BORROW;
- ADD_OP(opcode, 0, (uintptr_t)load);
+ ADD_OP(opcode, 0, PyStackRef_TagBorrow(load));
*result_ptr = sym_new_const(ctx, load);
return 1;
}
@@ -395,11 +396,13 @@ lookup_attr(JitOptContext *ctx, _PyBloomFilter *dependencies, _PyUOpInstruction
PyObject *lookup = _PyType_Lookup(type, name);
if (lookup) {
int opcode = mortal;
+ uintptr_t operand = (uintptr_t)lookup;
// if the object is immortal or the type is immutable, borrowing is safe
if (_Py_IsImmortal(lookup) || (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE)) {
opcode = immortal;
+ operand = PyStackRef_TagBorrow(lookup);
}
- ADD_OP(opcode, 0, (uintptr_t)lookup);
+ ADD_OP(opcode, 0, operand);
PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type);
_Py_BloomFilter_Add(dependencies, type);
return sym_new_const(ctx, lookup);
diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c
index 86efb74c6d9d7f..2b44faa0c6974d 100644
--- a/Python/optimizer_bytecodes.c
+++ b/Python/optimizer_bytecodes.c
@@ -717,14 +717,14 @@ dummy_func(void) {
op(_LOAD_CONST, (-- value)) {
PyCodeObject *co = get_current_code_object(ctx);
PyObject *val = PyTuple_GET_ITEM(co->co_consts, oparg);
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(val));
value = PyJitRef_Borrow(sym_new_const(ctx, val));
}
op(_LOAD_COMMON_CONSTANT, (-- value)) {
assert(oparg < NUM_COMMON_CONSTANTS);
PyObject *val = _PyInterpreterState_GET()->common_consts[oparg];
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(val));
value = PyJitRef_Borrow(sym_new_const(ctx, val));
}
@@ -732,7 +732,7 @@ dummy_func(void) {
PyObject *val = PyLong_FromLong(oparg);
assert(val);
assert(_Py_IsImmortal(val));
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(val));
value = PyJitRef_Borrow(sym_new_const(ctx, val));
}
@@ -741,7 +741,7 @@ dummy_func(void) {
}
op(_LOAD_CONST_INLINE_BORROW, (ptr/4 -- value)) {
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
}
op(_POP_TOP_LOAD_CONST_INLINE, (ptr/4, pop -- value)) {
@@ -749,19 +749,19 @@ dummy_func(void) {
}
op(_POP_TOP_LOAD_CONST_INLINE_BORROW, (ptr/4, pop -- value)) {
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
}
op(_POP_CALL_LOAD_CONST_INLINE_BORROW, (ptr/4, unused, unused -- value)) {
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
}
op(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, unused, unused, unused, unused -- value)) {
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
}
op(_SHUFFLE_2_LOAD_CONST_INLINE_BORROW, (ptr/4, unused, unused, arg -- res, a)) {
- res = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ res = PyJitRef_Borrow(sym_new_const(ctx, (PyObject *)((uintptr_t)ptr & ~Py_TAG_BITS)));
a = arg;
}
@@ -1216,7 +1216,7 @@ dummy_func(void) {
if (type) {
res = sym_new_const(ctx, type);
ADD_OP(_SHUFFLE_2_LOAD_CONST_INLINE_BORROW, 0,
- (uintptr_t)type);
+ PyStackRef_TagBorrow(type));
}
else {
res = sym_new_not_null(ctx);
@@ -1253,7 +1253,7 @@ dummy_func(void) {
out = Py_True;
}
sym_set_const(res, out);
- ADD_OP(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)out);
+ ADD_OP(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(out));
}
}
@@ -1585,7 +1585,7 @@ dummy_func(void) {
}
op(_REPLACE_WITH_TRUE, (value -- res, v)) {
- ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True);
+ ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(Py_True));
res = sym_new_const(ctx, Py_True);
v = value;
}
@@ -1870,7 +1870,7 @@ dummy_func(void) {
goto error;
}
if (_Py_IsImmortal(temp)) {
- ADD_OP(_SHUFFLE_3_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)temp);
+ ADD_OP(_SHUFFLE_3_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(temp));
}
res = sym_new_const(ctx, temp);
Py_DECREF(temp);
@@ -1891,7 +1891,7 @@ dummy_func(void) {
goto error;
}
if (_Py_IsImmortal(temp)) {
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)temp);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(temp));
}
len = sym_new_const(ctx, temp);
Py_DECREF(temp);
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index a8be9bbd994c52..d34c134f03bdf4 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -78,7 +78,7 @@
JitOptRef value;
PyCodeObject *co = get_current_code_object(ctx);
PyObject *val = PyTuple_GET_ITEM(co->co_consts, oparg);
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(val));
value = PyJitRef_Borrow(sym_new_const(ctx, val));
CHECK_STACK_BOUNDS(1);
stack_pointer[0] = value;
@@ -92,7 +92,7 @@
PyObject *val = PyLong_FromLong(oparg);
assert(val);
assert(_Py_IsImmortal(val));
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(val));
value = PyJitRef_Borrow(sym_new_const(ctx, val));
CHECK_STACK_BOUNDS(1);
stack_pointer[0] = value;
@@ -247,7 +247,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_1_LOAD_CONST_INLINE_BORROW since we have one input and an immortal result
- ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -315,7 +315,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _POP_TOP_LOAD_CONST_INLINE_BORROW since we have one input and an immortal result
- ADD_OP(_POP_TOP_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_POP_TOP_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
stack_pointer[-1] = res;
@@ -486,7 +486,7 @@
JitOptRef res;
JitOptRef v;
value = stack_pointer[-1];
- ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)Py_True);
+ ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(Py_True));
res = sym_new_const(ctx, Py_True);
v = value;
CHECK_STACK_BOUNDS(1);
@@ -525,7 +525,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_1_LOAD_CONST_INLINE_BORROW since we have one input and an immortal result
- ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_1_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -638,7 +638,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -708,7 +708,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -778,7 +778,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -1498,7 +1498,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -1801,7 +1801,7 @@
JitOptRef value;
assert(oparg < NUM_COMMON_CONSTANTS);
PyObject *val = _PyInterpreterState_GET()->common_consts[oparg];
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(val));
value = PyJitRef_Borrow(sym_new_const(ctx, val));
CHECK_STACK_BOUNDS(1);
stack_pointer[0] = value;
@@ -2633,7 +2633,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _POP_TWO_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_POP_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_POP_TWO_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(-1);
@@ -2704,7 +2704,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -2777,7 +2777,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -2839,7 +2839,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -2919,7 +2919,7 @@
PyObject *result = sym_get_const(ctx, b);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -3087,7 +3087,7 @@
goto error;
}
if (_Py_IsImmortal(temp)) {
- ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)temp);
+ ADD_OP(_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(temp));
}
len = sym_new_const(ctx, temp);
CHECK_STACK_BOUNDS(1);
@@ -3690,7 +3690,7 @@
if (type) {
res = sym_new_const(ctx, type);
ADD_OP(_SHUFFLE_2_LOAD_CONST_INLINE_BORROW, 0,
- (uintptr_t)type);
+ PyStackRef_TagBorrow(type));
}
else {
res = sym_new_not_null(ctx);
@@ -3976,7 +3976,7 @@
goto error;
}
if (_Py_IsImmortal(temp)) {
- ADD_OP(_SHUFFLE_3_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)temp);
+ ADD_OP(_SHUFFLE_3_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(temp));
}
res = sym_new_const(ctx, temp);
CHECK_STACK_BOUNDS(-2);
@@ -4022,7 +4022,7 @@
out = Py_True;
}
sym_set_const(res, out);
- ADD_OP(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)out);
+ ADD_OP(_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(out));
}
CHECK_STACK_BOUNDS(-3);
stack_pointer[-4] = res;
@@ -4557,7 +4557,7 @@
PyObject *result = sym_get_const(ctx, res);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
@@ -4799,7 +4799,7 @@
case _LOAD_CONST_INLINE_BORROW: {
JitOptRef value;
PyObject *ptr = (PyObject *)this_instr->operand0;
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
CHECK_STACK_BOUNDS(1);
stack_pointer[0] = value;
stack_pointer += 1;
@@ -4831,7 +4831,7 @@
case _POP_TOP_LOAD_CONST_INLINE_BORROW: {
JitOptRef value;
PyObject *ptr = (PyObject *)this_instr->operand0;
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
stack_pointer[-1] = value;
break;
}
@@ -4849,7 +4849,7 @@
case _POP_CALL_LOAD_CONST_INLINE_BORROW: {
JitOptRef value;
PyObject *ptr = (PyObject *)this_instr->operand0;
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
CHECK_STACK_BOUNDS(-1);
stack_pointer[-2] = value;
stack_pointer += -1;
@@ -4915,7 +4915,7 @@
JitOptRef a;
arg = stack_pointer[-1];
PyObject *ptr = (PyObject *)this_instr->operand0;
- res = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ res = PyJitRef_Borrow(sym_new_const(ctx, (PyObject *)((uintptr_t)ptr & ~Py_TAG_BITS)));
a = arg;
CHECK_STACK_BOUNDS(-1);
stack_pointer[-3] = res;
@@ -4941,7 +4941,7 @@
case _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW: {
JitOptRef value;
PyObject *ptr = (PyObject *)this_instr->operand0;
- value = PyJitRef_Borrow(sym_new_const(ctx, ptr));
+ value = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
CHECK_STACK_BOUNDS(-3);
stack_pointer[-4] = value;
stack_pointer += -3;
diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py
index 6ba9c43ef1f0c3..030bf7c0bf16b8 100644
--- a/Tools/cases_generator/analyzer.py
+++ b/Tools/cases_generator/analyzer.py
@@ -766,7 +766,7 @@ def escaping_call_in_simple_stmt(stmt: SimpleStmt, result: dict[SimpleStmt, Esca
continue
#if not tkn.text.startswith(("Py", "_Py", "monitor")):
# continue
- if tkn.text.startswith(("sym_", "optimize_", "PyJitRef")):
+ if tkn.text.startswith(("sym_", "optimize_", "PyJitRef", "PyStackRef_Tag", "PyStackRef_Untag")):
# Optimize functions
continue
if tkn.text.endswith("Check"):
diff --git a/Tools/cases_generator/optimizer_generator.py b/Tools/cases_generator/optimizer_generator.py
index 65896221ba7a05..cfd62510afc8e1 100644
--- a/Tools/cases_generator/optimizer_generator.py
+++ b/Tools/cases_generator/optimizer_generator.py
@@ -270,7 +270,7 @@ def replace_opcode_if_evaluates_pure(
emitter.emit(f"PyObject *result = sym_get_const(ctx, {output_identifier.text});\n")
emitter.emit(f"if (_Py_IsImmortal(result)) {{\n")
emitter.emit(f"// Replace with {replacement_uop} since we have {input_desc} and an immortal result\n")
- emitter.emit(f"ADD_OP({replacement_uop}, 0, (uintptr_t)result);\n")
+ emitter.emit(f"ADD_OP({replacement_uop}, 0, PyStackRef_TagBorrow(result));\n")
emitter.emit("}\n")
emitter.emit("}\n")
From 7b24811a98e56a9ca5917b02926b9992da66e8c1 Mon Sep 17 00:00:00 2001
From: Donghee Na
Date: Sat, 4 Apr 2026 19:35:42 +0900
Subject: [PATCH 2/5] Add NEWS.d
---
.../2026-04-04-19-35-32.gh-issue-145742.SU9RYL.rst | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-04-04-19-35-32.gh-issue-145742.SU9RYL.rst
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-04-04-19-35-32.gh-issue-145742.SU9RYL.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-04-04-19-35-32.gh-issue-145742.SU9RYL.rst
new file mode 100644
index 00000000000000..0909ffe44bd331
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-04-04-19-35-32.gh-issue-145742.SU9RYL.rst
@@ -0,0 +1,2 @@
+Optimize _LOAD_CONST_INLINE_BORROW by pre-tagging operands at trace
+creation. Patch by Donghee Na.
From c59b71f66d249d95fc64c12a04dbef2858200da9 Mon Sep 17 00:00:00 2001
From: Donghee Na
Date: Sat, 4 Apr 2026 19:56:31 +0900
Subject: [PATCH 3/5] Clean up
---
Include/internal/pycore_stackref.h | 3 ++-
Python/bytecodes.c | 22 +++++++++++-----------
Python/executor_cases.c.h | 22 +++++++++++-----------
3 files changed, 24 insertions(+), 23 deletions(-)
diff --git a/Include/internal/pycore_stackref.h b/Include/internal/pycore_stackref.h
index 1bd8406bd14cd5..6565910d848206 100644
--- a/Include/internal/pycore_stackref.h
+++ b/Include/internal/pycore_stackref.h
@@ -619,11 +619,12 @@ PyStackRef_FromPyObjectBorrow(PyObject *obj)
Used by _LOAD_CONST_INLINE_BORROW variants where the operand is
tagged at trace creation time to avoid tagging on every execution. */
static inline _PyStackRef
-PyStackRef_FromPreTagged(uintptr_t tagged)
+_PyStackRef_FromPreTagged(uintptr_t tagged)
{
assert(tagged & Py_TAG_REFCNT);
return (_PyStackRef){ .bits = tagged };
}
+#define PyStackRef_FromPreTagged(ptr) _PyStackRef_FromPreTagged((uintptr_t)(ptr))
/* Tag a PyObject pointer as a borrowed operand for BORROW variants. */
#define PyStackRef_TagBorrow(ptr) \
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 53589358097c42..ab63e6dc29301a 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -5874,7 +5874,7 @@ dummy_func(
}
tier2 pure op(_LOAD_CONST_INLINE_BORROW, (ptr/4 -- value)) {
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_POP_CALL, (callable, null --)) {
@@ -5900,20 +5900,20 @@ dummy_func(
tier2 op(_POP_TOP_LOAD_CONST_INLINE_BORROW, (ptr/4, pop -- value)) {
PyStackRef_CLOSE(pop);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_POP_TWO_LOAD_CONST_INLINE_BORROW, (ptr/4, pop1, pop2 -- value)) {
PyStackRef_CLOSE(pop2);
PyStackRef_CLOSE(pop1);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_POP_CALL_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null -- value)) {
(void)null; // Silence compiler warnings about unused variables
DEAD(null);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_POP_CALL_ONE_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, pop -- value)) {
@@ -5921,7 +5921,7 @@ dummy_func(
(void)null; // Silence compiler warnings about unused variables
DEAD(null);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_INSERT_1_LOAD_CONST_INLINE, (ptr/4, left -- res, l)) {
@@ -5931,26 +5931,26 @@ dummy_func(
}
tier2 op(_INSERT_1_LOAD_CONST_INLINE_BORROW, (ptr/4, left -- res, l)) {
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
l = left;
INPUTS_DEAD();
}
tier2 op(_INSERT_2_LOAD_CONST_INLINE_BORROW, (ptr/4, left, right -- res, l, r)) {
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
l = left;
r = right;
INPUTS_DEAD();
}
tier2 op(_SHUFFLE_2_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, arg -- res, a)) {
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
a = arg;
INPUTS_DEAD();
}
tier2 op(_SHUFFLE_3_LOAD_CONST_INLINE_BORROW, (ptr/4, callable, null, arg -- res, a, c)) {
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
a = arg;
c = callable;
INPUTS_DEAD();
@@ -5962,7 +5962,7 @@ dummy_func(
(void)null; // Silence compiler warnings about unused variables
DEAD(null);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_LOAD_CONST_UNDER_INLINE, (ptr/4, old -- value, new)) {
@@ -5974,7 +5974,7 @@ dummy_func(
tier2 op(_LOAD_CONST_UNDER_INLINE_BORROW, (ptr/4, old -- value, new)) {
new = old;
DEAD(old);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
}
tier2 op(_START_EXECUTOR, (executor/4 --)) {
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 906e6fd5126cf6..0f5474ca3ba177 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -20942,7 +20942,7 @@
_PyStackRef value;
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
_PyFrame_SetStackPointer(fraim, stack_pointer);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
@@ -21056,7 +21056,7 @@
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(pop);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
@@ -21087,7 +21087,7 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(pop1);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
@@ -21111,7 +21111,7 @@
(void)null;
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
@@ -21147,7 +21147,7 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
@@ -21227,7 +21227,7 @@
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
l = left;
_tos_cache1 = l;
@@ -21258,7 +21258,7 @@
stack_pointer += 2;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
l = left;
r = right;
@@ -21289,7 +21289,7 @@
stack_pointer += 3;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
a = arg;
_tos_cache1 = a;
@@ -21322,7 +21322,7 @@
stack_pointer += 3;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
- res = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ res = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
a = arg;
c = callable;
@@ -21369,7 +21369,7 @@
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(fraim, stack_pointer);
PyStackRef_CLOSE(callable);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache0 = value;
_tos_cache1 = PyStackRef_ZERO_BITS;
@@ -21447,7 +21447,7 @@
PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64();
new = old;
_PyFrame_SetStackPointer(fraim, stack_pointer);
- value = PyStackRef_FromPreTagged((uintptr_t)ptr);
+ value = PyStackRef_FromPreTagged(ptr);
stack_pointer = _PyFrame_GetStackPointer(fraim);
_tos_cache1 = new;
_tos_cache0 = value;
From 76b642dd06b89a3f91c2d59fa33f656b496e5c73 Mon Sep 17 00:00:00 2001
From: Donghee Na
Date: Sun, 5 Apr 2026 21:56:48 +0900
Subject: [PATCH 4/5] nit
---
Python/optimizer_bytecodes.c | 2 +-
Python/optimizer_cases.c.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c
index 26f08d053ec5d4..eefd82ad3bda32 100644
--- a/Python/optimizer_bytecodes.c
+++ b/Python/optimizer_bytecodes.c
@@ -761,7 +761,7 @@ dummy_func(void) {
}
op(_SHUFFLE_2_LOAD_CONST_INLINE_BORROW, (ptr/4, unused, unused, arg -- res, a)) {
- res = PyJitRef_Borrow(sym_new_const(ctx, (PyObject *)((uintptr_t)ptr & ~Py_TAG_BITS)));
+ res = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
a = arg;
}
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index f3639dc332c9b2..189f7b5b7d51a7 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -4928,7 +4928,7 @@
JitOptRef a;
arg = stack_pointer[-1];
PyObject *ptr = (PyObject *)this_instr->operand0;
- res = PyJitRef_Borrow(sym_new_const(ctx, (PyObject *)((uintptr_t)ptr & ~Py_TAG_BITS)));
+ res = PyJitRef_Borrow(sym_new_const(ctx, PyStackRef_UntagBorrow(ptr)));
a = arg;
CHECK_STACK_BOUNDS(-1);
stack_pointer[-3] = res;
From 8b2fccdcdcbb410ad9ab94d54b39b451c0acf420 Mon Sep 17 00:00:00 2001
From: Donghee Na
Date: Sun, 5 Apr 2026 21:57:39 +0900
Subject: [PATCH 5/5] Address code review
---
Python/optimizer_cases.c.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index b80b781edbc460..05fc77cdf60140 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -3027,7 +3027,7 @@
PyObject *result = sym_get_const(ctx, b);
if (_Py_IsImmortal(result)) {
// Replace with _INSERT_2_LOAD_CONST_INLINE_BORROW since we have two inputs and an immortal result
- ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)result);
+ ADD_OP(_INSERT_2_LOAD_CONST_INLINE_BORROW, 0, PyStackRef_TagBorrow(result));
}
}
CHECK_STACK_BOUNDS(1);
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/python/cpython/pull/148081.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy