Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32k
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_*_POP
gh-130659_TO_BOOL_BOOL + _GUARD_IS_*_POP
gh-130659_TO_BOOL_INT + _GUARD_IS_*_POP
gh-130772_TO_BOOL_LIST + _GUARD_IS_*_POP
_TO_BOOL_STR + _GUARD_IS_*_POP
gh-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
(==
,!=
,<
,>
,<=
,>=
)_COMPARE_OP_INT
(==
,!=
,<
,>
,<=
,>=
)gh-131489_COMPARE_OP_STR
(==
,!=
,<
,>
,<=
,>=
)_CONTAINS_OP
(in
,not in
)_IS_OP
(is
,is not
)
Linked PRs
- GH-130415: Narrow
str
to""
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
int
to0
based on boolean tests #130772 - GH-130415: Optimize constant comparison in JIT builds #131489
- GH-130415: Remove redundant
sym_matches_type
calls 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