Skip to content

Commit 5eb80a6

Browse files
authored
GH-104909: Move unused cache entries from uops to macros (#107444)
There's no need to use a dummy uop to skip unused cache entries. The macro syntax lets you write `unused/1` instead. Similarly, move `unused/5` from op `_LOAD_ATTR_INSTANCE_VALUE` to macro `LOAD_ATTR_INSTANCE_VALUE`.
1 parent a22ff8e commit 5eb80a6

File tree

4 files changed

+31
-47
lines changed

4 files changed

+31
-47
lines changed

Include/internal/pycore_opcode_metadata.h

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,26 @@
3535
#define _BINARY_OP_ADD_UNICODE 311
3636
#define _LOAD_LOCALS 312
3737
#define _LOAD_FROM_DICT_OR_GLOBALS 313
38-
#define _SKIP_CACHE 314
39-
#define _GUARD_GLOBALS_VERSION 315
40-
#define _GUARD_BUILTINS_VERSION 316
41-
#define _LOAD_GLOBAL_MODULE 317
42-
#define _LOAD_GLOBAL_BUILTINS 318
43-
#define _GUARD_TYPE_VERSION 319
44-
#define _CHECK_MANAGED_OBJECT_HAS_VALUES 320
45-
#define _LOAD_ATTR_INSTANCE_VALUE 321
46-
#define IS_NONE 322
47-
#define _ITER_CHECK_LIST 323
48-
#define _IS_ITER_EXHAUSTED_LIST 324
49-
#define _ITER_NEXT_LIST 325
50-
#define _ITER_CHECK_TUPLE 326
51-
#define _IS_ITER_EXHAUSTED_TUPLE 327
52-
#define _ITER_NEXT_TUPLE 328
53-
#define _ITER_CHECK_RANGE 329
54-
#define _IS_ITER_EXHAUSTED_RANGE 330
55-
#define _ITER_NEXT_RANGE 331
56-
#define _POP_JUMP_IF_FALSE 332
57-
#define _POP_JUMP_IF_TRUE 333
58-
#define JUMP_TO_TOP 334
38+
#define _GUARD_GLOBALS_VERSION 314
39+
#define _GUARD_BUILTINS_VERSION 315
40+
#define _LOAD_GLOBAL_MODULE 316
41+
#define _LOAD_GLOBAL_BUILTINS 317
42+
#define _GUARD_TYPE_VERSION 318
43+
#define _CHECK_MANAGED_OBJECT_HAS_VALUES 319
44+
#define _LOAD_ATTR_INSTANCE_VALUE 320
45+
#define IS_NONE 321
46+
#define _ITER_CHECK_LIST 322
47+
#define _IS_ITER_EXHAUSTED_LIST 323
48+
#define _ITER_NEXT_LIST 324
49+
#define _ITER_CHECK_TUPLE 325
50+
#define _IS_ITER_EXHAUSTED_TUPLE 326
51+
#define _ITER_NEXT_TUPLE 327
52+
#define _ITER_CHECK_RANGE 328
53+
#define _IS_ITER_EXHAUSTED_RANGE 329
54+
#define _ITER_NEXT_RANGE 330
55+
#define _POP_JUMP_IF_FALSE 331
56+
#define _POP_JUMP_IF_TRUE 332
57+
#define JUMP_TO_TOP 333
5958

6059
#ifndef NEED_OPCODE_METADATA
6160
extern int _PyOpcode_num_popped(int opcode, int oparg, bool jump);
@@ -945,7 +944,7 @@ _PyOpcode_num_pushed(int opcode, int oparg, bool jump) {
945944
}
946945
#endif
947946

948-
enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC00, INSTR_FMT_IBC000, INSTR_FMT_IBC00000, INSTR_FMT_IBC00000000, INSTR_FMT_IX, INSTR_FMT_IXC, INSTR_FMT_IXC0, INSTR_FMT_IXC00, INSTR_FMT_IXC000 };
947+
enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC00, INSTR_FMT_IBC000, INSTR_FMT_IBC00000000, INSTR_FMT_IX, INSTR_FMT_IXC, INSTR_FMT_IXC0, INSTR_FMT_IXC00, INSTR_FMT_IXC000 };
949948

