gh-134584: Specialize POP_TOP by reference and type in JIT (GH-135761)

This commit is contained in:
Ken Jin 2025-06-24 00:57:14 +08:00 committed by GitHub
parent 99712c45cc
commit 569fc6870f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 239 additions and 62 deletions

View file

@ -284,72 +284,76 @@ extern "C" {
#define _POP_JUMP_IF_FALSE 500
#define _POP_JUMP_IF_TRUE 501
#define _POP_TOP POP_TOP
#define _POP_TOP_LOAD_CONST_INLINE 502
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 503
#define _POP_TWO 504
#define _POP_TWO_LOAD_CONST_INLINE_BORROW 505
#define _POP_TOP_FLOAT 502
#define _POP_TOP_INT 503
#define _POP_TOP_LOAD_CONST_INLINE 504
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 505
#define _POP_TOP_NOP 506
#define _POP_TOP_UNICODE 507
#define _POP_TWO 508
#define _POP_TWO_LOAD_CONST_INLINE_BORROW 509
#define _PUSH_EXC_INFO PUSH_EXC_INFO
#define _PUSH_FRAME 506
#define _PUSH_FRAME 510
#define _PUSH_NULL PUSH_NULL
#define _PUSH_NULL_CONDITIONAL 507
#define _PY_FRAME_GENERAL 508
#define _PY_FRAME_KW 509
#define _QUICKEN_RESUME 510
#define _REPLACE_WITH_TRUE 511
#define _PUSH_NULL_CONDITIONAL 511
#define _PY_FRAME_GENERAL 512
#define _PY_FRAME_KW 513
#define _QUICKEN_RESUME 514
#define _REPLACE_WITH_TRUE 515
#define _RESUME_CHECK RESUME_CHECK
#define _RETURN_GENERATOR RETURN_GENERATOR
#define _RETURN_VALUE RETURN_VALUE
#define _SAVE_RETURN_OFFSET 512
#define _SEND 513
#define _SEND_GEN_FRAME 514
#define _SAVE_RETURN_OFFSET 516
#define _SEND 517
#define _SEND_GEN_FRAME 518
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
#define _SET_ADD SET_ADD
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
#define _SET_UPDATE SET_UPDATE
#define _START_EXECUTOR 515
#define _STORE_ATTR 516
#define _STORE_ATTR_INSTANCE_VALUE 517
#define _STORE_ATTR_SLOT 518
#define _STORE_ATTR_WITH_HINT 519
#define _START_EXECUTOR 519
#define _STORE_ATTR 520
#define _STORE_ATTR_INSTANCE_VALUE 521
#define _STORE_ATTR_SLOT 522
#define _STORE_ATTR_WITH_HINT 523
#define _STORE_DEREF STORE_DEREF
#define _STORE_FAST 520
#define _STORE_FAST_0 521
#define _STORE_FAST_1 522
#define _STORE_FAST_2 523
#define _STORE_FAST_3 524
#define _STORE_FAST_4 525
#define _STORE_FAST_5 526
#define _STORE_FAST_6 527
#define _STORE_FAST_7 528
#define _STORE_FAST 524
#define _STORE_FAST_0 525
#define _STORE_FAST_1 526
#define _STORE_FAST_2 527
#define _STORE_FAST_3 528
#define _STORE_FAST_4 529
#define _STORE_FAST_5 530
#define _STORE_FAST_6 531
#define _STORE_FAST_7 532
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
#define _STORE_GLOBAL STORE_GLOBAL
#define _STORE_NAME STORE_NAME
#define _STORE_SLICE 529
#define _STORE_SUBSCR 530
#define _STORE_SUBSCR_DICT 531
#define _STORE_SUBSCR_LIST_INT 532
#define _SWAP 533
#define _SWAP_2 534
#define _SWAP_3 535
#define _TIER2_RESUME_CHECK 536
#define _TO_BOOL 537
#define _STORE_SLICE 533
#define _STORE_SUBSCR 534
#define _STORE_SUBSCR_DICT 535
#define _STORE_SUBSCR_LIST_INT 536
#define _SWAP 537
#define _SWAP_2 538
#define _SWAP_3 539
#define _TIER2_RESUME_CHECK 540
#define _TO_BOOL 541
#define _TO_BOOL_BOOL TO_BOOL_BOOL
#define _TO_BOOL_INT TO_BOOL_INT
#define _TO_BOOL_LIST 538
#define _TO_BOOL_LIST 542
#define _TO_BOOL_NONE TO_BOOL_NONE
#define _TO_BOOL_STR 539
#define _TO_BOOL_STR 543
#define _UNARY_INVERT UNARY_INVERT
#define _UNARY_NEGATIVE UNARY_NEGATIVE
#define _UNARY_NOT UNARY_NOT
#define _UNPACK_EX UNPACK_EX
#define _UNPACK_SEQUENCE 540
#define _UNPACK_SEQUENCE_LIST 541
#define _UNPACK_SEQUENCE_TUPLE 542
#define _UNPACK_SEQUENCE_TWO_TUPLE 543
#define _UNPACK_SEQUENCE 544
#define _UNPACK_SEQUENCE_LIST 545
#define _UNPACK_SEQUENCE_TUPLE 546
#define _UNPACK_SEQUENCE_TWO_TUPLE 547
#define _WITH_EXCEPT_START WITH_EXCEPT_START
#define _YIELD_VALUE YIELD_VALUE
#define MAX_UOP_ID 543
#define MAX_UOP_ID 547
#ifdef __cplusplus
}

View file

@ -64,6 +64,10 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_STORE_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ESCAPES_FLAG,
[_STORE_FAST_STORE_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_ESCAPES_FLAG,
[_POP_TOP] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
[_POP_TOP_NOP] = 0,
[_POP_TOP_INT] = 0,
[_POP_TOP_FLOAT] = 0,
[_POP_TOP_UNICODE] = 0,
[_POP_TWO] = HAS_ESCAPES_FLAG,
[_PUSH_NULL] = HAS_PURE_FLAG,
[_END_FOR] = HAS_ESCAPES_FLAG | HAS_NO_SAVE_IP_FLAG,
@ -593,8 +597,12 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_POP_EXCEPT] = "_POP_EXCEPT",
[_POP_ITER] = "_POP_ITER",
[_POP_TOP] = "_POP_TOP",
[_POP_TOP_FLOAT] = "_POP_TOP_FLOAT",
[_POP_TOP_INT] = "_POP_TOP_INT",
[_POP_TOP_LOAD_CONST_INLINE] = "_POP_TOP_LOAD_CONST_INLINE",
[_POP_TOP_LOAD_CONST_INLINE_BORROW] = "_POP_TOP_LOAD_CONST_INLINE_BORROW",
[_POP_TOP_NOP] = "_POP_TOP_NOP",
[_POP_TOP_UNICODE] = "_POP_TOP_UNICODE",
[_POP_TWO] = "_POP_TWO",
[_POP_TWO_LOAD_CONST_INLINE_BORROW] = "_POP_TWO_LOAD_CONST_INLINE_BORROW",
[_PUSH_EXC_INFO] = "_PUSH_EXC_INFO",
@ -749,6 +757,14 @@ int _PyUop_num_popped(int opcode, int oparg)
return 2;
case _POP_TOP:
return 1;
case _POP_TOP_NOP:
return 1;
case _POP_TOP_INT:
return 1;
case _POP_TOP_FLOAT:
return 1;
case _POP_TOP_UNICODE:
return 1;
case _POP_TWO:
return 2;
case _PUSH_NULL: