From 269bdd16ee9ba1c5ad6a7512777c5cd764efb7ce Mon Sep 17 00:00:00 2001 From: Brij <97006829+bkap123@users.noreply.github.com> Date: Thu, 19 Mar 2026 17:53:14 -0400 Subject: [PATCH 1/3] gh-145866: Implement `POP_ITER` as macro op using `POP_TOP` As the JIT can optimize `_POP_TOP` uops, I implemented `POP_TOP` for the `POP_ITER` instruction. I am fairly confident that this is the right solution but I am new to the JIT and would welcome any feedback. --- Include/internal/pycore_opcode_metadata.h | 4 +- Include/internal/pycore_uop_ids.h | 366 +++++++++++----------- Include/internal/pycore_uop_metadata.h | 15 - Lib/test/test_capi/test_opt.py | 9 + Modules/_testinternalcapi/test_cases.c.h | 29 +- Python/bytecodes.c | 7 +- Python/executor_cases.c.h | 21 -- Python/generated_cases.c.h | 29 +- Python/optimizer_cases.c.h | 7 - 9 files changed, 232 insertions(+), 255 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index c46015c4d98239..a2a7e4f111c640 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1271,7 +1271,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [NOP] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, [NOT_TAKEN] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, [POP_EXCEPT] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, - [POP_ITER] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, + [POP_ITER] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_PURE_FLAG }, [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ESCAPES_FLAG }, [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ESCAPES_FLAG }, @@ -1490,7 +1490,7 @@ _PyOpcode_macro_expansion[256] = { [NOP] = { .nuops = 1, .uops = { { _NOP, OPARG_SIMPLE, 0 } } }, [NOT_TAKEN] = { .nuops = 1, .uops = { { _NOP, OPARG_SIMPLE, 0 } } }, [POP_EXCEPT] = { .nuops = 1, .uops = { { _POP_EXCEPT, OPARG_SIMPLE, 0 } } }, - [POP_ITER] = { .nuops = 1, .uops = { { _POP_ITER, OPARG_SIMPLE, 0 } } }, + [POP_ITER] = { .nuops = 2, .uops = { { _POP_TOP, OPARG_SIMPLE, 0 }, { _POP_TOP, OPARG_SIMPLE, 0 } } }, [POP_JUMP_IF_FALSE] = { .nuops = 1, .uops = { { _POP_JUMP_IF_FALSE, OPARG_REPLACED, 1 } } }, [POP_JUMP_IF_NONE] = { .nuops = 2, .uops = { { _IS_NONE, OPARG_SIMPLE, 1 }, { _POP_JUMP_IF_TRUE, OPARG_REPLACED, 1 } } }, [POP_JUMP_IF_NOT_NONE] = { .nuops = 2, .uops = { { _IS_NONE, OPARG_SIMPLE, 1 }, { _POP_JUMP_IF_FALSE, OPARG_REPLACED, 1 } } }, diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index b00e522c09a49a..129a26cc9576d9 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -314,7 +314,6 @@ extern "C" { #define _POP_CALL_TWO 536 #define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW 537 #define _POP_EXCEPT POP_EXCEPT -#define _POP_ITER POP_ITER #define _POP_JUMP_IF_FALSE 538 #define _POP_JUMP_IF_TRUE 539 #define _POP_TOP POP_TOP @@ -1114,189 +1113,188 @@ extern "C" { #define _POP_CALL_TWO_r30 1316 #define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1317 #define _POP_EXCEPT_r10 1318 -#define _POP_ITER_r20 1319 -#define _POP_JUMP_IF_FALSE_r00 1320 -#define _POP_JUMP_IF_FALSE_r10 1321 -#define _POP_JUMP_IF_FALSE_r21 1322 -#define _POP_JUMP_IF_FALSE_r32 1323 -#define _POP_JUMP_IF_TRUE_r00 1324 -#define _POP_JUMP_IF_TRUE_r10 1325 -#define _POP_JUMP_IF_TRUE_r21 1326 -#define _POP_JUMP_IF_TRUE_r32 1327 -#define _POP_TOP_r10 1328 -#define _POP_TOP_FLOAT_r00 1329 -#define _POP_TOP_FLOAT_r10 1330 -#define _POP_TOP_FLOAT_r21 1331 -#define _POP_TOP_FLOAT_r32 1332 -#define _POP_TOP_INT_r00 1333 -#define _POP_TOP_INT_r10 1334 -#define _POP_TOP_INT_r21 1335 -#define _POP_TOP_INT_r32 1336 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1337 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1338 -#define _POP_TOP_NOP_r00 1339 -#define _POP_TOP_NOP_r10 1340 -#define _POP_TOP_NOP_r21 1341 -#define _POP_TOP_NOP_r32 1342 -#define _POP_TOP_UNICODE_r00 1343 -#define _POP_TOP_UNICODE_r10 1344 -#define _POP_TOP_UNICODE_r21 1345 -#define _POP_TOP_UNICODE_r32 1346 -#define _POP_TWO_r20 1347 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1348 -#define _PUSH_EXC_INFO_r02 1349 -#define _PUSH_EXC_INFO_r12 1350 -#define _PUSH_EXC_INFO_r23 1351 -#define _PUSH_FRAME_r10 1352 -#define _PUSH_NULL_r01 1353 -#define _PUSH_NULL_r12 1354 -#define _PUSH_NULL_r23 1355 -#define _PUSH_NULL_CONDITIONAL_r00 1356 -#define _PY_FRAME_EX_r31 1357 -#define _PY_FRAME_GENERAL_r01 1358 -#define _PY_FRAME_KW_r11 1359 -#define _REPLACE_WITH_TRUE_r02 1360 -#define _REPLACE_WITH_TRUE_r12 1361 -#define _REPLACE_WITH_TRUE_r23 1362 -#define _RESUME_CHECK_r00 1363 -#define _RESUME_CHECK_r11 1364 -#define _RESUME_CHECK_r22 1365 -#define _RESUME_CHECK_r33 1366 -#define _RETURN_GENERATOR_r01 1367 -#define _RETURN_VALUE_r11 1368 -#define _SAVE_RETURN_OFFSET_r00 1369 -#define _SAVE_RETURN_OFFSET_r11 1370 -#define _SAVE_RETURN_OFFSET_r22 1371 -#define _SAVE_RETURN_OFFSET_r33 1372 -#define _SEND_r22 1373 -#define _SEND_GEN_FRAME_r22 1374 -#define _SETUP_ANNOTATIONS_r00 1375 -#define _SET_ADD_r10 1376 -#define _SET_FUNCTION_ATTRIBUTE_r01 1377 -#define _SET_FUNCTION_ATTRIBUTE_r11 1378 -#define _SET_FUNCTION_ATTRIBUTE_r21 1379 -#define _SET_FUNCTION_ATTRIBUTE_r32 1380 -#define _SET_IP_r00 1381 -#define _SET_IP_r11 1382 -#define _SET_IP_r22 1383 -#define _SET_IP_r33 1384 -#define _SET_UPDATE_r10 1385 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1386 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1387 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1388 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1389 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1390 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1391 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1392 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1393 -#define _SPILL_OR_RELOAD_r01 1394 -#define _SPILL_OR_RELOAD_r02 1395 -#define _SPILL_OR_RELOAD_r03 1396 -#define _SPILL_OR_RELOAD_r10 1397 -#define _SPILL_OR_RELOAD_r12 1398 -#define _SPILL_OR_RELOAD_r13 1399 -#define _SPILL_OR_RELOAD_r20 1400 -#define _SPILL_OR_RELOAD_r21 1401 -#define _SPILL_OR_RELOAD_r23 1402 -#define _SPILL_OR_RELOAD_r30 1403 -#define _SPILL_OR_RELOAD_r31 1404 -#define _SPILL_OR_RELOAD_r32 1405 -#define _START_EXECUTOR_r00 1406 -#define _STORE_ATTR_r20 1407 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1408 -#define _STORE_ATTR_SLOT_r21 1409 -#define _STORE_ATTR_WITH_HINT_r21 1410 -#define _STORE_DEREF_r10 1411 -#define _STORE_FAST_LOAD_FAST_r11 1412 -#define _STORE_FAST_STORE_FAST_r20 1413 -#define _STORE_GLOBAL_r10 1414 -#define _STORE_NAME_r10 1415 -#define _STORE_SLICE_r30 1416 -#define _STORE_SUBSCR_r30 1417 -#define _STORE_SUBSCR_DICT_r31 1418 -#define _STORE_SUBSCR_LIST_INT_r32 1419 -#define _SWAP_r11 1420 -#define _SWAP_2_r02 1421 -#define _SWAP_2_r12 1422 -#define _SWAP_2_r22 1423 -#define _SWAP_2_r33 1424 -#define _SWAP_3_r03 1425 -#define _SWAP_3_r13 1426 -#define _SWAP_3_r23 1427 -#define _SWAP_3_r33 1428 -#define _SWAP_FAST_r01 1429 -#define _SWAP_FAST_r11 1430 -#define _SWAP_FAST_r22 1431 -#define _SWAP_FAST_r33 1432 -#define _SWAP_FAST_0_r01 1433 -#define _SWAP_FAST_0_r11 1434 -#define _SWAP_FAST_0_r22 1435 -#define _SWAP_FAST_0_r33 1436 -#define _SWAP_FAST_1_r01 1437 -#define _SWAP_FAST_1_r11 1438 -#define _SWAP_FAST_1_r22 1439 -#define _SWAP_FAST_1_r33 1440 -#define _SWAP_FAST_2_r01 1441 -#define _SWAP_FAST_2_r11 1442 -#define _SWAP_FAST_2_r22 1443 -#define _SWAP_FAST_2_r33 1444 -#define _SWAP_FAST_3_r01 1445 -#define _SWAP_FAST_3_r11 1446 -#define _SWAP_FAST_3_r22 1447 -#define _SWAP_FAST_3_r33 1448 -#define _SWAP_FAST_4_r01 1449 -#define _SWAP_FAST_4_r11 1450 -#define _SWAP_FAST_4_r22 1451 -#define _SWAP_FAST_4_r33 1452 -#define _SWAP_FAST_5_r01 1453 -#define _SWAP_FAST_5_r11 1454 -#define _SWAP_FAST_5_r22 1455 -#define _SWAP_FAST_5_r33 1456 -#define _SWAP_FAST_6_r01 1457 -#define _SWAP_FAST_6_r11 1458 -#define _SWAP_FAST_6_r22 1459 -#define _SWAP_FAST_6_r33 1460 -#define _SWAP_FAST_7_r01 1461 -#define _SWAP_FAST_7_r11 1462 -#define _SWAP_FAST_7_r22 1463 -#define _SWAP_FAST_7_r33 1464 -#define _TIER2_RESUME_CHECK_r00 1465 -#define _TIER2_RESUME_CHECK_r11 1466 -#define _TIER2_RESUME_CHECK_r22 1467 -#define _TIER2_RESUME_CHECK_r33 1468 -#define _TO_BOOL_r11 1469 -#define _TO_BOOL_BOOL_r01 1470 -#define _TO_BOOL_BOOL_r11 1471 -#define _TO_BOOL_BOOL_r22 1472 -#define _TO_BOOL_BOOL_r33 1473 -#define _TO_BOOL_INT_r02 1474 -#define _TO_BOOL_INT_r12 1475 -#define _TO_BOOL_INT_r23 1476 -#define _TO_BOOL_LIST_r02 1477 -#define _TO_BOOL_LIST_r12 1478 -#define _TO_BOOL_LIST_r23 1479 -#define _TO_BOOL_NONE_r01 1480 -#define _TO_BOOL_NONE_r11 1481 -#define _TO_BOOL_NONE_r22 1482 -#define _TO_BOOL_NONE_r33 1483 -#define _TO_BOOL_STR_r02 1484 -#define _TO_BOOL_STR_r12 1485 -#define _TO_BOOL_STR_r23 1486 -#define _TRACE_RECORD_r00 1487 -#define _UNARY_INVERT_r12 1488 -#define _UNARY_NEGATIVE_r12 1489 -#define _UNARY_NOT_r01 1490 -#define _UNARY_NOT_r11 1491 -#define _UNARY_NOT_r22 1492 -#define _UNARY_NOT_r33 1493 -#define _UNPACK_EX_r10 1494 -#define _UNPACK_SEQUENCE_r10 1495 -#define _UNPACK_SEQUENCE_LIST_r10 1496 -#define _UNPACK_SEQUENCE_TUPLE_r10 1497 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1498 -#define _WITH_EXCEPT_START_r33 1499 -#define _YIELD_VALUE_r11 1500 -#define MAX_UOP_REGS_ID 1500 +#define _POP_JUMP_IF_FALSE_r00 1319 +#define _POP_JUMP_IF_FALSE_r10 1320 +#define _POP_JUMP_IF_FALSE_r21 1321 +#define _POP_JUMP_IF_FALSE_r32 1322 +#define _POP_JUMP_IF_TRUE_r00 1323 +#define _POP_JUMP_IF_TRUE_r10 1324 +#define _POP_JUMP_IF_TRUE_r21 1325 +#define _POP_JUMP_IF_TRUE_r32 1326 +#define _POP_TOP_r10 1327 +#define _POP_TOP_FLOAT_r00 1328 +#define _POP_TOP_FLOAT_r10 1329 +#define _POP_TOP_FLOAT_r21 1330 +#define _POP_TOP_FLOAT_r32 1331 +#define _POP_TOP_INT_r00 1332 +#define _POP_TOP_INT_r10 1333 +#define _POP_TOP_INT_r21 1334 +#define _POP_TOP_INT_r32 1335 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1336 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1337 +#define _POP_TOP_NOP_r00 1338 +#define _POP_TOP_NOP_r10 1339 +#define _POP_TOP_NOP_r21 1340 +#define _POP_TOP_NOP_r32 1341 +#define _POP_TOP_UNICODE_r00 1342 +#define _POP_TOP_UNICODE_r10 1343 +#define _POP_TOP_UNICODE_r21 1344 +#define _POP_TOP_UNICODE_r32 1345 +#define _POP_TWO_r20 1346 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1347 +#define _PUSH_EXC_INFO_r02 1348 +#define _PUSH_EXC_INFO_r12 1349 +#define _PUSH_EXC_INFO_r23 1350 +#define _PUSH_FRAME_r10 1351 +#define _PUSH_NULL_r01 1352 +#define _PUSH_NULL_r12 1353 +#define _PUSH_NULL_r23 1354 +#define _PUSH_NULL_CONDITIONAL_r00 1355 +#define _PY_FRAME_EX_r31 1356 +#define _PY_FRAME_GENERAL_r01 1357 +#define _PY_FRAME_KW_r11 1358 +#define _REPLACE_WITH_TRUE_r02 1359 +#define _REPLACE_WITH_TRUE_r12 1360 +#define _REPLACE_WITH_TRUE_r23 1361 +#define _RESUME_CHECK_r00 1362 +#define _RESUME_CHECK_r11 1363 +#define _RESUME_CHECK_r22 1364 +#define _RESUME_CHECK_r33 1365 +#define _RETURN_GENERATOR_r01 1366 +#define _RETURN_VALUE_r11 1367 +#define _SAVE_RETURN_OFFSET_r00 1368 +#define _SAVE_RETURN_OFFSET_r11 1369 +#define _SAVE_RETURN_OFFSET_r22 1370 +#define _SAVE_RETURN_OFFSET_r33 1371 +#define _SEND_r22 1372 +#define _SEND_GEN_FRAME_r22 1373 +#define _SETUP_ANNOTATIONS_r00 1374 +#define _SET_ADD_r10 1375 +#define _SET_FUNCTION_ATTRIBUTE_r01 1376 +#define _SET_FUNCTION_ATTRIBUTE_r11 1377 +#define _SET_FUNCTION_ATTRIBUTE_r21 1378 +#define _SET_FUNCTION_ATTRIBUTE_r32 1379 +#define _SET_IP_r00 1380 +#define _SET_IP_r11 1381 +#define _SET_IP_r22 1382 +#define _SET_IP_r33 1383 +#define _SET_UPDATE_r10 1384 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1385 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1386 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1387 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1388 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1389 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1390 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1391 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1392 +#define _SPILL_OR_RELOAD_r01 1393 +#define _SPILL_OR_RELOAD_r02 1394 +#define _SPILL_OR_RELOAD_r03 1395 +#define _SPILL_OR_RELOAD_r10 1396 +#define _SPILL_OR_RELOAD_r12 1397 +#define _SPILL_OR_RELOAD_r13 1398 +#define _SPILL_OR_RELOAD_r20 1399 +#define _SPILL_OR_RELOAD_r21 1400 +#define _SPILL_OR_RELOAD_r23 1401 +#define _SPILL_OR_RELOAD_r30 1402 +#define _SPILL_OR_RELOAD_r31 1403 +#define _SPILL_OR_RELOAD_r32 1404 +#define _START_EXECUTOR_r00 1405 +#define _STORE_ATTR_r20 1406 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1407 +#define _STORE_ATTR_SLOT_r21 1408 +#define _STORE_ATTR_WITH_HINT_r21 1409 +#define _STORE_DEREF_r10 1410 +#define _STORE_FAST_LOAD_FAST_r11 1411 +#define _STORE_FAST_STORE_FAST_r20 1412 +#define _STORE_GLOBAL_r10 1413 +#define _STORE_NAME_r10 1414 +#define _STORE_SLICE_r30 1415 +#define _STORE_SUBSCR_r30 1416 +#define _STORE_SUBSCR_DICT_r31 1417 +#define _STORE_SUBSCR_LIST_INT_r32 1418 +#define _SWAP_r11 1419 +#define _SWAP_2_r02 1420 +#define _SWAP_2_r12 1421 +#define _SWAP_2_r22 1422 +#define _SWAP_2_r33 1423 +#define _SWAP_3_r03 1424 +#define _SWAP_3_r13 1425 +#define _SWAP_3_r23 1426 +#define _SWAP_3_r33 1427 +#define _SWAP_FAST_r01 1428 +#define _SWAP_FAST_r11 1429 +#define _SWAP_FAST_r22 1430 +#define _SWAP_FAST_r33 1431 +#define _SWAP_FAST_0_r01 1432 +#define _SWAP_FAST_0_r11 1433 +#define _SWAP_FAST_0_r22 1434 +#define _SWAP_FAST_0_r33 1435 +#define _SWAP_FAST_1_r01 1436 +#define _SWAP_FAST_1_r11 1437 +#define _SWAP_FAST_1_r22 1438 +#define _SWAP_FAST_1_r33 1439 +#define _SWAP_FAST_2_r01 1440 +#define _SWAP_FAST_2_r11 1441 +#define _SWAP_FAST_2_r22 1442 +#define _SWAP_FAST_2_r33 1443 +#define _SWAP_FAST_3_r01 1444 +#define _SWAP_FAST_3_r11 1445 +#define _SWAP_FAST_3_r22 1446 +#define _SWAP_FAST_3_r33 1447 +#define _SWAP_FAST_4_r01 1448 +#define _SWAP_FAST_4_r11 1449 +#define _SWAP_FAST_4_r22 1450 +#define _SWAP_FAST_4_r33 1451 +#define _SWAP_FAST_5_r01 1452 +#define _SWAP_FAST_5_r11 1453 +#define _SWAP_FAST_5_r22 1454 +#define _SWAP_FAST_5_r33 1455 +#define _SWAP_FAST_6_r01 1456 +#define _SWAP_FAST_6_r11 1457 +#define _SWAP_FAST_6_r22 1458 +#define _SWAP_FAST_6_r33 1459 +#define _SWAP_FAST_7_r01 1460 +#define _SWAP_FAST_7_r11 1461 +#define _SWAP_FAST_7_r22 1462 +#define _SWAP_FAST_7_r33 1463 +#define _TIER2_RESUME_CHECK_r00 1464 +#define _TIER2_RESUME_CHECK_r11 1465 +#define _TIER2_RESUME_CHECK_r22 1466 +#define _TIER2_RESUME_CHECK_r33 1467 +#define _TO_BOOL_r11 1468 +#define _TO_BOOL_BOOL_r01 1469 +#define _TO_BOOL_BOOL_r11 1470 +#define _TO_BOOL_BOOL_r22 1471 +#define _TO_BOOL_BOOL_r33 1472 +#define _TO_BOOL_INT_r02 1473 +#define _TO_BOOL_INT_r12 1474 +#define _TO_BOOL_INT_r23 1475 +#define _TO_BOOL_LIST_r02 1476 +#define _TO_BOOL_LIST_r12 1477 +#define _TO_BOOL_LIST_r23 1478 +#define _TO_BOOL_NONE_r01 1479 +#define _TO_BOOL_NONE_r11 1480 +#define _TO_BOOL_NONE_r22 1481 +#define _TO_BOOL_NONE_r33 1482 +#define _TO_BOOL_STR_r02 1483 +#define _TO_BOOL_STR_r12 1484 +#define _TO_BOOL_STR_r23 1485 +#define _TRACE_RECORD_r00 1486 +#define _UNARY_INVERT_r12 1487 +#define _UNARY_NEGATIVE_r12 1488 +#define _UNARY_NOT_r01 1489 +#define _UNARY_NOT_r11 1490 +#define _UNARY_NOT_r22 1491 +#define _UNARY_NOT_r33 1492 +#define _UNPACK_EX_r10 1493 +#define _UNPACK_SEQUENCE_r10 1494 +#define _UNPACK_SEQUENCE_LIST_r10 1495 +#define _UNPACK_SEQUENCE_TUPLE_r10 1496 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1497 +#define _WITH_EXCEPT_START_r33 1498 +#define _YIELD_VALUE_r11 1499 +#define MAX_UOP_REGS_ID 1499 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index c804dbb87f7ccd..16668aca01257e 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -82,7 +82,6 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = { [_POP_TWO] = HAS_ESCAPES_FLAG, [_PUSH_NULL] = HAS_PURE_FLAG, [_END_FOR] = HAS_ESCAPES_FLAG | HAS_NO_SAVE_IP_FLAG, - [_POP_ITER] = HAS_ESCAPES_FLAG, [_END_SEND] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG, [_UNARY_NEGATIVE] = HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG, [_UNARY_NOT] = 0, @@ -831,15 +830,6 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = { { -1, -1, -1 }, }, }, - [_POP_ITER] = { - .best = { 2, 2, 2, 2 }, - .entries = { - { -1, -1, -1 }, - { -1, -1, -1 }, - { 0, 2, _POP_ITER_r20 }, - { -1, -1, -1 }, - }, - }, [_END_SEND] = { .best = { 2, 2, 2, 2 }, .entries = { @@ -3698,7 +3688,6 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = { [_PUSH_NULL_r12] = _PUSH_NULL, [_PUSH_NULL_r23] = _PUSH_NULL, [_END_FOR_r10] = _END_FOR, - [_POP_ITER_r20] = _POP_ITER, [_END_SEND_r21] = _END_SEND, [_UNARY_NEGATIVE_r12] = _UNARY_NEGATIVE, [_UNARY_NOT_r01] = _UNARY_NOT, @@ -5336,8 +5325,6 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = { [_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31] = "_POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31", [_POP_EXCEPT] = "_POP_EXCEPT", [_POP_EXCEPT_r10] = "_POP_EXCEPT_r10", - [_POP_ITER] = "_POP_ITER", - [_POP_ITER_r20] = "_POP_ITER_r20", [_POP_TOP] = "_POP_TOP", [_POP_TOP_r10] = "_POP_TOP_r10", [_POP_TOP_FLOAT] = "_POP_TOP_FLOAT", @@ -5684,8 +5671,6 @@ int _PyUop_num_popped(int opcode, int oparg) return 0; case _END_FOR: return 1; - case _POP_ITER: - return 2; case _END_SEND: return 2; case _UNARY_NEGATIVE: diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 2a126a7b29cc73..2dffc3c9f06811 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -4258,6 +4258,15 @@ def g(): PYTHON_JIT="1", PYTHON_JIT_STRESS="1") self.assertEqual(result[0].rc, 0, result) + def test_pop_iter(self): + def testfunc(n): + for _ in range(n): + pass + + res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD) + self.assertEqual(res, None) + self.assertEqual(count_ops(ex, "_POP_TOP"), 1) + def global_identity(x): return x diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 12480e2cb1962f..d42ec50df46753 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -10183,16 +10183,25 @@ frame->instr_ptr = next_instr; next_instr += 1; INSTRUCTION_STATS(POP_ITER); - _PyStackRef iter; - _PyStackRef index_or_null; - index_or_null = stack_pointer[-1]; - iter = stack_pointer[-2]; - (void)index_or_null; - stack_pointer += -2; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(iter); - stack_pointer = _PyFrame_GetStackPointer(frame); + _PyStackRef value; + // _POP_TOP + { + value = stack_pointer[-1]; + stack_pointer += -1; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_XCLOSE(value); + stack_pointer = _PyFrame_GetStackPointer(frame); + } + // _POP_TOP + { + value = stack_pointer[-1]; + stack_pointer += -1; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_XCLOSE(value); + stack_pointer = _PyFrame_GetStackPointer(frame); + } DISPATCH(); } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index e170fd65a20f64..0fe892a4163fbc 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -399,12 +399,7 @@ dummy_func( PyStackRef_CLOSE(value); } - - inst(POP_ITER, (iter, index_or_null -- )) { - (void)index_or_null; - DEAD(index_or_null); - PyStackRef_CLOSE(iter); - } + macro(POP_ITER) = POP_TOP + POP_TOP; no_save_ip tier1 inst(INSTRUMENTED_END_FOR, (receiver, index_or_null, value -- receiver, index_or_null)) { /* Need to create a fake StopIteration error here, diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index d33c67dd745bbf..772e1e0529fb44 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -2581,27 +2581,6 @@ break; } - case _POP_ITER_r20: { - CHECK_CURRENT_CACHED_VALUES(2); - assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); - _PyStackRef index_or_null; - _PyStackRef iter; - _PyStackRef _stack_item_0 = _tos_cache0; - _PyStackRef _stack_item_1 = _tos_cache1; - index_or_null = _stack_item_1; - iter = _stack_item_0; - (void)index_or_null; - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(iter); - stack_pointer = _PyFrame_GetStackPointer(frame); - _tos_cache0 = PyStackRef_ZERO_BITS; - _tos_cache1 = PyStackRef_ZERO_BITS; - _tos_cache2 = PyStackRef_ZERO_BITS; - SET_CURRENT_CACHED_VALUES(0); - assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); - break; - } - case _END_SEND_r21: { CHECK_CURRENT_CACHED_VALUES(2); assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE()); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 628f0cc4d37310..575f2e38d9ec3e 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -10181,16 +10181,25 @@ frame->instr_ptr = next_instr; next_instr += 1; INSTRUCTION_STATS(POP_ITER); - _PyStackRef iter; - _PyStackRef index_or_null; - index_or_null = stack_pointer[-1]; - iter = stack_pointer[-2]; - (void)index_or_null; - stack_pointer += -2; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(iter); - stack_pointer = _PyFrame_GetStackPointer(frame); + _PyStackRef value; + // _POP_TOP + { + value = stack_pointer[-1]; + stack_pointer += -1; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_XCLOSE(value); + stack_pointer = _PyFrame_GetStackPointer(frame); + } + // _POP_TOP + { + value = stack_pointer[-1]; + stack_pointer += -1; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); + _PyFrame_SetStackPointer(frame, stack_pointer); + PyStackRef_XCLOSE(value); + stack_pointer = _PyFrame_GetStackPointer(frame); + } DISPATCH(); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index df6368ca8ce011..c02964e9424aee 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -199,13 +199,6 @@ break; } - case _POP_ITER: { - CHECK_STACK_BOUNDS(-2); - stack_pointer += -2; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - break; - } - case _END_SEND: { JitOptRef val; val = sym_new_not_null(ctx); From ce991ce6e9e1c62ac2a4103438682f8a1dc0d04c Mon Sep 17 00:00:00 2001 From: Brij <97006829+bkap123@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:25:01 -0400 Subject: [PATCH 2/3] update generated files --- Include/internal/pycore_uop_ids.h | 365 +++++++++++++++--------------- 1 file changed, 182 insertions(+), 183 deletions(-) diff --git a/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index f0d9bf7194f7ef..b6e2af19290c69 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -1113,189 +1113,188 @@ extern "C" { #define _POP_CALL_TWO_r30 1317 #define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1318 #define _POP_EXCEPT_r10 1319 -#define _POP_ITER_r20 1320 -#define _POP_JUMP_IF_FALSE_r00 1321 -#define _POP_JUMP_IF_FALSE_r10 1322 -#define _POP_JUMP_IF_FALSE_r21 1323 -#define _POP_JUMP_IF_FALSE_r32 1324 -#define _POP_JUMP_IF_TRUE_r00 1325 -#define _POP_JUMP_IF_TRUE_r10 1326 -#define _POP_JUMP_IF_TRUE_r21 1327 -#define _POP_JUMP_IF_TRUE_r32 1328 -#define _POP_TOP_r10 1329 -#define _POP_TOP_FLOAT_r00 1330 -#define _POP_TOP_FLOAT_r10 1331 -#define _POP_TOP_FLOAT_r21 1332 -#define _POP_TOP_FLOAT_r32 1333 -#define _POP_TOP_INT_r00 1334 -#define _POP_TOP_INT_r10 1335 -#define _POP_TOP_INT_r21 1336 -#define _POP_TOP_INT_r32 1337 -#define _POP_TOP_LOAD_CONST_INLINE_r11 1338 -#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1339 -#define _POP_TOP_NOP_r00 1340 -#define _POP_TOP_NOP_r10 1341 -#define _POP_TOP_NOP_r21 1342 -#define _POP_TOP_NOP_r32 1343 -#define _POP_TOP_UNICODE_r00 1344 -#define _POP_TOP_UNICODE_r10 1345 -#define _POP_TOP_UNICODE_r21 1346 -#define _POP_TOP_UNICODE_r32 1347 -#define _POP_TWO_r20 1348 -#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1349 -#define _PUSH_EXC_INFO_r02 1350 -#define _PUSH_EXC_INFO_r12 1351 -#define _PUSH_EXC_INFO_r23 1352 -#define _PUSH_FRAME_r10 1353 -#define _PUSH_NULL_r01 1354 -#define _PUSH_NULL_r12 1355 -#define _PUSH_NULL_r23 1356 -#define _PUSH_NULL_CONDITIONAL_r00 1357 -#define _PY_FRAME_EX_r31 1358 -#define _PY_FRAME_GENERAL_r01 1359 -#define _PY_FRAME_KW_r11 1360 -#define _REPLACE_WITH_TRUE_r02 1361 -#define _REPLACE_WITH_TRUE_r12 1362 -#define _REPLACE_WITH_TRUE_r23 1363 -#define _RESUME_CHECK_r00 1364 -#define _RESUME_CHECK_r11 1365 -#define _RESUME_CHECK_r22 1366 -#define _RESUME_CHECK_r33 1367 -#define _RETURN_GENERATOR_r01 1368 -#define _RETURN_VALUE_r11 1369 -#define _SAVE_RETURN_OFFSET_r00 1370 -#define _SAVE_RETURN_OFFSET_r11 1371 -#define _SAVE_RETURN_OFFSET_r22 1372 -#define _SAVE_RETURN_OFFSET_r33 1373 -#define _SEND_r22 1374 -#define _SEND_GEN_FRAME_r22 1375 -#define _SETUP_ANNOTATIONS_r00 1376 -#define _SET_ADD_r10 1377 -#define _SET_FUNCTION_ATTRIBUTE_r01 1378 -#define _SET_FUNCTION_ATTRIBUTE_r11 1379 -#define _SET_FUNCTION_ATTRIBUTE_r21 1380 -#define _SET_FUNCTION_ATTRIBUTE_r32 1381 -#define _SET_IP_r00 1382 -#define _SET_IP_r11 1383 -#define _SET_IP_r22 1384 -#define _SET_IP_r33 1385 -#define _SET_UPDATE_r11 1386 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1387 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1388 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1389 -#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1390 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1391 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1392 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1393 -#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1394 -#define _SPILL_OR_RELOAD_r01 1395 -#define _SPILL_OR_RELOAD_r02 1396 -#define _SPILL_OR_RELOAD_r03 1397 -#define _SPILL_OR_RELOAD_r10 1398 -#define _SPILL_OR_RELOAD_r12 1399 -#define _SPILL_OR_RELOAD_r13 1400 -#define _SPILL_OR_RELOAD_r20 1401 -#define _SPILL_OR_RELOAD_r21 1402 -#define _SPILL_OR_RELOAD_r23 1403 -#define _SPILL_OR_RELOAD_r30 1404 -#define _SPILL_OR_RELOAD_r31 1405 -#define _SPILL_OR_RELOAD_r32 1406 -#define _START_EXECUTOR_r00 1407 -#define _STORE_ATTR_r20 1408 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1409 -#define _STORE_ATTR_SLOT_r21 1410 -#define _STORE_ATTR_WITH_HINT_r21 1411 -#define _STORE_DEREF_r10 1412 -#define _STORE_FAST_LOAD_FAST_r11 1413 -#define _STORE_FAST_STORE_FAST_r20 1414 -#define _STORE_GLOBAL_r10 1415 -#define _STORE_NAME_r10 1416 -#define _STORE_SLICE_r30 1417 -#define _STORE_SUBSCR_r30 1418 -#define _STORE_SUBSCR_DICT_r31 1419 -#define _STORE_SUBSCR_LIST_INT_r32 1420 -#define _SWAP_r11 1421 -#define _SWAP_2_r02 1422 -#define _SWAP_2_r12 1423 -#define _SWAP_2_r22 1424 -#define _SWAP_2_r33 1425 -#define _SWAP_3_r03 1426 -#define _SWAP_3_r13 1427 -#define _SWAP_3_r23 1428 -#define _SWAP_3_r33 1429 -#define _SWAP_FAST_r01 1430 -#define _SWAP_FAST_r11 1431 -#define _SWAP_FAST_r22 1432 -#define _SWAP_FAST_r33 1433 -#define _SWAP_FAST_0_r01 1434 -#define _SWAP_FAST_0_r11 1435 -#define _SWAP_FAST_0_r22 1436 -#define _SWAP_FAST_0_r33 1437 -#define _SWAP_FAST_1_r01 1438 -#define _SWAP_FAST_1_r11 1439 -#define _SWAP_FAST_1_r22 1440 -#define _SWAP_FAST_1_r33 1441 -#define _SWAP_FAST_2_r01 1442 -#define _SWAP_FAST_2_r11 1443 -#define _SWAP_FAST_2_r22 1444 -#define _SWAP_FAST_2_r33 1445 -#define _SWAP_FAST_3_r01 1446 -#define _SWAP_FAST_3_r11 1447 -#define _SWAP_FAST_3_r22 1448 -#define _SWAP_FAST_3_r33 1449 -#define _SWAP_FAST_4_r01 1450 -#define _SWAP_FAST_4_r11 1451 -#define _SWAP_FAST_4_r22 1452 -#define _SWAP_FAST_4_r33 1453 -#define _SWAP_FAST_5_r01 1454 -#define _SWAP_FAST_5_r11 1455 -#define _SWAP_FAST_5_r22 1456 -#define _SWAP_FAST_5_r33 1457 -#define _SWAP_FAST_6_r01 1458 -#define _SWAP_FAST_6_r11 1459 -#define _SWAP_FAST_6_r22 1460 -#define _SWAP_FAST_6_r33 1461 -#define _SWAP_FAST_7_r01 1462 -#define _SWAP_FAST_7_r11 1463 -#define _SWAP_FAST_7_r22 1464 -#define _SWAP_FAST_7_r33 1465 -#define _TIER2_RESUME_CHECK_r00 1466 -#define _TIER2_RESUME_CHECK_r11 1467 -#define _TIER2_RESUME_CHECK_r22 1468 -#define _TIER2_RESUME_CHECK_r33 1469 -#define _TO_BOOL_r11 1470 -#define _TO_BOOL_BOOL_r01 1471 -#define _TO_BOOL_BOOL_r11 1472 -#define _TO_BOOL_BOOL_r22 1473 -#define _TO_BOOL_BOOL_r33 1474 -#define _TO_BOOL_INT_r02 1475 -#define _TO_BOOL_INT_r12 1476 -#define _TO_BOOL_INT_r23 1477 -#define _TO_BOOL_LIST_r02 1478 -#define _TO_BOOL_LIST_r12 1479 -#define _TO_BOOL_LIST_r23 1480 -#define _TO_BOOL_NONE_r01 1481 -#define _TO_BOOL_NONE_r11 1482 -#define _TO_BOOL_NONE_r22 1483 -#define _TO_BOOL_NONE_r33 1484 -#define _TO_BOOL_STR_r02 1485 -#define _TO_BOOL_STR_r12 1486 -#define _TO_BOOL_STR_r23 1487 -#define _TRACE_RECORD_r00 1488 -#define _UNARY_INVERT_r12 1489 -#define _UNARY_NEGATIVE_r12 1490 -#define _UNARY_NOT_r01 1491 -#define _UNARY_NOT_r11 1492 -#define _UNARY_NOT_r22 1493 -#define _UNARY_NOT_r33 1494 -#define _UNPACK_EX_r10 1495 -#define _UNPACK_SEQUENCE_r10 1496 -#define _UNPACK_SEQUENCE_LIST_r10 1497 -#define _UNPACK_SEQUENCE_TUPLE_r10 1498 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1499 -#define _WITH_EXCEPT_START_r33 1500 -#define _YIELD_VALUE_r11 1501 -#define MAX_UOP_REGS_ID 1501 +#define _POP_JUMP_IF_FALSE_r00 1320 +#define _POP_JUMP_IF_FALSE_r10 1321 +#define _POP_JUMP_IF_FALSE_r21 1322 +#define _POP_JUMP_IF_FALSE_r32 1323 +#define _POP_JUMP_IF_TRUE_r00 1324 +#define _POP_JUMP_IF_TRUE_r10 1325 +#define _POP_JUMP_IF_TRUE_r21 1326 +#define _POP_JUMP_IF_TRUE_r32 1327 +#define _POP_TOP_r10 1328 +#define _POP_TOP_FLOAT_r00 1329 +#define _POP_TOP_FLOAT_r10 1330 +#define _POP_TOP_FLOAT_r21 1331 +#define _POP_TOP_FLOAT_r32 1332 +#define _POP_TOP_INT_r00 1333 +#define _POP_TOP_INT_r10 1334 +#define _POP_TOP_INT_r21 1335 +#define _POP_TOP_INT_r32 1336 +#define _POP_TOP_LOAD_CONST_INLINE_r11 1337 +#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1338 +#define _POP_TOP_NOP_r00 1339 +#define _POP_TOP_NOP_r10 1340 +#define _POP_TOP_NOP_r21 1341 +#define _POP_TOP_NOP_r32 1342 +#define _POP_TOP_UNICODE_r00 1343 +#define _POP_TOP_UNICODE_r10 1344 +#define _POP_TOP_UNICODE_r21 1345 +#define _POP_TOP_UNICODE_r32 1346 +#define _POP_TWO_r20 1347 +#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1348 +#define _PUSH_EXC_INFO_r02 1349 +#define _PUSH_EXC_INFO_r12 1350 +#define _PUSH_EXC_INFO_r23 1351 +#define _PUSH_FRAME_r10 1352 +#define _PUSH_NULL_r01 1353 +#define _PUSH_NULL_r12 1354 +#define _PUSH_NULL_r23 1355 +#define _PUSH_NULL_CONDITIONAL_r00 1356 +#define _PY_FRAME_EX_r31 1357 +#define _PY_FRAME_GENERAL_r01 1358 +#define _PY_FRAME_KW_r11 1359 +#define _REPLACE_WITH_TRUE_r02 1360 +#define _REPLACE_WITH_TRUE_r12 1361 +#define _REPLACE_WITH_TRUE_r23 1362 +#define _RESUME_CHECK_r00 1363 +#define _RESUME_CHECK_r11 1364 +#define _RESUME_CHECK_r22 1365 +#define _RESUME_CHECK_r33 1366 +#define _RETURN_GENERATOR_r01 1367 +#define _RETURN_VALUE_r11 1368 +#define _SAVE_RETURN_OFFSET_r00 1369 +#define _SAVE_RETURN_OFFSET_r11 1370 +#define _SAVE_RETURN_OFFSET_r22 1371 +#define _SAVE_RETURN_OFFSET_r33 1372 +#define _SEND_r22 1373 +#define _SEND_GEN_FRAME_r22 1374 +#define _SETUP_ANNOTATIONS_r00 1375 +#define _SET_ADD_r10 1376 +#define _SET_FUNCTION_ATTRIBUTE_r01 1377 +#define _SET_FUNCTION_ATTRIBUTE_r11 1378 +#define _SET_FUNCTION_ATTRIBUTE_r21 1379 +#define _SET_FUNCTION_ATTRIBUTE_r32 1380 +#define _SET_IP_r00 1381 +#define _SET_IP_r11 1382 +#define _SET_IP_r22 1383 +#define _SET_IP_r33 1384 +#define _SET_UPDATE_r11 1385 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1386 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1387 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1388 +#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1389 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1390 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1391 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1392 +#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1393 +#define _SPILL_OR_RELOAD_r01 1394 +#define _SPILL_OR_RELOAD_r02 1395 +#define _SPILL_OR_RELOAD_r03 1396 +#define _SPILL_OR_RELOAD_r10 1397 +#define _SPILL_OR_RELOAD_r12 1398 +#define _SPILL_OR_RELOAD_r13 1399 +#define _SPILL_OR_RELOAD_r20 1400 +#define _SPILL_OR_RELOAD_r21 1401 +#define _SPILL_OR_RELOAD_r23 1402 +#define _SPILL_OR_RELOAD_r30 1403 +#define _SPILL_OR_RELOAD_r31 1404 +#define _SPILL_OR_RELOAD_r32 1405 +#define _START_EXECUTOR_r00 1406 +#define _STORE_ATTR_r20 1407 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1408 +#define _STORE_ATTR_SLOT_r21 1409 +#define _STORE_ATTR_WITH_HINT_r21 1410 +#define _STORE_DEREF_r10 1411 +#define _STORE_FAST_LOAD_FAST_r11 1412 +#define _STORE_FAST_STORE_FAST_r20 1413 +#define _STORE_GLOBAL_r10 1414 +#define _STORE_NAME_r10 1415 +#define _STORE_SLICE_r30 1416 +#define _STORE_SUBSCR_r30 1417 +#define _STORE_SUBSCR_DICT_r31 1418 +#define _STORE_SUBSCR_LIST_INT_r32 1419 +#define _SWAP_r11 1420 +#define _SWAP_2_r02 1421 +#define _SWAP_2_r12 1422 +#define _SWAP_2_r22 1423 +#define _SWAP_2_r33 1424 +#define _SWAP_3_r03 1425 +#define _SWAP_3_r13 1426 +#define _SWAP_3_r23 1427 +#define _SWAP_3_r33 1428 +#define _SWAP_FAST_r01 1429 +#define _SWAP_FAST_r11 1430 +#define _SWAP_FAST_r22 1431 +#define _SWAP_FAST_r33 1432 +#define _SWAP_FAST_0_r01 1433 +#define _SWAP_FAST_0_r11 1434 +#define _SWAP_FAST_0_r22 1435 +#define _SWAP_FAST_0_r33 1436 +#define _SWAP_FAST_1_r01 1437 +#define _SWAP_FAST_1_r11 1438 +#define _SWAP_FAST_1_r22 1439 +#define _SWAP_FAST_1_r33 1440 +#define _SWAP_FAST_2_r01 1441 +#define _SWAP_FAST_2_r11 1442 +#define _SWAP_FAST_2_r22 1443 +#define _SWAP_FAST_2_r33 1444 +#define _SWAP_FAST_3_r01 1445 +#define _SWAP_FAST_3_r11 1446 +#define _SWAP_FAST_3_r22 1447 +#define _SWAP_FAST_3_r33 1448 +#define _SWAP_FAST_4_r01 1449 +#define _SWAP_FAST_4_r11 1450 +#define _SWAP_FAST_4_r22 1451 +#define _SWAP_FAST_4_r33 1452 +#define _SWAP_FAST_5_r01 1453 +#define _SWAP_FAST_5_r11 1454 +#define _SWAP_FAST_5_r22 1455 +#define _SWAP_FAST_5_r33 1456 +#define _SWAP_FAST_6_r01 1457 +#define _SWAP_FAST_6_r11 1458 +#define _SWAP_FAST_6_r22 1459 +#define _SWAP_FAST_6_r33 1460 +#define _SWAP_FAST_7_r01 1461 +#define _SWAP_FAST_7_r11 1462 +#define _SWAP_FAST_7_r22 1463 +#define _SWAP_FAST_7_r33 1464 +#define _TIER2_RESUME_CHECK_r00 1465 +#define _TIER2_RESUME_CHECK_r11 1466 +#define _TIER2_RESUME_CHECK_r22 1467 +#define _TIER2_RESUME_CHECK_r33 1468 +#define _TO_BOOL_r11 1469 +#define _TO_BOOL_BOOL_r01 1470 +#define _TO_BOOL_BOOL_r11 1471 +#define _TO_BOOL_BOOL_r22 1472 +#define _TO_BOOL_BOOL_r33 1473 +#define _TO_BOOL_INT_r02 1474 +#define _TO_BOOL_INT_r12 1475 +#define _TO_BOOL_INT_r23 1476 +#define _TO_BOOL_LIST_r02 1477 +#define _TO_BOOL_LIST_r12 1478 +#define _TO_BOOL_LIST_r23 1479 +#define _TO_BOOL_NONE_r01 1480 +#define _TO_BOOL_NONE_r11 1481 +#define _TO_BOOL_NONE_r22 1482 +#define _TO_BOOL_NONE_r33 1483 +#define _TO_BOOL_STR_r02 1484 +#define _TO_BOOL_STR_r12 1485 +#define _TO_BOOL_STR_r23 1486 +#define _TRACE_RECORD_r00 1487 +#define _UNARY_INVERT_r12 1488 +#define _UNARY_NEGATIVE_r12 1489 +#define _UNARY_NOT_r01 1490 +#define _UNARY_NOT_r11 1491 +#define _UNARY_NOT_r22 1492 +#define _UNARY_NOT_r33 1493 +#define _UNPACK_EX_r10 1494 +#define _UNPACK_SEQUENCE_r10 1495 +#define _UNPACK_SEQUENCE_LIST_r10 1496 +#define _UNPACK_SEQUENCE_TUPLE_r10 1497 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1498 +#define _WITH_EXCEPT_START_r33 1499 +#define _YIELD_VALUE_r11 1500 +#define MAX_UOP_REGS_ID 1500 #ifdef __cplusplus } From a421f9005e73a4bc1dbf29be2955bb76c6ee8430 Mon Sep 17 00:00:00 2001 From: Brij <97006829+bkap123@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:13:01 -0400 Subject: [PATCH 3/3] Add _POP_TOP_NOP --- Include/internal/pycore_opcode_metadata.h | 4 ++-- Modules/_testinternalcapi/test_cases.c.h | 13 +++++-------- Python/bytecodes.c | 2 +- Python/generated_cases.c.h | 13 +++++-------- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 6cb6537e1979fd..bf34222833e5a9 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1271,7 +1271,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [NOP] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, [NOT_TAKEN] = { true, INSTR_FMT_IX, HAS_PURE_FLAG }, [POP_EXCEPT] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, - [POP_ITER] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG | HAS_PURE_FLAG }, + [POP_ITER] = { true, INSTR_FMT_IX, HAS_ESCAPES_FLAG }, [POP_JUMP_IF_FALSE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG }, [POP_JUMP_IF_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ESCAPES_FLAG }, [POP_JUMP_IF_NOT_NONE] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_ESCAPES_FLAG }, @@ -1490,7 +1490,7 @@ _PyOpcode_macro_expansion[256] = { [NOP] = { .nuops = 1, .uops = { { _NOP, OPARG_SIMPLE, 0 } } }, [NOT_TAKEN] = { .nuops = 1, .uops = { { _NOP, OPARG_SIMPLE, 0 } } }, [POP_EXCEPT] = { .nuops = 1, .uops = { { _POP_EXCEPT, OPARG_SIMPLE, 0 } } }, - [POP_ITER] = { .nuops = 2, .uops = { { _POP_TOP, OPARG_SIMPLE, 0 }, { _POP_TOP, OPARG_SIMPLE, 0 } } }, + [POP_ITER] = { .nuops = 2, .uops = { { _POP_TOP_NOP, OPARG_SIMPLE, 0 }, { _POP_TOP, OPARG_SIMPLE, 0 } } }, [POP_JUMP_IF_FALSE] = { .nuops = 1, .uops = { { _POP_JUMP_IF_FALSE, OPARG_REPLACED, 1 } } }, [POP_JUMP_IF_NONE] = { .nuops = 2, .uops = { { _IS_NONE, OPARG_SIMPLE, 1 }, { _POP_JUMP_IF_TRUE, OPARG_REPLACED, 1 } } }, [POP_JUMP_IF_NOT_NONE] = { .nuops = 2, .uops = { { _IS_NONE, OPARG_SIMPLE, 1 }, { _POP_JUMP_IF_FALSE, OPARG_REPLACED, 1 } } }, diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index 6d03faf13ca142..f61fe91ad75d1f 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -10184,19 +10184,16 @@ next_instr += 1; INSTRUCTION_STATS(POP_ITER); _PyStackRef value; - // _POP_TOP + // _POP_TOP_NOP { value = stack_pointer[-1]; - stack_pointer += -1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_XCLOSE(value); - stack_pointer = _PyFrame_GetStackPointer(frame); + assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) || + _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value)))); } // _POP_TOP { - value = stack_pointer[-1]; - stack_pointer += -1; + value = stack_pointer[-2]; + stack_pointer += -2; ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_XCLOSE(value); diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 359c67801ca370..5291728b7b4256 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -399,7 +399,7 @@ dummy_func( PyStackRef_CLOSE(value); } - macro(POP_ITER) = POP_TOP + POP_TOP; + macro(POP_ITER) = _POP_TOP_NOP + POP_TOP; no_save_ip tier1 inst(INSTRUMENTED_END_FOR, (receiver, index_or_null, value -- receiver, index_or_null)) { /* Need to create a fake StopIteration error here, diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 7f01bc2fd91589..19f24d5bcd9e21 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -10182,19 +10182,16 @@ next_instr += 1; INSTRUCTION_STATS(POP_ITER); _PyStackRef value; - // _POP_TOP + // _POP_TOP_NOP { value = stack_pointer[-1]; - stack_pointer += -1; - ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_XCLOSE(value); - stack_pointer = _PyFrame_GetStackPointer(frame); + assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) || + _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value)))); } // _POP_TOP { - value = stack_pointer[-1]; - stack_pointer += -1; + value = stack_pointer[-2]; + stack_pointer += -2; ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_XCLOSE(value);