[mypyc] Borrow references during chained attribute access (#12805)
If we have multiple native attribute access operations in succession, we
can borrow the temporaries. This avoids an incref and decref. For
example, when evaluating x.y.z, we don't need to incref the result
of x.y.
We need to make sure that the objects from which we borrow
values are not freed too early by adding keep_alive ops.
This is part of a wider reference counting optimization workstream.
All the improvements together produced around 5% performance
improvement in the richards benchmark.
In carefully constructed microbenchmarks 50+% improvements are
possible.