-
-
Notifications
You must be signed in to change notification settings - Fork 33.2k
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 the types 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 in bold are probably a bit harder, tasks in italics 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 teach remove_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