New GitHub issue #119258 from saulshanabrook:<br>

<hr>

<pre>
# Feature or enhancement

### Proposal:

_Note: I made this issue at the PyCon sprints under the guidance of @Fidget-Spinner and in collaboration with @dpdani_

The tier 2 optimizer should eliminate type version guards if it is safe to do.

It is safe if it has previously checked the type version guard at runtime and we haven't had an escape opt since then.

## Example

For example, if we have this code:

```python
class A:
 attr = 1

def thing(a):
    return a.attr + a.attr

for _ in range(1000):
    thing(A())
```

then when `thing` is executed it should only run the type guard once.

If we disassemble this code then we see it emits the `LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES` bytecode:

```python
>>> import dis
>>> dis.dis(thing, adaptive=True)
  8           RESUME_CHECK 0

  9           LOAD_FAST                0 (a)
 LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 0 (attr)
              LOAD_FAST 0 (a)
              LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 0 (attr)
 BINARY_OP_ADD_INT        0 (+)
 RETURN_VALUE
```

If we look at the definition of `LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES`, we see it uses `_GUARD_TYPE_VERSION` (in `bytecodes.c`:

```c
 macro(LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES) =
            unused/1 +
 _GUARD_TYPE_VERSION +
            _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT +
            _GUARD_KEYS_VERSION +
 _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES;
```

So if this is executed one after the other, without any unknown function calls in the middle, it should remove the second `_GUARD_TYPE_VERSION` call.



### Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

### Links to previous discussion of this feature:

_No response_
</pre>

<hr>

<a href="https://github.com/python/cpython/issues/119258">View on GitHub</a>
<p>Labels: type-feature</p>
<p>Assignee: </p>