950949
#define IS_VALID_OPCODE(OP) \
951950
(((OP) >= 0) && ((OP) < OPCODE_METADATA_SIZE) && \
@@ -1279,8 +1278,8 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN
12791278
[LOAD_NAME] = { .nuops = 2, .uops = { { _LOAD_LOCALS, 0, 0 }, { _LOAD_FROM_DICT_OR_GLOBALS, 0, 0 } } },
12801279
[LOAD_FROM_DICT_OR_GLOBALS] = { .nuops = 1, .uops = { { _LOAD_FROM_DICT_OR_GLOBALS, 0, 0 } } },
12811280
[LOAD_GLOBAL] = { .nuops = 1, .uops = { { LOAD_GLOBAL, 0, 0 } } },
1282-
[LOAD_GLOBAL_MODULE] = { .nuops = 4, .uops = { { _SKIP_CACHE, 0, 0 }, { _GUARD_GLOBALS_VERSION, 1, 1 }, { _SKIP_CACHE, 0, 0 }, { _LOAD_GLOBAL_MODULE, 1, 3 } } },
1283-
[LOAD_GLOBAL_BUILTIN] = { .nuops = 4, .uops = { { _SKIP_CACHE, 0, 0 }, { _GUARD_GLOBALS_VERSION, 1, 1 }, { _GUARD_BUILTINS_VERSION, 1, 2 }, { _LOAD_GLOBAL_BUILTINS, 1, 3 } } },
1281+
[LOAD_GLOBAL_MODULE] = { .nuops = 2, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _LOAD_GLOBAL_MODULE, 1, 3 } } },
1282+
[LOAD_GLOBAL_BUILTIN] = { .nuops = 3, .uops = { { _GUARD_GLOBALS_VERSION, 1, 1 }, { _GUARD_BUILTINS_VERSION, 1, 2 }, { _LOAD_GLOBAL_BUILTINS, 1, 3 } } },
12841283
[DELETE_FAST] = { .nuops = 1, .uops = { { DELETE_FAST, 0, 0 } } },
12851284
[DELETE_DEREF] = { .nuops = 1, .uops = { { DELETE_DEREF, 0, 0 } } },
12861285
[LOAD_FROM_DICT_OR_DEREF] = { .nuops = 1, .uops = { { LOAD_FROM_DICT_OR_DEREF, 0, 0 } } },
@@ -1302,7 +1301,7 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN
13021301
[LOAD_SUPER_ATTR_ATTR] = { .nuops = 1, .uops = { { LOAD_SUPER_ATTR_ATTR, 0, 0 } } },
13031302
[LOAD_SUPER_ATTR_METHOD] = { .nuops = 1, .uops = { { LOAD_SUPER_ATTR_METHOD, 0, 0 } } },
13041303
[LOAD_ATTR] = { .nuops = 1, .uops = { { LOAD_ATTR, 0, 0 } } },
1305-
[LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 4, .uops = { { _SKIP_CACHE, 0, 0 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 } } },
1304+
[LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 } } },
13061305
[COMPARE_OP] = { .nuops = 1, .uops = { { COMPARE_OP, 0, 0 } } },
13071306
[COMPARE_OP_FLOAT] = { .nuops = 1, .uops = { { COMPARE_OP_FLOAT, 0, 0 } } },
13081307
[COMPARE_OP_INT] = { .nuops = 1, .uops = { { COMPARE_OP_INT, 0, 0 } } },
@@ -1356,7 +1355,6 @@ const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE] = {
13561355
[_BINARY_OP_ADD_UNICODE] = "_BINARY_OP_ADD_UNICODE",
13571356
[_LOAD_LOCALS] = "_LOAD_LOCALS",
13581357
[_LOAD_FROM_DICT_OR_GLOBALS] = "_LOAD_FROM_DICT_OR_GLOBALS",
1359-
[_SKIP_CACHE] = "_SKIP_CACHE",
13601358
[_GUARD_GLOBALS_VERSION] = "_GUARD_GLOBALS_VERSION",
13611359
[_GUARD_BUILTINS_VERSION] = "_GUARD_BUILTINS_VERSION",
13621360
[_LOAD_GLOBAL_MODULE] = "_LOAD_GLOBAL_MODULE",

Python/bytecodes.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,9 +1348,6 @@ dummy_func(
13481348
null = NULL;
13491349
}
13501350

1351-
op(_SKIP_CACHE, (unused/1 -- )) {
1352-
}
1353-
13541351
op(_GUARD_GLOBALS_VERSION, (version/1 --)) {
13551352
PyDictObject *dict = (PyDictObject *)GLOBALS();
13561353
DEOPT_IF(!PyDict_CheckExact(dict), LOAD_GLOBAL);
@@ -1386,13 +1383,13 @@ dummy_func(
13861383
}
13871384

13881385
macro(LOAD_GLOBAL_MODULE) =
1389-
_SKIP_CACHE + // Skip over the counter
1386+
unused/1 + // Skip over the counter
13901387
_GUARD_GLOBALS_VERSION +
1391-
_SKIP_CACHE + // Skip over the builtins version
1388+
unused/1 + // Skip over the builtins version
13921389
_LOAD_GLOBAL_MODULE;
13931390

13941391
macro(LOAD_GLOBAL_BUILTIN) =
1395-
_SKIP_CACHE + // Skip over the counter
1392+
unused/1 + // Skip over the counter
13961393
_GUARD_GLOBALS_VERSION +
13971394
_GUARD_BUILTINS_VERSION +
13981395
_LOAD_GLOBAL_BUILTINS;
@@ -1824,7 +1821,7 @@ dummy_func(
18241821
DEOPT_IF(!_PyDictOrValues_IsValues(dorv), LOAD_ATTR);
18251822
}
18261823

1827-
op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
1824+
op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, owner -- res2 if (oparg & 1), res)) {
18281825
PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(owner);
18291826
res = _PyDictOrValues_GetValues(dorv)->values[index];
18301827
DEOPT_IF(res == NULL, LOAD_ATTR);
@@ -1835,10 +1832,11 @@ dummy_func(
18351832
}
18361833

18371834
macro(LOAD_ATTR_INSTANCE_VALUE) =
1838-
_SKIP_CACHE + // Skip over the counter
1835+
unused/1 + // Skip over the counter
18391836
_GUARD_TYPE_VERSION +
18401837
_CHECK_MANAGED_OBJECT_HAS_VALUES +
1841-
_LOAD_ATTR_INSTANCE_VALUE;
1838+
_LOAD_ATTR_INSTANCE_VALUE +
1839+
unused/5; // Skip over rest of cache
18421840

18431841
inst(LOAD_ATTR_MODULE, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
18441842
DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR);

Python/executor_cases.c.h

Lines changed: 0 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 0 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)