You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
We should have a JIT constant pool and a JIT directive in the optimizer_bytecodes.c to promote certain values to constants. This would unlock significantly more future optimizations.
Introduce a new optimizer macro: PROMOTE_TO_CONST_POOL and associated function promote_to_const_pool(ctx, obj) in optimizer_symbols.c. This macro will store any value it receives as a constant in the constant pool. This allows us to promote contants we see to the constant pool. This takes inspiration from RPython's hint(obj, promote=True)
What optimizations does this unlock?
More constant propagation: we can now constant propagate not just immortal stuff but non-immortal things as well.
Refcount removal. Anything in the the pool can use the cheaper _LOAD_CONST_INLINE_BORROW . Which will automatically benefit this work Eliminate redundant refcounting in the JIT #134584 and vice versa. Ie, we automatically make it cheaper to load and store these values!
On GIL/FT, we can promote method objects to the pool as well, which will allow us to perform more optimizations on them, such as LOAD_ATTR_METHOD folding.
We should also perhaps explore promoting globals to pool constants. Though that's a little risky, since we don't want to hold large objects around longer than needed.
The first PR should implement the first two steps and optimization 1. Optimization 2 should be a separate PR.
Proposal:
We should have a JIT constant pool and a JIT directive in the
optimizer_bytecodes.cto promote certain values to constants. This would unlock significantly more future optimizations.Steps needed:
PyListObjectliving in the vmdata field here https://github.com/python/cpython/blob/main/Include/internal/pycore_optimizer.h#L43 .PROMOTE_TO_CONST_POOLand associated functionpromote_to_const_pool(ctx, obj)inoptimizer_symbols.c. This macro will store any value it receives as a constant in the constant pool. This allows us to promote contants we see to the constant pool. This takes inspiration from RPython'shint(obj, promote=True)What optimizations does this unlock?
_LOAD_CONST_INLINE_BORROW. Which will automatically benefit this work Eliminate redundant refcounting in the JIT #134584 and vice versa. Ie, we automatically make it cheaper to load and store these values!We should also perhaps explore promoting globals to pool constants. Though that's a little risky, since we don't want to hold large objects around longer than needed.
The first PR should implement the first two steps and optimization 1. Optimization 2 should be a separate PR.
Linked PRs