Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
Description
Please don't work on this. I'm planning on sprinting on this with new contributors at an event this weekend.
Currently, the JIT optimizer uses the_COMPARE_OP family,_CONTAINS_OP,_IS_OP, and the_TO_BOOL family to narrow thetypes of the input values and the type of the output value.
However, by "peeking ahead" and seeing how a value will be used, we can narrow these types to constants as well. As a simple example, consider_TO_BOOL_INT + _GUARD_IS_FALSE_CHECK on an unknown value. After the_TO_BOOL_INT, it can be narrowed to a known class,int (we do this today). However, after the_GUARD_IS_FALSE_CHECK, we can actually narrow it to a constant value,0.
An example implementation of this idea for_TO_BOOL_BOOL is here:main...brandtbucher:cpython:hack-night-to-bool-bool
I've divided this work into 3 "waves" of increasing complexity. Tasks inbold are probably a bit harder, tasks initalics are probably a bit easier.
Narrow types to constants in branches involving truthiness:
_TO_BOOL + _GUARD_IS_*_POPgh-130659_TO_BOOL_BOOL + _GUARD_IS_*_POPgh-130659_TO_BOOL_INT + _GUARD_IS_*_POPgh-130772_TO_BOOL_LIST + _GUARD_IS_*_POP_TO_BOOL_STR + _GUARD_IS_*_POPgh-130476
Narrow types to constants in branches involving comparisons with a constant:
_COMPARE_OP + _GUARD_IS_*_POP(==,!=)_COMPARE_OP_FLOAT + _GUARD_IS_*_POP(==,!=)_COMPARE_OP_INT + _GUARD_IS_*_POP(==,!=)_COMPARE_OP_STR + _GUARD_IS_*_POP(==,!=)_CONTAINS_OP + _GUARD_IS_*_POP(in,not in)_IS_OP + _GUARD_IS_*_POP(is,is not)
Evaluate comparisons involving two constants:
This is related, but a bit more involved, since we need a way to pop two values from the stack and push a constant (_POP_TWO_LOAD_CONST_INLINE_BORROW). We should also teachremove_unneeded_uops about this new instruction.
_COMPARE_OP(==,!=,<,>,<=,>=)_COMPARE_OP_FLOAT(==,!=,<,>,<=,>=)gh-137062_COMPARE_OP_INT(==,!=,<,>,<=,>=)gh-131489_COMPARE_OP_STR(==,!=,<,>,<=,>=)gh-137062_CONTAINS_OP(in,not in)_IS_OP(is,is not)
Linked PRs
- GH-130415: Narrow
strto""based on boolean tests #130476 - GH-130415: Optimize JIT path for _TO_BOOL_INT branching #130477
- GH-130415: Use boolean guards to narrow types to values in the JIT #130659
- GH-130415: Narrow
intto0based on boolean tests #130772 - GH-130415: Optimize constant comparison in JIT builds #131489
- GH-130415: Remove redundant
sym_matches_typecalls in the JIT optimizer #131778 - GH-130415: Improve the JIT's unneeded uop removal pass #132333
- gh-130415: Eliminate guards for constant CALL_BUILTIN_O/FAST #132708
- GH-130415: Use
POP_TWO_LOAD_CONST_INLINE_BORROW#134241 - GH-132732: Use pure op machinery to optimize
COMPARE_OP_INT/FLOAT/STR#137062