[mypyc] Keep generator local state in C locals when possible by JukkaL · Pull Request #21982 · python/mypy · GitHub
Skip to content

[mypyc] Keep generator local state in C locals when possible - #21982

Merged
JukkaL merged 18 commits into
masterfrom
mypyc-generator-opt-reg2
Sep 14, 2026
Merged

JukkaL merged 18 commits into
masterfrom
mypyc-generator-opt-reg2

Conversation

@JukkaL

@JukkaL JukkaL commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

Initially generate IR for generators and coroutines where locals and temporaries are stored in registers. Only spill registers that are live across a yield/await to the generator object. Previously most registers were stored in the generator object as attributes. The new spill is implemented as a new transform. We still use the old spill transform for op results that are not stored in registers.

This makes microbenchmarks where most work happens between awaits significantly faster, as C locals can be used for many operations instead of attributes. This also reduces the size of generator objects, as fewer struct fields are needed.

Remove old spill-related helpers from the IR builder as unnecessary.

I used coding agent assist.

@JukkaL
JukkaL merged commit 4fa6652 into master Sep 14, 2026
18 checks passed
@JukkaL
JukkaL deleted the mypyc-generator-opt-reg2 branch September 14, 2026 16:21
JukkaL added a commit that referenced this pull request Sep 15, 2026
Fix a regression introduced by #21982. CFG cleanup correctly removes an
unreachable exception-handler block, but generated resume cleanup paths
still reference its raw CPy_CatchError CallC result. This leaves
malformed IR and causes a KeyError during reference count insertion.

Keep the saved exception state in a register so it remains available
across the generated control flow. Add regression coverage for compiling
and running an async with statement with an empty body.

I used coding agent assist.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants