mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
GH-128685: Specialize (rather than quicken) LOAD_CONST into LOAD_CONST_[IM]MORTAL (GH-128708)
This commit is contained in:
parent
29fe8072cf
commit
ddd959987c
14 changed files with 121 additions and 65 deletions
|
@ -265,6 +265,7 @@ Known values:
|
||||||
Python 3.14a4 3610 (Add VALUE_WITH_FAKE_GLOBALS format to annotationlib)
|
Python 3.14a4 3610 (Add VALUE_WITH_FAKE_GLOBALS format to annotationlib)
|
||||||
Python 3.14a4 3611 (Add NOT_TAKEN instruction)
|
Python 3.14a4 3611 (Add NOT_TAKEN instruction)
|
||||||
Python 3.14a4 3612 (Add POP_ITER and INSTRUMENTED_POP_ITER)
|
Python 3.14a4 3612 (Add POP_ITER and INSTRUMENTED_POP_ITER)
|
||||||
|
Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction)
|
||||||
|
|
||||||
Python 3.15 will start with 3650
|
Python 3.15 will start with 3650
|
||||||
|
|
||||||
|
@ -277,7 +278,7 @@ PC/launcher.c must also be updated.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PYC_MAGIC_NUMBER 3612
|
#define PYC_MAGIC_NUMBER 3613
|
||||||
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
|
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
|
||||||
(little-endian) and then appending b'\r\n'. */
|
(little-endian) and then appending b'\r\n'. */
|
||||||
#define PYC_MAGIC_NUMBER_TOKEN \
|
#define PYC_MAGIC_NUMBER_TOKEN \
|
||||||
|
|
16
Include/internal/pycore_opcode_metadata.h
generated
16
Include/internal/pycore_opcode_metadata.h
generated
|
@ -321,6 +321,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
|
||||||
return 0;
|
return 0;
|
||||||
case LOAD_CONST_IMMORTAL:
|
case LOAD_CONST_IMMORTAL:
|
||||||
return 0;
|
return 0;
|
||||||
|
case LOAD_CONST_MORTAL:
|
||||||
|
return 0;
|
||||||
case LOAD_DEREF:
|
case LOAD_DEREF:
|
||||||
return 0;
|
return 0;
|
||||||
case LOAD_FAST:
|
case LOAD_FAST:
|
||||||
|
@ -788,6 +790,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
|
||||||
return 1;
|
return 1;
|
||||||
case LOAD_CONST_IMMORTAL:
|
case LOAD_CONST_IMMORTAL:
|
||||||
return 1;
|
return 1;
|
||||||
|
case LOAD_CONST_MORTAL:
|
||||||
|
return 1;
|
||||||
case LOAD_DEREF:
|
case LOAD_DEREF:
|
||||||
return 1;
|
return 1;
|
||||||
case LOAD_FAST:
|
case LOAD_FAST:
|
||||||
|
@ -1559,6 +1563,10 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
|
||||||
*effect = 1;
|
*effect = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
case LOAD_CONST_MORTAL: {
|
||||||
|
*effect = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case LOAD_DEREF: {
|
case LOAD_DEREF: {
|
||||||
*effect = 1;
|
*effect = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2109,8 +2117,9 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
|
||||||
[LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
|
[LOAD_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC00000000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG },
|
||||||
[LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
[LOAD_BUILD_CLASS] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||||
[LOAD_COMMON_CONSTANT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
|
[LOAD_COMMON_CONSTANT] = { true, INSTR_FMT_IB, HAS_ARG_FLAG },
|
||||||
[LOAD_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG },
|
[LOAD_CONST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG },
|
||||||
[LOAD_CONST_IMMORTAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG },
|
[LOAD_CONST_IMMORTAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG },
|
||||||
|
[LOAD_CONST_MORTAL] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_CONST_FLAG },
|
||||||
[LOAD_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
[LOAD_DEREF] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_FREE_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||||
[LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG },
|
[LOAD_FAST] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG },
|
||||||
[LOAD_FAST_AND_CLEAR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG },
|
[LOAD_FAST_AND_CLEAR] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_LOCAL_FLAG },
|
||||||
|
@ -2317,8 +2326,8 @@ _PyOpcode_macro_expansion[256] = {
|
||||||
[LOAD_ATTR_WITH_HINT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_WITH_HINT, 0, 0 }, { _LOAD_ATTR_WITH_HINT, 1, 3 } } },
|
[LOAD_ATTR_WITH_HINT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_WITH_HINT, 0, 0 }, { _LOAD_ATTR_WITH_HINT, 1, 3 } } },
|
||||||
[LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, 0, 0 } } },
|
[LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, 0, 0 } } },
|
||||||
[LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, 0, 0 } } },
|
[LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, 0, 0 } } },
|
||||||
[LOAD_CONST] = { .nuops = 1, .uops = { { _LOAD_CONST, 0, 0 } } },
|
|
||||||
[LOAD_CONST_IMMORTAL] = { .nuops = 1, .uops = { { _LOAD_CONST_IMMORTAL, 0, 0 } } },
|
[LOAD_CONST_IMMORTAL] = { .nuops = 1, .uops = { { _LOAD_CONST_IMMORTAL, 0, 0 } } },
|
||||||
|
[LOAD_CONST_MORTAL] = { .nuops = 1, .uops = { { _LOAD_CONST_MORTAL, 0, 0 } } },
|
||||||
[LOAD_DEREF] = { .nuops = 1, .uops = { { _LOAD_DEREF, 0, 0 } } },
|
[LOAD_DEREF] = { .nuops = 1, .uops = { { _LOAD_DEREF, 0, 0 } } },
|
||||||
[LOAD_FAST] = { .nuops = 1, .uops = { { _LOAD_FAST, 0, 0 } } },
|
[LOAD_FAST] = { .nuops = 1, .uops = { { _LOAD_FAST, 0, 0 } } },
|
||||||
[LOAD_FAST_AND_CLEAR] = { .nuops = 1, .uops = { { _LOAD_FAST_AND_CLEAR, 0, 0 } } },
|
[LOAD_FAST_AND_CLEAR] = { .nuops = 1, .uops = { { _LOAD_FAST_AND_CLEAR, 0, 0 } } },
|
||||||
|
@ -2541,6 +2550,7 @@ const char *_PyOpcode_OpName[266] = {
|
||||||
[LOAD_COMMON_CONSTANT] = "LOAD_COMMON_CONSTANT",
|
[LOAD_COMMON_CONSTANT] = "LOAD_COMMON_CONSTANT",
|
||||||
[LOAD_CONST] = "LOAD_CONST",
|
[LOAD_CONST] = "LOAD_CONST",
|
||||||
[LOAD_CONST_IMMORTAL] = "LOAD_CONST_IMMORTAL",
|
[LOAD_CONST_IMMORTAL] = "LOAD_CONST_IMMORTAL",
|
||||||
|
[LOAD_CONST_MORTAL] = "LOAD_CONST_MORTAL",
|
||||||
[LOAD_DEREF] = "LOAD_DEREF",
|
[LOAD_DEREF] = "LOAD_DEREF",
|
||||||
[LOAD_FAST] = "LOAD_FAST",
|
[LOAD_FAST] = "LOAD_FAST",
|
||||||
[LOAD_FAST_AND_CLEAR] = "LOAD_FAST_AND_CLEAR",
|
[LOAD_FAST_AND_CLEAR] = "LOAD_FAST_AND_CLEAR",
|
||||||
|
@ -2796,6 +2806,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
||||||
[LOAD_COMMON_CONSTANT] = LOAD_COMMON_CONSTANT,
|
[LOAD_COMMON_CONSTANT] = LOAD_COMMON_CONSTANT,
|
||||||
[LOAD_CONST] = LOAD_CONST,
|
[LOAD_CONST] = LOAD_CONST,
|
||||||
[LOAD_CONST_IMMORTAL] = LOAD_CONST,
|
[LOAD_CONST_IMMORTAL] = LOAD_CONST,
|
||||||
|
[LOAD_CONST_MORTAL] = LOAD_CONST,
|
||||||
[LOAD_DEREF] = LOAD_DEREF,
|
[LOAD_DEREF] = LOAD_DEREF,
|
||||||
[LOAD_FAST] = LOAD_FAST,
|
[LOAD_FAST] = LOAD_FAST,
|
||||||
[LOAD_FAST_AND_CLEAR] = LOAD_FAST_AND_CLEAR,
|
[LOAD_FAST_AND_CLEAR] = LOAD_FAST_AND_CLEAR,
|
||||||
|
@ -2912,7 +2923,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
|
||||||
case 146: \
|
case 146: \
|
||||||
case 147: \
|
case 147: \
|
||||||
case 148: \
|
case 148: \
|
||||||
case 228: \
|
|
||||||
case 229: \
|
case 229: \
|
||||||
case 230: \
|
case 230: \
|
||||||
case 231: \
|
case 231: \
|
||||||
|
|
1
Include/internal/pycore_uop_ids.h
generated
1
Include/internal/pycore_uop_ids.h
generated
|
@ -206,6 +206,7 @@ extern "C" {
|
||||||
#define _LOAD_CONST_INLINE_BORROW 430
|
#define _LOAD_CONST_INLINE_BORROW 430
|
||||||
#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 431
|
#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 431
|
||||||
#define _LOAD_CONST_INLINE_WITH_NULL 432
|
#define _LOAD_CONST_INLINE_WITH_NULL 432
|
||||||
|
#define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL
|
||||||
#define _LOAD_DEREF LOAD_DEREF
|
#define _LOAD_DEREF LOAD_DEREF
|
||||||
#define _LOAD_FAST 433
|
#define _LOAD_FAST 433
|
||||||
#define _LOAD_FAST_0 434
|
#define _LOAD_FAST_0 434
|
||||||
|
|
6
Include/internal/pycore_uop_metadata.h
generated
6
Include/internal/pycore_uop_metadata.h
generated
|
@ -35,7 +35,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
||||||
[_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG,
|
[_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG | HAS_PURE_FLAG,
|
||||||
[_LOAD_FAST_AND_CLEAR] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
|
[_LOAD_FAST_AND_CLEAR] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
|
||||||
[_LOAD_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
|
[_LOAD_FAST_LOAD_FAST] = HAS_ARG_FLAG | HAS_LOCAL_FLAG,
|
||||||
[_LOAD_CONST] = HAS_ARG_FLAG | HAS_CONST_FLAG | HAS_PURE_FLAG,
|
[_LOAD_CONST_MORTAL] = HAS_ARG_FLAG | HAS_CONST_FLAG,
|
||||||
[_LOAD_CONST_IMMORTAL] = HAS_ARG_FLAG | HAS_CONST_FLAG,
|
[_LOAD_CONST_IMMORTAL] = HAS_ARG_FLAG | HAS_CONST_FLAG,
|
||||||
[_LOAD_SMALL_INT_0] = 0,
|
[_LOAD_SMALL_INT_0] = 0,
|
||||||
[_LOAD_SMALL_INT_1] = 0,
|
[_LOAD_SMALL_INT_1] = 0,
|
||||||
|
@ -474,12 +474,12 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
||||||
[_LOAD_ATTR_WITH_HINT] = "_LOAD_ATTR_WITH_HINT",
|
[_LOAD_ATTR_WITH_HINT] = "_LOAD_ATTR_WITH_HINT",
|
||||||
[_LOAD_BUILD_CLASS] = "_LOAD_BUILD_CLASS",
|
[_LOAD_BUILD_CLASS] = "_LOAD_BUILD_CLASS",
|
||||||
[_LOAD_COMMON_CONSTANT] = "_LOAD_COMMON_CONSTANT",
|
[_LOAD_COMMON_CONSTANT] = "_LOAD_COMMON_CONSTANT",
|
||||||
[_LOAD_CONST] = "_LOAD_CONST",
|
|
||||||
[_LOAD_CONST_IMMORTAL] = "_LOAD_CONST_IMMORTAL",
|
[_LOAD_CONST_IMMORTAL] = "_LOAD_CONST_IMMORTAL",
|
||||||
[_LOAD_CONST_INLINE] = "_LOAD_CONST_INLINE",
|
[_LOAD_CONST_INLINE] = "_LOAD_CONST_INLINE",
|
||||||
[_LOAD_CONST_INLINE_BORROW] = "_LOAD_CONST_INLINE_BORROW",
|
[_LOAD_CONST_INLINE_BORROW] = "_LOAD_CONST_INLINE_BORROW",
|
||||||
[_LOAD_CONST_INLINE_BORROW_WITH_NULL] = "_LOAD_CONST_INLINE_BORROW_WITH_NULL",
|
[_LOAD_CONST_INLINE_BORROW_WITH_NULL] = "_LOAD_CONST_INLINE_BORROW_WITH_NULL",
|
||||||
[_LOAD_CONST_INLINE_WITH_NULL] = "_LOAD_CONST_INLINE_WITH_NULL",
|
[_LOAD_CONST_INLINE_WITH_NULL] = "_LOAD_CONST_INLINE_WITH_NULL",
|
||||||
|
[_LOAD_CONST_MORTAL] = "_LOAD_CONST_MORTAL",
|
||||||
[_LOAD_DEREF] = "_LOAD_DEREF",
|
[_LOAD_DEREF] = "_LOAD_DEREF",
|
||||||
[_LOAD_FAST] = "_LOAD_FAST",
|
[_LOAD_FAST] = "_LOAD_FAST",
|
||||||
[_LOAD_FAST_0] = "_LOAD_FAST_0",
|
[_LOAD_FAST_0] = "_LOAD_FAST_0",
|
||||||
|
@ -617,7 +617,7 @@ int _PyUop_num_popped(int opcode, int oparg)
|
||||||
return 0;
|
return 0;
|
||||||
case _LOAD_FAST_LOAD_FAST:
|
case _LOAD_FAST_LOAD_FAST:
|
||||||
return 0;
|
return 0;
|
||||||
case _LOAD_CONST:
|
case _LOAD_CONST_MORTAL:
|
||||||
return 0;
|
return 0;
|
||||||
case _LOAD_CONST_IMMORTAL:
|
case _LOAD_CONST_IMMORTAL:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
41
Include/opcode_ids.h
generated
41
Include/opcode_ids.h
generated
|
@ -187,26 +187,27 @@ extern "C" {
|
||||||
#define LOAD_ATTR_SLOT 205
|
#define LOAD_ATTR_SLOT 205
|
||||||
#define LOAD_ATTR_WITH_HINT 206
|
#define LOAD_ATTR_WITH_HINT 206
|
||||||
#define LOAD_CONST_IMMORTAL 207
|
#define LOAD_CONST_IMMORTAL 207
|
||||||
#define LOAD_GLOBAL_BUILTIN 208
|
#define LOAD_CONST_MORTAL 208
|
||||||
#define LOAD_GLOBAL_MODULE 209
|
#define LOAD_GLOBAL_BUILTIN 209
|
||||||
#define LOAD_SUPER_ATTR_ATTR 210
|
#define LOAD_GLOBAL_MODULE 210
|
||||||
#define LOAD_SUPER_ATTR_METHOD 211
|
#define LOAD_SUPER_ATTR_ATTR 211
|
||||||
#define RESUME_CHECK 212
|
#define LOAD_SUPER_ATTR_METHOD 212
|
||||||
#define SEND_GEN 213
|
#define RESUME_CHECK 213
|
||||||
#define STORE_ATTR_INSTANCE_VALUE 214
|
#define SEND_GEN 214
|
||||||
#define STORE_ATTR_SLOT 215
|
#define STORE_ATTR_INSTANCE_VALUE 215
|
||||||
#define STORE_ATTR_WITH_HINT 216
|
#define STORE_ATTR_SLOT 216
|
||||||
#define STORE_SUBSCR_DICT 217
|
#define STORE_ATTR_WITH_HINT 217
|
||||||
#define STORE_SUBSCR_LIST_INT 218
|
#define STORE_SUBSCR_DICT 218
|
||||||
#define TO_BOOL_ALWAYS_TRUE 219
|
#define STORE_SUBSCR_LIST_INT 219
|
||||||
#define TO_BOOL_BOOL 220
|
#define TO_BOOL_ALWAYS_TRUE 220
|
||||||
#define TO_BOOL_INT 221
|
#define TO_BOOL_BOOL 221
|
||||||
#define TO_BOOL_LIST 222
|
#define TO_BOOL_INT 222
|
||||||
#define TO_BOOL_NONE 223
|
#define TO_BOOL_LIST 223
|
||||||
#define TO_BOOL_STR 224
|
#define TO_BOOL_NONE 224
|
||||||
#define UNPACK_SEQUENCE_LIST 225
|
#define TO_BOOL_STR 225
|
||||||
#define UNPACK_SEQUENCE_TUPLE 226
|
#define UNPACK_SEQUENCE_LIST 226
|
||||||
#define UNPACK_SEQUENCE_TWO_TUPLE 227
|
#define UNPACK_SEQUENCE_TUPLE 227
|
||||||
|
#define UNPACK_SEQUENCE_TWO_TUPLE 228
|
||||||
#define INSTRUMENTED_END_FOR 235
|
#define INSTRUMENTED_END_FOR 235
|
||||||
#define INSTRUMENTED_POP_ITER 236
|
#define INSTRUMENTED_POP_ITER 236
|
||||||
#define INSTRUMENTED_END_SEND 237
|
#define INSTRUMENTED_END_SEND 237
|
||||||
|
|
42
Lib/_opcode_metadata.py
generated
42
Lib/_opcode_metadata.py
generated
|
@ -7,6 +7,7 @@ _specializations = {
|
||||||
"RESUME_CHECK",
|
"RESUME_CHECK",
|
||||||
],
|
],
|
||||||
"LOAD_CONST": [
|
"LOAD_CONST": [
|
||||||
|
"LOAD_CONST_MORTAL",
|
||||||
"LOAD_CONST_IMMORTAL",
|
"LOAD_CONST_IMMORTAL",
|
||||||
],
|
],
|
||||||
"TO_BOOL": [
|
"TO_BOOL": [
|
||||||
|
@ -178,26 +179,27 @@ _specialized_opmap = {
|
||||||
'LOAD_ATTR_SLOT': 205,
|
'LOAD_ATTR_SLOT': 205,
|
||||||
'LOAD_ATTR_WITH_HINT': 206,
|
'LOAD_ATTR_WITH_HINT': 206,
|
||||||
'LOAD_CONST_IMMORTAL': 207,
|
'LOAD_CONST_IMMORTAL': 207,
|
||||||
'LOAD_GLOBAL_BUILTIN': 208,
|
'LOAD_CONST_MORTAL': 208,
|
||||||
'LOAD_GLOBAL_MODULE': 209,
|
'LOAD_GLOBAL_BUILTIN': 209,
|
||||||
'LOAD_SUPER_ATTR_ATTR': 210,
|
'LOAD_GLOBAL_MODULE': 210,
|
||||||
'LOAD_SUPER_ATTR_METHOD': 211,
|
'LOAD_SUPER_ATTR_ATTR': 211,
|
||||||
'RESUME_CHECK': 212,
|
'LOAD_SUPER_ATTR_METHOD': 212,
|
||||||
'SEND_GEN': 213,
|
'RESUME_CHECK': 213,
|
||||||
'STORE_ATTR_INSTANCE_VALUE': 214,
|
'SEND_GEN': 214,
|
||||||
'STORE_ATTR_SLOT': 215,
|
'STORE_ATTR_INSTANCE_VALUE': 215,
|
||||||
'STORE_ATTR_WITH_HINT': 216,
|
'STORE_ATTR_SLOT': 216,
|
||||||
'STORE_SUBSCR_DICT': 217,
|
'STORE_ATTR_WITH_HINT': 217,
|
||||||
'STORE_SUBSCR_LIST_INT': 218,
|
'STORE_SUBSCR_DICT': 218,
|
||||||
'TO_BOOL_ALWAYS_TRUE': 219,
|
'STORE_SUBSCR_LIST_INT': 219,
|
||||||
'TO_BOOL_BOOL': 220,
|
'TO_BOOL_ALWAYS_TRUE': 220,
|
||||||
'TO_BOOL_INT': 221,
|
'TO_BOOL_BOOL': 221,
|
||||||
'TO_BOOL_LIST': 222,
|
'TO_BOOL_INT': 222,
|
||||||
'TO_BOOL_NONE': 223,
|
'TO_BOOL_LIST': 223,
|
||||||
'TO_BOOL_STR': 224,
|
'TO_BOOL_NONE': 224,
|
||||||
'UNPACK_SEQUENCE_LIST': 225,
|
'TO_BOOL_STR': 225,
|
||||||
'UNPACK_SEQUENCE_TUPLE': 226,
|
'UNPACK_SEQUENCE_LIST': 226,
|
||||||
'UNPACK_SEQUENCE_TWO_TUPLE': 227,
|
'UNPACK_SEQUENCE_TUPLE': 227,
|
||||||
|
'UNPACK_SEQUENCE_TWO_TUPLE': 228,
|
||||||
}
|
}
|
||||||
|
|
||||||
opmap = {
|
opmap = {
|
||||||
|
|
|
@ -892,7 +892,7 @@ dis_loop_test_quickened_code = """\
|
||||||
%3d RESUME_CHECK 0
|
%3d RESUME_CHECK 0
|
||||||
|
|
||||||
%3d BUILD_LIST 0
|
%3d BUILD_LIST 0
|
||||||
LOAD_CONST 0 ((1, 2, 3))
|
LOAD_CONST_MORTAL 0 ((1, 2, 3))
|
||||||
LIST_EXTEND 1
|
LIST_EXTEND 1
|
||||||
LOAD_SMALL_INT 3
|
LOAD_SMALL_INT 3
|
||||||
BINARY_OP 5 (*)
|
BINARY_OP 5 (*)
|
||||||
|
@ -2548,7 +2548,7 @@ class TestDisCLI(unittest.TestCase):
|
||||||
expect = '''
|
expect = '''
|
||||||
0 RESUME 0
|
0 RESUME 0
|
||||||
|
|
||||||
1 LOAD_CONST_IMMORTAL 0 (None)
|
1 LOAD_CONST 0 (None)
|
||||||
RETURN_VALUE
|
RETURN_VALUE
|
||||||
'''
|
'''
|
||||||
for flag in ['-S', '--specialized']:
|
for flag in ['-S', '--specialized']:
|
||||||
|
|
|
@ -285,11 +285,25 @@ dummy_func(
|
||||||
}
|
}
|
||||||
|
|
||||||
family(LOAD_CONST, 0) = {
|
family(LOAD_CONST, 0) = {
|
||||||
|
LOAD_CONST_MORTAL,
|
||||||
LOAD_CONST_IMMORTAL,
|
LOAD_CONST_IMMORTAL,
|
||||||
};
|
};
|
||||||
|
|
||||||
pure inst(LOAD_CONST, (-- value)) {
|
inst(LOAD_CONST, (-- value)) {
|
||||||
value = PyStackRef_FromPyObjectNew(GETITEM(FRAME_CO_CONSTS, oparg));
|
/* We can't do this in the bytecode compiler as
|
||||||
|
* marshalling can intern strings and make them immortal. */
|
||||||
|
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||||
|
value = PyStackRef_FromPyObjectNew(obj);
|
||||||
|
#if ENABLE_SPECIALIZATION
|
||||||
|
if (this_instr->op.code == LOAD_CONST) {
|
||||||
|
this_instr->op.code = _Py_IsImmortal(obj) ? LOAD_CONST_IMMORTAL : LOAD_CONST_MORTAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inst(LOAD_CONST_MORTAL, (-- value)) {
|
||||||
|
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||||
|
value = PyStackRef_FromPyObjectNew(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
inst(LOAD_CONST_IMMORTAL, (-- value)) {
|
inst(LOAD_CONST_IMMORTAL, (-- value)) {
|
||||||
|
|
7
Python/executor_cases.c.h
generated
7
Python/executor_cases.c.h
generated
|
@ -209,10 +209,13 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case _LOAD_CONST: {
|
/* _LOAD_CONST is not a viable micro-op for tier 2 because it uses the 'this_instr' variable */
|
||||||
|
|
||||||
|
case _LOAD_CONST_MORTAL: {
|
||||||
_PyStackRef value;
|
_PyStackRef value;
|
||||||
oparg = CURRENT_OPARG();
|
oparg = CURRENT_OPARG();
|
||||||
value = PyStackRef_FromPyObjectNew(GETITEM(FRAME_CO_CONSTS, oparg));
|
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||||
|
value = PyStackRef_FromPyObjectNew(obj);
|
||||||
stack_pointer[0] = value;
|
stack_pointer[0] = value;
|
||||||
stack_pointer += 1;
|
stack_pointer += 1;
|
||||||
assert(WITHIN_STACK_BOUNDS());
|
assert(WITHIN_STACK_BOUNDS());
|
||||||
|
|
26
Python/generated_cases.c.h
generated
26
Python/generated_cases.c.h
generated
|
@ -5913,8 +5913,18 @@
|
||||||
next_instr += 1;
|
next_instr += 1;
|
||||||
INSTRUCTION_STATS(LOAD_CONST);
|
INSTRUCTION_STATS(LOAD_CONST);
|
||||||
PREDICTED(LOAD_CONST);
|
PREDICTED(LOAD_CONST);
|
||||||
|
_Py_CODEUNIT* const this_instr = next_instr - 1;
|
||||||
|
(void)this_instr;
|
||||||
_PyStackRef value;
|
_PyStackRef value;
|
||||||
value = PyStackRef_FromPyObjectNew(GETITEM(FRAME_CO_CONSTS, oparg));
|
/* We can't do this in the bytecode compiler as
|
||||||
|
* marshalling can intern strings and make them immortal. */
|
||||||
|
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||||
|
value = PyStackRef_FromPyObjectNew(obj);
|
||||||
|
#if ENABLE_SPECIALIZATION
|
||||||
|
if (this_instr->op.code == LOAD_CONST) {
|
||||||
|
this_instr->op.code = _Py_IsImmortal(obj) ? LOAD_CONST_IMMORTAL : LOAD_CONST_MORTAL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
stack_pointer[0] = value;
|
stack_pointer[0] = value;
|
||||||
stack_pointer += 1;
|
stack_pointer += 1;
|
||||||
assert(WITHIN_STACK_BOUNDS());
|
assert(WITHIN_STACK_BOUNDS());
|
||||||
|
@ -5936,6 +5946,20 @@
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TARGET(LOAD_CONST_MORTAL) {
|
||||||
|
frame->instr_ptr = next_instr;
|
||||||
|
next_instr += 1;
|
||||||
|
INSTRUCTION_STATS(LOAD_CONST_MORTAL);
|
||||||
|
static_assert(0 == 0, "incorrect cache size");
|
||||||
|
_PyStackRef value;
|
||||||
|
PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg);
|
||||||
|
value = PyStackRef_FromPyObjectNew(obj);
|
||||||
|
stack_pointer[0] = value;
|
||||||
|
stack_pointer += 1;
|
||||||
|
assert(WITHIN_STACK_BOUNDS());
|
||||||
|
DISPATCH();
|
||||||
|
}
|
||||||
|
|
||||||
TARGET(LOAD_DEREF) {
|
TARGET(LOAD_DEREF) {
|
||||||
frame->instr_ptr = next_instr;
|
frame->instr_ptr = next_instr;
|
||||||
next_instr += 1;
|
next_instr += 1;
|
||||||
|
|
2
Python/opcode_targets.h
generated
2
Python/opcode_targets.h
generated
|
@ -207,6 +207,7 @@ static void *opcode_targets[256] = {
|
||||||
&&TARGET_LOAD_ATTR_SLOT,
|
&&TARGET_LOAD_ATTR_SLOT,
|
||||||
&&TARGET_LOAD_ATTR_WITH_HINT,
|
&&TARGET_LOAD_ATTR_WITH_HINT,
|
||||||
&&TARGET_LOAD_CONST_IMMORTAL,
|
&&TARGET_LOAD_CONST_IMMORTAL,
|
||||||
|
&&TARGET_LOAD_CONST_MORTAL,
|
||||||
&&TARGET_LOAD_GLOBAL_BUILTIN,
|
&&TARGET_LOAD_GLOBAL_BUILTIN,
|
||||||
&&TARGET_LOAD_GLOBAL_MODULE,
|
&&TARGET_LOAD_GLOBAL_MODULE,
|
||||||
&&TARGET_LOAD_SUPER_ATTR_ATTR,
|
&&TARGET_LOAD_SUPER_ATTR_ATTR,
|
||||||
|
@ -233,7 +234,6 @@ static void *opcode_targets[256] = {
|
||||||
&&_unknown_opcode,
|
&&_unknown_opcode,
|
||||||
&&_unknown_opcode,
|
&&_unknown_opcode,
|
||||||
&&_unknown_opcode,
|
&&_unknown_opcode,
|
||||||
&&_unknown_opcode,
|
|
||||||
&&TARGET_INSTRUMENTED_END_FOR,
|
&&TARGET_INSTRUMENTED_END_FOR,
|
||||||
&&TARGET_INSTRUMENTED_POP_ITER,
|
&&TARGET_INSTRUMENTED_POP_ITER,
|
||||||
&&TARGET_INSTRUMENTED_END_SEND,
|
&&TARGET_INSTRUMENTED_END_SEND,
|
||||||
|
|
|
@ -479,6 +479,13 @@ dummy_func(void) {
|
||||||
value = sym_new_const(ctx, val);
|
value = sym_new_const(ctx, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
op(_LOAD_CONST_MORTAL, (-- value)) {
|
||||||
|
PyObject *val = PyTuple_GET_ITEM(co->co_consts, this_instr->oparg);
|
||||||
|
int opcode = _Py_IsImmortal(val) ? _LOAD_CONST_INLINE_BORROW : _LOAD_CONST_INLINE;
|
||||||
|
REPLACE_OP(this_instr, opcode, 0, (uintptr_t)val);
|
||||||
|
value = sym_new_const(ctx, val);
|
||||||
|
}
|
||||||
|
|
||||||
op(_LOAD_CONST_IMMORTAL, (-- value)) {
|
op(_LOAD_CONST_IMMORTAL, (-- value)) {
|
||||||
PyObject *val = PyTuple_GET_ITEM(co->co_consts, this_instr->oparg);
|
PyObject *val = PyTuple_GET_ITEM(co->co_consts, this_instr->oparg);
|
||||||
REPLACE_OP(this_instr, _LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
|
REPLACE_OP(this_instr, _LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)val);
|
||||||
|
|
4
Python/optimizer_cases.c.h
generated
4
Python/optimizer_cases.c.h
generated
|
@ -58,7 +58,9 @@
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case _LOAD_CONST: {
|
/* _LOAD_CONST is not a viable micro-op for tier 2 */
|
||||||
|
|
||||||
|
case _LOAD_CONST_MORTAL: {
|
||||||
_Py_UopsSymbol *value;
|
_Py_UopsSymbol *value;
|
||||||
PyObject *val = PyTuple_GET_ITEM(co->co_consts, this_instr->oparg);
|
PyObject *val = PyTuple_GET_ITEM(co->co_consts, this_instr->oparg);
|
||||||
int opcode = _Py_IsImmortal(val) ? _LOAD_CONST_INLINE_BORROW : _LOAD_CONST_INLINE;
|
int opcode = _Py_IsImmortal(val) ? _LOAD_CONST_INLINE_BORROW : _LOAD_CONST_INLINE;
|
||||||
|
|
|
@ -478,15 +478,6 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, PyObject *consts,
|
||||||
}
|
}
|
||||||
i += caches;
|
i += caches;
|
||||||
}
|
}
|
||||||
else if (opcode == LOAD_CONST) {
|
|
||||||
/* We can't do this in the bytecode compiler as
|
|
||||||
* marshalling can intern strings and make them immortal. */
|
|
||||||
|
|
||||||
PyObject *obj = PyTuple_GET_ITEM(consts, oparg);
|
|
||||||
if (_Py_IsImmortal(obj)) {
|
|
||||||
instructions[i].op.code = LOAD_CONST_IMMORTAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (opcode != EXTENDED_ARG) {
|
if (opcode != EXTENDED_ARG) {
|
||||||
oparg = 0;
|
oparg = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue