diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 025a521ef99effa..c0a77f5b1b79b91 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1513,7 +1513,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_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/Include/internal/pycore_uop_ids.h b/Include/internal/pycore_uop_ids.h index 7c44c0a430b7311..2d029cfdb0c6dc2 100644 --- a/Include/internal/pycore_uop_ids.h +++ b/Include/internal/pycore_uop_ids.h @@ -348,7 +348,6 @@ extern "C" { #define _MONITOR_RESUME 580 #define _NOP NOP #define _POP_EXCEPT POP_EXCEPT -#define _POP_ITER POP_ITER #define _POP_JUMP_IF_FALSE 581 #define _POP_JUMP_IF_TRUE 582 #define _POP_TOP POP_TOP @@ -1250,201 +1249,200 @@ extern "C" { #define _NOP_r22 1462 #define _NOP_r33 1463 #define _POP_EXCEPT_r10 1464 -#define _POP_ITER_r20 1465 -#define _POP_JUMP_IF_FALSE_r00 1466 -#define _POP_JUMP_IF_FALSE_r10 1467 -#define _POP_JUMP_IF_FALSE_r21 1468 -#define _POP_JUMP_IF_FALSE_r32 1469 -#define _POP_JUMP_IF_TRUE_r00 1470 -#define _POP_JUMP_IF_TRUE_r10 1471 -#define _POP_JUMP_IF_TRUE_r21 1472 -#define _POP_JUMP_IF_TRUE_r32 1473 -#define _POP_TOP_r10 1474 -#define _POP_TOP_FLOAT_r00 1475 -#define _POP_TOP_FLOAT_r10 1476 -#define _POP_TOP_FLOAT_r21 1477 -#define _POP_TOP_FLOAT_r32 1478 -#define _POP_TOP_INT_r00 1479 -#define _POP_TOP_INT_r10 1480 -#define _POP_TOP_INT_r21 1481 -#define _POP_TOP_INT_r32 1482 -#define _POP_TOP_NOP_r00 1483 -#define _POP_TOP_NOP_r10 1484 -#define _POP_TOP_NOP_r21 1485 -#define _POP_TOP_NOP_r32 1486 -#define _POP_TOP_OPARG_r00 1487 -#define _POP_TOP_UNICODE_r00 1488 -#define _POP_TOP_UNICODE_r10 1489 -#define _POP_TOP_UNICODE_r21 1490 -#define _POP_TOP_UNICODE_r32 1491 -#define _PUSH_EXC_INFO_r02 1492 -#define _PUSH_EXC_INFO_r12 1493 -#define _PUSH_EXC_INFO_r23 1494 -#define _PUSH_FRAME_r10 1495 -#define _PUSH_NULL_r01 1496 -#define _PUSH_NULL_r12 1497 -#define _PUSH_NULL_r23 1498 -#define _PUSH_NULL_CONDITIONAL_r00 1499 -#define _PUSH_TAGGED_ZERO_r01 1500 -#define _PUSH_TAGGED_ZERO_r12 1501 -#define _PUSH_TAGGED_ZERO_r23 1502 -#define _PY_FRAME_EX_r31 1503 -#define _PY_FRAME_GENERAL_r01 1504 -#define _PY_FRAME_KW_r11 1505 -#define _REPLACE_WITH_TRUE_r02 1506 -#define _REPLACE_WITH_TRUE_r12 1507 -#define _REPLACE_WITH_TRUE_r23 1508 -#define _RESUME_CHECK_r00 1509 -#define _RESUME_CHECK_r11 1510 -#define _RESUME_CHECK_r22 1511 -#define _RESUME_CHECK_r33 1512 -#define _RETURN_GENERATOR_r01 1513 -#define _RETURN_VALUE_r11 1514 -#define _RROT_3_r03 1515 -#define _RROT_3_r13 1516 -#define _RROT_3_r23 1517 -#define _RROT_3_r33 1518 -#define _SAVE_RETURN_OFFSET_r00 1519 -#define _SAVE_RETURN_OFFSET_r11 1520 -#define _SAVE_RETURN_OFFSET_r22 1521 -#define _SAVE_RETURN_OFFSET_r33 1522 -#define _SEND_ASYNC_GEN_r33 1523 -#define _SEND_ASYNC_GEN_TIER_TWO_r33 1524 -#define _SEND_GEN_FRAME_r33 1525 -#define _SEND_VIRTUAL_r33 1526 -#define _SEND_VIRTUAL_TIER_TWO_r03 1527 -#define _SEND_VIRTUAL_TIER_TWO_r13 1528 -#define _SEND_VIRTUAL_TIER_TWO_r23 1529 -#define _SEND_VIRTUAL_TIER_TWO_r33 1530 -#define _SETUP_ANNOTATIONS_r00 1531 -#define _SET_ADD_r10 1532 -#define _SET_FUNCTION_ATTRIBUTE_r01 1533 -#define _SET_FUNCTION_ATTRIBUTE_r11 1534 -#define _SET_FUNCTION_ATTRIBUTE_r21 1535 -#define _SET_FUNCTION_ATTRIBUTE_r32 1536 -#define _SET_IP_r00 1537 -#define _SET_IP_r11 1538 -#define _SET_IP_r22 1539 -#define _SET_IP_r33 1540 -#define _SET_UPDATE_r11 1541 -#define _SPILL_OR_RELOAD_r01 1542 -#define _SPILL_OR_RELOAD_r02 1543 -#define _SPILL_OR_RELOAD_r03 1544 -#define _SPILL_OR_RELOAD_r10 1545 -#define _SPILL_OR_RELOAD_r12 1546 -#define _SPILL_OR_RELOAD_r13 1547 -#define _SPILL_OR_RELOAD_r20 1548 -#define _SPILL_OR_RELOAD_r21 1549 -#define _SPILL_OR_RELOAD_r23 1550 -#define _SPILL_OR_RELOAD_r30 1551 -#define _SPILL_OR_RELOAD_r31 1552 -#define _SPILL_OR_RELOAD_r32 1553 -#define _START_EXECUTOR_r00 1554 -#define _STORE_ATTR_r20 1555 -#define _STORE_ATTR_INSTANCE_VALUE_r21 1556 -#define _STORE_ATTR_SLOT_r21 1557 -#define _STORE_ATTR_WITH_HINT_r21 1558 -#define _STORE_DEREF_r10 1559 -#define _STORE_FAST_LOAD_FAST_r11 1560 -#define _STORE_FAST_STORE_FAST_r20 1561 -#define _STORE_GLOBAL_r10 1562 -#define _STORE_NAME_r10 1563 -#define _STORE_SLICE_r30 1564 -#define _STORE_SUBSCR_r30 1565 -#define _STORE_SUBSCR_DICT_r31 1566 -#define _STORE_SUBSCR_DICT_KNOWN_HASH_r31 1567 -#define _STORE_SUBSCR_LIST_INT_r32 1568 -#define _SWAP_r11 1569 -#define _SWAP_2_r02 1570 -#define _SWAP_2_r12 1571 -#define _SWAP_2_r22 1572 -#define _SWAP_2_r33 1573 -#define _SWAP_3_r03 1574 -#define _SWAP_3_r13 1575 -#define _SWAP_3_r23 1576 -#define _SWAP_3_r33 1577 -#define _SWAP_FAST_r01 1578 -#define _SWAP_FAST_r11 1579 -#define _SWAP_FAST_r22 1580 -#define _SWAP_FAST_r33 1581 -#define _SWAP_FAST_0_r01 1582 -#define _SWAP_FAST_0_r11 1583 -#define _SWAP_FAST_0_r22 1584 -#define _SWAP_FAST_0_r33 1585 -#define _SWAP_FAST_1_r01 1586 -#define _SWAP_FAST_1_r11 1587 -#define _SWAP_FAST_1_r22 1588 -#define _SWAP_FAST_1_r33 1589 -#define _SWAP_FAST_2_r01 1590 -#define _SWAP_FAST_2_r11 1591 -#define _SWAP_FAST_2_r22 1592 -#define _SWAP_FAST_2_r33 1593 -#define _SWAP_FAST_3_r01 1594 -#define _SWAP_FAST_3_r11 1595 -#define _SWAP_FAST_3_r22 1596 -#define _SWAP_FAST_3_r33 1597 -#define _SWAP_FAST_4_r01 1598 -#define _SWAP_FAST_4_r11 1599 -#define _SWAP_FAST_4_r22 1600 -#define _SWAP_FAST_4_r33 1601 -#define _SWAP_FAST_5_r01 1602 -#define _SWAP_FAST_5_r11 1603 -#define _SWAP_FAST_5_r22 1604 -#define _SWAP_FAST_5_r33 1605 -#define _SWAP_FAST_6_r01 1606 -#define _SWAP_FAST_6_r11 1607 -#define _SWAP_FAST_6_r22 1608 -#define _SWAP_FAST_6_r33 1609 -#define _SWAP_FAST_7_r01 1610 -#define _SWAP_FAST_7_r11 1611 -#define _SWAP_FAST_7_r22 1612 -#define _SWAP_FAST_7_r33 1613 -#define _TIER2_RESUME_CHECK_r00 1614 -#define _TIER2_RESUME_CHECK_r11 1615 -#define _TIER2_RESUME_CHECK_r22 1616 -#define _TIER2_RESUME_CHECK_r33 1617 -#define _TO_BOOL_r11 1618 -#define _TO_BOOL_BOOL_r01 1619 -#define _TO_BOOL_BOOL_r11 1620 -#define _TO_BOOL_BOOL_r22 1621 -#define _TO_BOOL_BOOL_r33 1622 -#define _TO_BOOL_INT_r02 1623 -#define _TO_BOOL_INT_r12 1624 -#define _TO_BOOL_INT_r23 1625 -#define _TO_BOOL_LIST_r02 1626 -#define _TO_BOOL_LIST_r12 1627 -#define _TO_BOOL_LIST_r23 1628 -#define _TO_BOOL_NONE_r01 1629 -#define _TO_BOOL_NONE_r11 1630 -#define _TO_BOOL_NONE_r22 1631 -#define _TO_BOOL_NONE_r33 1632 -#define _TO_BOOL_STR_r02 1633 -#define _TO_BOOL_STR_r12 1634 -#define _TO_BOOL_STR_r23 1635 -#define _TRACE_RECORD_r00 1636 -#define _UNARY_INVERT_r12 1637 -#define _UNARY_NEGATIVE_r12 1638 -#define _UNARY_NEGATIVE_FLOAT_INPLACE_r02 1639 -#define _UNARY_NEGATIVE_FLOAT_INPLACE_r12 1640 -#define _UNARY_NEGATIVE_FLOAT_INPLACE_r23 1641 -#define _UNARY_NOT_r01 1642 -#define _UNARY_NOT_r11 1643 -#define _UNARY_NOT_r22 1644 -#define _UNARY_NOT_r33 1645 -#define _UNPACK_EX_r10 1646 -#define _UNPACK_SEQUENCE_r10 1647 -#define _UNPACK_SEQUENCE_LIST_r10 1648 -#define _UNPACK_SEQUENCE_TUPLE_r10 1649 -#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1650 -#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r03 1651 -#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r13 1652 -#define _UNPACK_SEQUENCE_UNIQUE_TUPLE_r10 1653 -#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r02 1654 -#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r12 1655 -#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r23 1656 -#define _WITH_EXCEPT_START_r33 1657 -#define _YIELD_VALUE_r11 1658 -#define MAX_UOP_REGS_ID 1658 +#define _POP_JUMP_IF_FALSE_r00 1465 +#define _POP_JUMP_IF_FALSE_r10 1466 +#define _POP_JUMP_IF_FALSE_r21 1467 +#define _POP_JUMP_IF_FALSE_r32 1468 +#define _POP_JUMP_IF_TRUE_r00 1469 +#define _POP_JUMP_IF_TRUE_r10 1470 +#define _POP_JUMP_IF_TRUE_r21 1471 +#define _POP_JUMP_IF_TRUE_r32 1472 +#define _POP_TOP_r10 1473 +#define _POP_TOP_FLOAT_r00 1474 +#define _POP_TOP_FLOAT_r10 1475 +#define _POP_TOP_FLOAT_r21 1476 +#define _POP_TOP_FLOAT_r32 1477 +#define _POP_TOP_INT_r00 1478 +#define _POP_TOP_INT_r10 1479 +#define _POP_TOP_INT_r21 1480 +#define _POP_TOP_INT_r32 1481 +#define _POP_TOP_NOP_r00 1482 +#define _POP_TOP_NOP_r10 1483 +#define _POP_TOP_NOP_r21 1484 +#define _POP_TOP_NOP_r32 1485 +#define _POP_TOP_OPARG_r00 1486 +#define _POP_TOP_UNICODE_r00 1487 +#define _POP_TOP_UNICODE_r10 1488 +#define _POP_TOP_UNICODE_r21 1489 +#define _POP_TOP_UNICODE_r32 1490 +#define _PUSH_EXC_INFO_r02 1491 +#define _PUSH_EXC_INFO_r12 1492 +#define _PUSH_EXC_INFO_r23 1493 +#define _PUSH_FRAME_r10 1494 +#define _PUSH_NULL_r01 1495 +#define _PUSH_NULL_r12 1496 +#define _PUSH_NULL_r23 1497 +#define _PUSH_NULL_CONDITIONAL_r00 1498 +#define _PUSH_TAGGED_ZERO_r01 1499 +#define _PUSH_TAGGED_ZERO_r12 1500 +#define _PUSH_TAGGED_ZERO_r23 1501 +#define _PY_FRAME_EX_r31 1502 +#define _PY_FRAME_GENERAL_r01 1503 +#define _PY_FRAME_KW_r11 1504 +#define _REPLACE_WITH_TRUE_r02 1505 +#define _REPLACE_WITH_TRUE_r12 1506 +#define _REPLACE_WITH_TRUE_r23 1507 +#define _RESUME_CHECK_r00 1508 +#define _RESUME_CHECK_r11 1509 +#define _RESUME_CHECK_r22 1510 +#define _RESUME_CHECK_r33 1511 +#define _RETURN_GENERATOR_r01 1512 +#define _RETURN_VALUE_r11 1513 +#define _RROT_3_r03 1514 +#define _RROT_3_r13 1515 +#define _RROT_3_r23 1516 +#define _RROT_3_r33 1517 +#define _SAVE_RETURN_OFFSET_r00 1518 +#define _SAVE_RETURN_OFFSET_r11 1519 +#define _SAVE_RETURN_OFFSET_r22 1520 +#define _SAVE_RETURN_OFFSET_r33 1521 +#define _SEND_ASYNC_GEN_r33 1522 +#define _SEND_ASYNC_GEN_TIER_TWO_r33 1523 +#define _SEND_GEN_FRAME_r33 1524 +#define _SEND_VIRTUAL_r33 1525 +#define _SEND_VIRTUAL_TIER_TWO_r03 1526 +#define _SEND_VIRTUAL_TIER_TWO_r13 1527 +#define _SEND_VIRTUAL_TIER_TWO_r23 1528 +#define _SEND_VIRTUAL_TIER_TWO_r33 1529 +#define _SETUP_ANNOTATIONS_r00 1530 +#define _SET_ADD_r10 1531 +#define _SET_FUNCTION_ATTRIBUTE_r01 1532 +#define _SET_FUNCTION_ATTRIBUTE_r11 1533 +#define _SET_FUNCTION_ATTRIBUTE_r21 1534 +#define _SET_FUNCTION_ATTRIBUTE_r32 1535 +#define _SET_IP_r00 1536 +#define _SET_IP_r11 1537 +#define _SET_IP_r22 1538 +#define _SET_IP_r33 1539 +#define _SET_UPDATE_r11 1540 +#define _SPILL_OR_RELOAD_r01 1541 +#define _SPILL_OR_RELOAD_r02 1542 +#define _SPILL_OR_RELOAD_r03 1543 +#define _SPILL_OR_RELOAD_r10 1544 +#define _SPILL_OR_RELOAD_r12 1545 +#define _SPILL_OR_RELOAD_r13 1546 +#define _SPILL_OR_RELOAD_r20 1547 +#define _SPILL_OR_RELOAD_r21 1548 +#define _SPILL_OR_RELOAD_r23 1549 +#define _SPILL_OR_RELOAD_r30 1550 +#define _SPILL_OR_RELOAD_r31 1551 +#define _SPILL_OR_RELOAD_r32 1552 +#define _START_EXECUTOR_r00 1553 +#define _STORE_ATTR_r20 1554 +#define _STORE_ATTR_INSTANCE_VALUE_r21 1555 +#define _STORE_ATTR_SLOT_r21 1556 +#define _STORE_ATTR_WITH_HINT_r21 1557 +#define _STORE_DEREF_r10 1558 +#define _STORE_FAST_LOAD_FAST_r11 1559 +#define _STORE_FAST_STORE_FAST_r20 1560 +#define _STORE_GLOBAL_r10 1561 +#define _STORE_NAME_r10 1562 +#define _STORE_SLICE_r30 1563 +#define _STORE_SUBSCR_r30 1564 +#define _STORE_SUBSCR_DICT_r31 1565 +#define _STORE_SUBSCR_DICT_KNOWN_HASH_r31 1566 +#define _STORE_SUBSCR_LIST_INT_r32 1567 +#define _SWAP_r11 1568 +#define _SWAP_2_r02 1569 +#define _SWAP_2_r12 1570 +#define _SWAP_2_r22 1571 +#define _SWAP_2_r33 1572 +#define _SWAP_3_r03 1573 +#define _SWAP_3_r13 1574 +#define _SWAP_3_r23 1575 +#define _SWAP_3_r33 1576 +#define _SWAP_FAST_r01 1577 +#define _SWAP_FAST_r11 1578 +#define _SWAP_FAST_r22 1579 +#define _SWAP_FAST_r33 1580 +#define _SWAP_FAST_0_r01 1581 +#define _SWAP_FAST_0_r11 1582 +#define _SWAP_FAST_0_r22 1583 +#define _SWAP_FAST_0_r33 1584 +#define _SWAP_FAST_1_r01 1585 +#define _SWAP_FAST_1_r11 1586 +#define _SWAP_FAST_1_r22 1587 +#define _SWAP_FAST_1_r33 1588 +#define _SWAP_FAST_2_r01 1589 +#define _SWAP_FAST_2_r11 1590 +#define _SWAP_FAST_2_r22 1591 +#define _SWAP_FAST_2_r33 1592 +#define _SWAP_FAST_3_r01 1593 +#define _SWAP_FAST_3_r11 1594 +#define _SWAP_FAST_3_r22 1595 +#define _SWAP_FAST_3_r33 1596 +#define _SWAP_FAST_4_r01 1597 +#define _SWAP_FAST_4_r11 1598 +#define _SWAP_FAST_4_r22 1599 +#define _SWAP_FAST_4_r33 1600 +#define _SWAP_FAST_5_r01 1601 +#define _SWAP_FAST_5_r11 1602 +#define _SWAP_FAST_5_r22 1603 +#define _SWAP_FAST_5_r33 1604 +#define _SWAP_FAST_6_r01 1605 +#define _SWAP_FAST_6_r11 1606 +#define _SWAP_FAST_6_r22 1607 +#define _SWAP_FAST_6_r33 1608 +#define _SWAP_FAST_7_r01 1609 +#define _SWAP_FAST_7_r11 1610 +#define _SWAP_FAST_7_r22 1611 +#define _SWAP_FAST_7_r33 1612 +#define _TIER2_RESUME_CHECK_r00 1613 +#define _TIER2_RESUME_CHECK_r11 1614 +#define _TIER2_RESUME_CHECK_r22 1615 +#define _TIER2_RESUME_CHECK_r33 1616 +#define _TO_BOOL_r11 1617 +#define _TO_BOOL_BOOL_r01 1618 +#define _TO_BOOL_BOOL_r11 1619 +#define _TO_BOOL_BOOL_r22 1620 +#define _TO_BOOL_BOOL_r33 1621 +#define _TO_BOOL_INT_r02 1622 +#define _TO_BOOL_INT_r12 1623 +#define _TO_BOOL_INT_r23 1624 +#define _TO_BOOL_LIST_r02 1625 +#define _TO_BOOL_LIST_r12 1626 +#define _TO_BOOL_LIST_r23 1627 +#define _TO_BOOL_NONE_r01 1628 +#define _TO_BOOL_NONE_r11 1629 +#define _TO_BOOL_NONE_r22 1630 +#define _TO_BOOL_NONE_r33 1631 +#define _TO_BOOL_STR_r02 1632 +#define _TO_BOOL_STR_r12 1633 +#define _TO_BOOL_STR_r23 1634 +#define _TRACE_RECORD_r00 1635 +#define _UNARY_INVERT_r12 1636 +#define _UNARY_NEGATIVE_r12 1637 +#define _UNARY_NEGATIVE_FLOAT_INPLACE_r02 1638 +#define _UNARY_NEGATIVE_FLOAT_INPLACE_r12 1639 +#define _UNARY_NEGATIVE_FLOAT_INPLACE_r23 1640 +#define _UNARY_NOT_r01 1641 +#define _UNARY_NOT_r11 1642 +#define _UNARY_NOT_r22 1643 +#define _UNARY_NOT_r33 1644 +#define _UNPACK_EX_r10 1645 +#define _UNPACK_SEQUENCE_r10 1646 +#define _UNPACK_SEQUENCE_LIST_r10 1647 +#define _UNPACK_SEQUENCE_TUPLE_r10 1648 +#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1649 +#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r03 1650 +#define _UNPACK_SEQUENCE_UNIQUE_THREE_TUPLE_r13 1651 +#define _UNPACK_SEQUENCE_UNIQUE_TUPLE_r10 1652 +#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r02 1653 +#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r12 1654 +#define _UNPACK_SEQUENCE_UNIQUE_TWO_TUPLE_r23 1655 +#define _WITH_EXCEPT_START_r33 1656 +#define _YIELD_VALUE_r11 1657 +#define MAX_UOP_REGS_ID 1657 #ifdef __cplusplus } diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 3355ebec725e01c..f5fdd4c4bee431b 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_TOP_OPARG] = HAS_ARG_FLAG | 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_NEGATIVE_FLOAT_INPLACE] = 0, @@ -872,15 +871,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 = { 3, 3, 3, 3 }, .entries = { @@ -4081,7 +4071,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_r31] = _END_SEND, [_UNARY_NEGATIVE_r12] = _UNARY_NEGATIVE, [_UNARY_NEGATIVE_FLOAT_INPLACE_r02] = _UNARY_NEGATIVE_FLOAT_INPLACE, @@ -5952,8 +5941,6 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = { [_NOP_r33] = "_NOP_r33", [_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", @@ -6318,8 +6305,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 3; case _UNARY_NEGATIVE: diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 2248920c266aef5..b9672bb5be7d8a6 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -6056,6 +6056,21 @@ 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): + for _ in range(5): + pass + + self._run_with_optimizer(testfunc, TIER2_THRESHOLD*2) + all_ex = get_all_executors(testfunc) + + self.assertEqual(len(all_ex), 3) + pop_iter_ex = all_ex[1] + + self.assertEqual(count_ops(pop_iter_ex, "_POP_TOP"), 1) + self.assertEqual(count_ops(pop_iter_ex, "_POP_TOP_NOP"), 1) + def test_call_kw(self): def func(a): return int(a) * 42 diff --git a/Modules/_testinternalcapi/test_cases.c.h b/Modules/_testinternalcapi/test_cases.c.h index fdc077c9549a144..554370ac3bff800 100644 --- a/Modules/_testinternalcapi/test_cases.c.h +++ b/Modules/_testinternalcapi/test_cases.c.h @@ -11114,17 +11114,23 @@ 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); - _PyFrame_StackPointerValidate(frame); - PyStackRef_CLOSE(iter); - _PyFrame_StackPointerInvalidate(frame); + _PyStackRef value; + // _POP_TOP_NOP + { + value = stack_pointer[-1]; + assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) || + _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value)))); + } + // _POP_TOP + { + value = stack_pointer[-2]; + stack_pointer += -2; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyFrame_StackPointerValidate(frame); + PyStackRef_XCLOSE(value); + _PyFrame_StackPointerInvalidate(frame); + } DISPATCH(); } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 31596e0bc7a31d2..a57d29f6765c614 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -400,12 +400,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_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/executor_cases.c.h b/Python/executor_cases.c.h index 943d4c557886822..b27e8dd633af262 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -2580,28 +2580,6 @@ break; } - case _POP_ITER_r20: { - CHECK_CURRENT_CACHED_VALUES(2); - ASSERT_WITHIN_STACK_BOUNDS_IGNORING_CACHE(__FILE__, __LINE__); - _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); - _PyFrame_StackPointerValidate(frame); - PyStackRef_CLOSE(iter); - _PyFrame_StackPointerInvalidate(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(__FILE__, __LINE__); - break; - } - case _END_SEND_r31: { CHECK_CURRENT_CACHED_VALUES(3); ASSERT_WITHIN_STACK_BOUNDS_IGNORING_CACHE(__FILE__, __LINE__); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 0da86abed67f63b..bddea3b5d4ca760 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -11112,17 +11112,23 @@ 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); - _PyFrame_StackPointerValidate(frame); - PyStackRef_CLOSE(iter); - _PyFrame_StackPointerInvalidate(frame); + _PyStackRef value; + // _POP_TOP_NOP + { + value = stack_pointer[-1]; + assert(PyStackRef_IsNull(value) || (!PyStackRef_RefcountOnObject(value)) || + _Py_IsImmortal((PyStackRef_AsPyObjectBorrow(value)))); + } + // _POP_TOP + { + value = stack_pointer[-2]; + stack_pointer += -2; + ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__); + _PyFrame_SetStackPointer(frame, stack_pointer); + _PyFrame_StackPointerValidate(frame); + PyStackRef_XCLOSE(value); + _PyFrame_StackPointerInvalidate(frame); + } DISPATCH(); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 8895e02d47b1693..0a6ded7009b31e0 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -194,13 +194,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);