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`.
This commit is contained in:
Guido van Rossum 2023-07-31 08:55:33 -07:00 committed by GitHub
parent a22ff8e11c
commit 5eb80a61f5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 47 deletions

View file

@ -1348,9 +1348,6 @@ dummy_func(
null = NULL;
}
op(_SKIP_CACHE, (unused/1 -- )) {
}
op(_GUARD_GLOBALS_VERSION, (version/1 --)) {
PyDictObject *dict = (PyDictObject *)GLOBALS();
DEOPT_IF(!PyDict_CheckExact(dict), LOAD_GLOBAL);
@ -1386,13 +1383,13 @@ dummy_func(
}
macro(LOAD_GLOBAL_MODULE) =
_SKIP_CACHE + // Skip over the counter
unused/1 + // Skip over the counter
_GUARD_GLOBALS_VERSION +
_SKIP_CACHE + // Skip over the builtins version
unused/1 + // Skip over the builtins version
_LOAD_GLOBAL_MODULE;
macro(LOAD_GLOBAL_BUILTIN) =
_SKIP_CACHE + // Skip over the counter
unused/1 + // Skip over the counter
_GUARD_GLOBALS_VERSION +
_GUARD_BUILTINS_VERSION +
_LOAD_GLOBAL_BUILTINS;
@ -1824,7 +1821,7 @@ dummy_func(
DEOPT_IF(!_PyDictOrValues_IsValues(dorv), LOAD_ATTR);
}
op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
op(_LOAD_ATTR_INSTANCE_VALUE, (index/1, owner -- res2 if (oparg & 1), res)) {
PyDictOrValues dorv = *_PyObject_DictOrValuesPointer(owner);
res = _PyDictOrValues_GetValues(dorv)->values[index];
DEOPT_IF(res == NULL, LOAD_ATTR);
@ -1835,10 +1832,11 @@ dummy_func(
}
macro(LOAD_ATTR_INSTANCE_VALUE) =
_SKIP_CACHE + // Skip over the counter
unused/1 + // Skip over the counter
_GUARD_TYPE_VERSION +
_CHECK_MANAGED_OBJECT_HAS_VALUES +
_LOAD_ATTR_INSTANCE_VALUE;
_LOAD_ATTR_INSTANCE_VALUE +
unused/5; // Skip over rest of cache
inst(LOAD_ATTR_MODULE, (unused/1, type_version/2, index/1, unused/5, owner -- res2 if (oparg & 1), res)) {
DEOPT_IF(!PyModule_CheckExact(owner), LOAD_ATTR);

View file

@ -1009,10 +1009,6 @@
break;
}
case _SKIP_CACHE: {
break;
}
case _GUARD_GLOBALS_VERSION: {
uint16_t version = (uint16_t)operand;
PyDictObject *dict = (PyDictObject *)GLOBALS();

View file

@ -1663,8 +1663,6 @@
TARGET(LOAD_GLOBAL_MODULE) {
PyObject *_tmp_1;
PyObject *_tmp_2;
{
}
{
uint16_t version = read_u16(&next_instr[1].cache);
PyDictObject *dict = (PyDictObject *)GLOBALS();
@ -1672,8 +1670,6 @@
DEOPT_IF(dict->ma_keys->dk_version != version, LOAD_GLOBAL);
assert(DK_IS_UNICODE(dict->ma_keys));
}
{
}
{
PyObject *null = NULL;
PyObject *res;
@ -1699,8 +1695,6 @@
TARGET(LOAD_GLOBAL_BUILTIN) {
PyObject *_tmp_1;
PyObject *_tmp_2;
{
}
{
uint16_t version = read_u16(&next_instr[1].cache);
PyDictObject *dict = (PyDictObject *)GLOBALS();
@ -2243,8 +2237,6 @@
TARGET(LOAD_ATTR_INSTANCE_VALUE) {
PyObject *_tmp_1;
PyObject *_tmp_2 = stack_pointer[-1];
{
}
{
PyObject *owner = _tmp_2;
uint32_t type_version = read_u32(&next_instr[1].cache);