summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2023-05-11 14:08:13 (GMT)
committerGitHub <noreply@github.com>2023-05-11 14:08:13 (GMT)
commit77262458fe3fe9f3f0266bbf578675a906b1e353 (patch)
treeb066d678cfdba47c64e82ed49ecb73a1d1d8a701 /Include
parentddc0e70a326180d90a45dfd8abeded9c9f911217 (diff)
downloadcpython-77262458fe3fe9f3f0266bbf578675a906b1e353.zip
cpython-77262458fe3fe9f3f0266bbf578675a906b1e353.tar.gz
cpython-77262458fe3fe9f3f0266bbf578675a906b1e353.tar.bz2
gh-87729: improve hit rate of LOAD_SUPER_ATTR specialization (#104270)
Diffstat (limited to 'Include')
-rw-r--r--Include/internal/pycore_code.h7
-rw-r--r--Include/internal/pycore_opcode.h24
-rw-r--r--Include/internal/pycore_typeobject.h2
-rw-r--r--Include/opcode.h55
4 files changed, 42 insertions, 46 deletions
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index c1f017f..75a23f3 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -53,9 +53,6 @@ typedef struct {
typedef struct {
uint16_t counter;
- uint16_t class_version[2];
- uint16_t self_type_version[2];
- uint16_t method[4];
} _PySuperAttrCache;
#define INLINE_CACHE_ENTRIES_LOAD_SUPER_ATTR CACHE_ENTRIES(_PySuperAttrCache)
@@ -227,8 +224,8 @@ extern int _PyLineTable_PreviousAddressRange(PyCodeAddressRange *range);
/* Specialization functions */
-extern void _Py_Specialize_LoadSuperAttr(PyObject *global_super, PyObject *cls, PyObject *self,
- _Py_CODEUNIT *instr, PyObject *name, int load_method);
+extern void _Py_Specialize_LoadSuperAttr(PyObject *global_super, PyObject *cls,
+ _Py_CODEUNIT *instr, int load_method);
extern void _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr,
PyObject *name);
extern void _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr,
diff --git a/Include/internal/pycore_opcode.h b/Include/internal/pycore_opcode.h
index 52ee70a..e823e1b 100644
--- a/Include/internal/pycore_opcode.h
+++ b/Include/internal/pycore_opcode.h
@@ -42,7 +42,7 @@ const uint8_t _PyOpcode_Caches[256] = {
[LOAD_GLOBAL] = 4,
[BINARY_OP] = 1,
[SEND] = 1,
- [LOAD_SUPER_ATTR] = 9,
+ [LOAD_SUPER_ATTR] = 1,
[CALL] = 3,
};
@@ -182,6 +182,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
[LOAD_GLOBAL_MODULE] = LOAD_GLOBAL,
[LOAD_NAME] = LOAD_NAME,
[LOAD_SUPER_ATTR] = LOAD_SUPER_ATTR,
+ [LOAD_SUPER_ATTR_ATTR] = LOAD_SUPER_ATTR,
[LOAD_SUPER_ATTR_METHOD] = LOAD_SUPER_ATTR,
[MAKE_CELL] = MAKE_CELL,
[MAKE_FUNCTION] = MAKE_FUNCTION,
@@ -307,29 +308,29 @@ static const char *const _PyOpcode_OpName[267] = {
[FOR_ITER_TUPLE] = "FOR_ITER_TUPLE",
[FOR_ITER_RANGE] = "FOR_ITER_RANGE",
[FOR_ITER_GEN] = "FOR_ITER_GEN",
+ [LOAD_SUPER_ATTR_ATTR] = "LOAD_SUPER_ATTR_ATTR",
[LOAD_SUPER_ATTR_METHOD] = "LOAD_SUPER_ATTR_METHOD",
- [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS",
[GET_ITER] = "GET_ITER",
[GET_YIELD_FROM_ITER] = "GET_YIELD_FROM_ITER",
- [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
+ [LOAD_ATTR_CLASS] = "LOAD_ATTR_CLASS",
[LOAD_BUILD_CLASS] = "LOAD_BUILD_CLASS",
+ [LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = "LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN",
[LOAD_ATTR_INSTANCE_VALUE] = "LOAD_ATTR_INSTANCE_VALUE",
- [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
[LOAD_ASSERTION_ERROR] = "LOAD_ASSERTION_ERROR",
[RETURN_GENERATOR] = "RETURN_GENERATOR",
+ [LOAD_ATTR_MODULE] = "LOAD_ATTR_MODULE",
[LOAD_ATTR_PROPERTY] = "LOAD_ATTR_PROPERTY",
[LOAD_ATTR_SLOT] = "LOAD_ATTR_SLOT",
[LOAD_ATTR_WITH_HINT] = "LOAD_ATTR_WITH_HINT",
[LOAD_ATTR_METHOD_LAZY_DICT] = "LOAD_ATTR_METHOD_LAZY_DICT",
[LOAD_ATTR_METHOD_NO_DICT] = "LOAD_ATTR_METHOD_NO_DICT",
[LOAD_ATTR_METHOD_WITH_VALUES] = "LOAD_ATTR_METHOD_WITH_VALUES",
- [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
[RETURN_VALUE] = "RETURN_VALUE",
- [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
+ [LOAD_CONST__LOAD_FAST] = "LOAD_CONST__LOAD_FAST",
[SETUP_ANNOTATIONS] = "SETUP_ANNOTATIONS",
+ [LOAD_FAST__LOAD_CONST] = "LOAD_FAST__LOAD_CONST",
[LOAD_FAST__LOAD_FAST] = "LOAD_FAST__LOAD_FAST",
[LOAD_GLOBAL_BUILTIN] = "LOAD_GLOBAL_BUILTIN",
- [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
[POP_EXCEPT] = "POP_EXCEPT",
[STORE_NAME] = "STORE_NAME",
[DELETE_NAME] = "DELETE_NAME",
@@ -352,9 +353,9 @@ static const char *const _PyOpcode_OpName[267] = {
[IMPORT_NAME] = "IMPORT_NAME",
[IMPORT_FROM] = "IMPORT_FROM",
[JUMP_FORWARD] = "JUMP_FORWARD",
+ [LOAD_GLOBAL_MODULE] = "LOAD_GLOBAL_MODULE",
[STORE_ATTR_INSTANCE_VALUE] = "STORE_ATTR_INSTANCE_VALUE",
[STORE_ATTR_SLOT] = "STORE_ATTR_SLOT",
- [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
[POP_JUMP_IF_FALSE] = "POP_JUMP_IF_FALSE",
[POP_JUMP_IF_TRUE] = "POP_JUMP_IF_TRUE",
[LOAD_GLOBAL] = "LOAD_GLOBAL",
@@ -394,22 +395,22 @@ static const char *const _PyOpcode_OpName[267] = {
[YIELD_VALUE] = "YIELD_VALUE",
[RESUME] = "RESUME",
[MATCH_CLASS] = "MATCH_CLASS",
+ [STORE_ATTR_WITH_HINT] = "STORE_ATTR_WITH_HINT",
[STORE_FAST__LOAD_FAST] = "STORE_FAST__LOAD_FAST",
- [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
[FORMAT_VALUE] = "FORMAT_VALUE",
[BUILD_CONST_KEY_MAP] = "BUILD_CONST_KEY_MAP",
[BUILD_STRING] = "BUILD_STRING",
+ [STORE_FAST__STORE_FAST] = "STORE_FAST__STORE_FAST",
[STORE_SUBSCR_DICT] = "STORE_SUBSCR_DICT",
[STORE_SUBSCR_LIST_INT] = "STORE_SUBSCR_LIST_INT",
[UNPACK_SEQUENCE_LIST] = "UNPACK_SEQUENCE_LIST",
- [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
[LIST_EXTEND] = "LIST_EXTEND",
[SET_UPDATE] = "SET_UPDATE",
[DICT_MERGE] = "DICT_MERGE",
[DICT_UPDATE] = "DICT_UPDATE",
+ [UNPACK_SEQUENCE_TUPLE] = "UNPACK_SEQUENCE_TUPLE",
[UNPACK_SEQUENCE_TWO_TUPLE] = "UNPACK_SEQUENCE_TWO_TUPLE",
[SEND_GEN] = "SEND_GEN",
- [168] = "<168>",
[169] = "<169>",
[170] = "<170>",
[CALL] = "CALL",
@@ -512,7 +513,6 @@ static const char *const _PyOpcode_OpName[267] = {
#endif
#define EXTRA_CASES \
- case 168: \
case 169: \
case 170: \
case 175: \
diff --git a/Include/internal/pycore_typeobject.h b/Include/internal/pycore_typeobject.h
index f42f8f6..c7d0000 100644
--- a/Include/internal/pycore_typeobject.h
+++ b/Include/internal/pycore_typeobject.h
@@ -142,8 +142,6 @@ PyAPI_DATA(PyTypeObject) _PyBufferWrapper_Type;
PyObject *
_PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj, PyObject *name, int *meth_found);
-PyObject *
-_PySuper_LookupDescr(PyTypeObject *su_type, PyObject *su_obj, PyObject *name);
#ifdef __cplusplus
}
diff --git a/Include/opcode.h b/Include/opcode.h
index f6f4af8..c3b6e5d 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -185,33 +185,34 @@ extern "C" {
#define FOR_ITER_TUPLE 63
#define FOR_ITER_RANGE 64
#define FOR_ITER_GEN 65
-#define LOAD_SUPER_ATTR_METHOD 66
-#define LOAD_ATTR_CLASS 67
-#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 70
-#define LOAD_ATTR_INSTANCE_VALUE 72
-#define LOAD_ATTR_MODULE 73
-#define LOAD_ATTR_PROPERTY 76
-#define LOAD_ATTR_SLOT 77
-#define LOAD_ATTR_WITH_HINT 78
-#define LOAD_ATTR_METHOD_LAZY_DICT 79
-#define LOAD_ATTR_METHOD_NO_DICT 80
-#define LOAD_ATTR_METHOD_WITH_VALUES 81
-#define LOAD_CONST__LOAD_FAST 82
-#define LOAD_FAST__LOAD_CONST 84
-#define LOAD_FAST__LOAD_FAST 86
-#define LOAD_GLOBAL_BUILTIN 87
-#define LOAD_GLOBAL_MODULE 88
-#define STORE_ATTR_INSTANCE_VALUE 111
-#define STORE_ATTR_SLOT 112
-#define STORE_ATTR_WITH_HINT 113
-#define STORE_FAST__LOAD_FAST 153
-#define STORE_FAST__STORE_FAST 154
-#define STORE_SUBSCR_DICT 158
-#define STORE_SUBSCR_LIST_INT 159
-#define UNPACK_SEQUENCE_LIST 160
-#define UNPACK_SEQUENCE_TUPLE 161
-#define UNPACK_SEQUENCE_TWO_TUPLE 166
-#define SEND_GEN 167
+#define LOAD_SUPER_ATTR_ATTR 66
+#define LOAD_SUPER_ATTR_METHOD 67
+#define LOAD_ATTR_CLASS 70
+#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 72
+#define LOAD_ATTR_INSTANCE_VALUE 73
+#define LOAD_ATTR_MODULE 76
+#define LOAD_ATTR_PROPERTY 77
+#define LOAD_ATTR_SLOT 78
+#define LOAD_ATTR_WITH_HINT 79
+#define LOAD_ATTR_METHOD_LAZY_DICT 80
+#define LOAD_ATTR_METHOD_NO_DICT 81
+#define LOAD_ATTR_METHOD_WITH_VALUES 82
+#define LOAD_CONST__LOAD_FAST 84
+#define LOAD_FAST__LOAD_CONST 86
+#define LOAD_FAST__LOAD_FAST 87
+#define LOAD_GLOBAL_BUILTIN 88
+#define LOAD_GLOBAL_MODULE 111
+#define STORE_ATTR_INSTANCE_VALUE 112
+#define STORE_ATTR_SLOT 113
+#define STORE_ATTR_WITH_HINT 153
+#define STORE_FAST__LOAD_FAST 154
+#define STORE_FAST__STORE_FAST 158
+#define STORE_SUBSCR_DICT 159
+#define STORE_SUBSCR_LIST_INT 160
+#define UNPACK_SEQUENCE_LIST 161
+#define UNPACK_SEQUENCE_TUPLE 166
+#define UNPACK_SEQUENCE_TWO_TUPLE 167
+#define SEND_GEN 168
#define HAS_ARG(op) ((((op) >= HAVE_ARGUMENT) && (!IS_PSEUDO_OPCODE(op)))\
|| ((op) == JUMP) \