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(frame, stack_pointer); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); + stack_pointer = _PyFrame_GetStackPointer(frame); _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(frame, stack_pointer); PyStackRef_CLOSE(pop); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); stack_pointer = _PyFrame_GetStackPointer(frame); - 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(frame, stack_pointer); PyStackRef_CLOSE(pop1); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); stack_pointer = _PyFrame_GetStackPointer(frame); - 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(frame, stack_pointer); PyStackRef_CLOSE(callable); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); stack_pointer = _PyFrame_GetStackPointer(frame); - 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(frame, stack_pointer); PyStackRef_CLOSE(callable); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); stack_pointer = _PyFrame_GetStackPointer(frame); - 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(frame, stack_pointer); + res = PyStackRef_FromPreTagged((uintptr_t)ptr); + stack_pointer = _PyFrame_GetStackPointer(frame); 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(frame, stack_pointer); + res = PyStackRef_FromPreTagged((uintptr_t)ptr); + stack_pointer = _PyFrame_GetStackPointer(frame); 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(frame, stack_pointer); + res = PyStackRef_FromPreTagged((uintptr_t)ptr); + stack_pointer = _PyFrame_GetStackPointer(frame); 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(frame, stack_pointer); + res = PyStackRef_FromPreTagged((uintptr_t)ptr); + stack_pointer = _PyFrame_GetStackPointer(frame); 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(frame, stack_pointer); PyStackRef_CLOSE(callable); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); stack_pointer = _PyFrame_GetStackPointer(frame); - 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(frame, stack_pointer); + value = PyStackRef_FromPreTagged((uintptr_t)ptr); + stack_pointer = _PyFrame_GetStackPointer(frame); _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(frame, stack_pointer); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _tos_cache0 = value; _tos_cache1 = PyStackRef_ZERO_BITS; @@ -21056,7 +21056,7 @@ PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64(); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(pop); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _tos_cache0 = value; _tos_cache1 = PyStackRef_ZERO_BITS; @@ -21087,7 +21087,7 @@ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(pop1); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _tos_cache0 = value; _tos_cache1 = PyStackRef_ZERO_BITS; @@ -21111,7 +21111,7 @@ (void)null; _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(callable); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _tos_cache0 = value; _tos_cache1 = PyStackRef_ZERO_BITS; @@ -21147,7 +21147,7 @@ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(callable); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _tos_cache0 = value; _tos_cache1 = PyStackRef_ZERO_BITS; @@ -21227,7 +21227,7 @@ stack_pointer += 1; ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); - res = PyStackRef_FromPreTagged((uintptr_t)ptr); + res = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); l = left; _tos_cache1 = l; @@ -21258,7 +21258,7 @@ stack_pointer += 2; ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); - res = PyStackRef_FromPreTagged((uintptr_t)ptr); + res = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); l = left; r = right; @@ -21289,7 +21289,7 @@ stack_pointer += 3; ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); - res = PyStackRef_FromPreTagged((uintptr_t)ptr); + res = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); a = arg; _tos_cache1 = a; @@ -21322,7 +21322,7 @@ stack_pointer += 3; ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); - res = PyStackRef_FromPreTagged((uintptr_t)ptr); + res = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); a = arg; c = callable; @@ -21369,7 +21369,7 @@ ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(callable); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _tos_cache0 = value; _tos_cache1 = PyStackRef_ZERO_BITS; @@ -21447,7 +21447,7 @@ PyObject *ptr = (PyObject *)CURRENT_OPERAND0_64(); new = old; _PyFrame_SetStackPointer(frame, stack_pointer); - value = PyStackRef_FromPreTagged((uintptr_t)ptr); + value = PyStackRef_FromPreTagged(ptr); stack_pointer = _PyFrame_GetStackPointer(frame); _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);