gh-143732: Add specialization for TO_BOOL#148113
gh-143732: Add specialization for TO_BOOL#148113eendebakpt wants to merge 9 commits intopython:mainfrom
Conversation
- Add TO_BOOL_GENERIC: a catch-all specialization for types not covered by existing TO_BOOL variants (dict, tuple, float, set, bytes, frozenset, etc. and heap types with __bool__/__len__). Records type info for the JIT. - Add _TO_BOOL_DICT: a tier2-only uop that checks dict.ma_used directly instead of calling PyObject_IsTrue(). The JIT optimizer replaces _TO_BOOL with _TO_BOOL_DICT when the type is known to be dict or frozendict. - Fix _GUARD_TYPE_VERSION optimizer handler to resolve types from recorded type info even when the type version cache has a collision. This enables the optimizer to eliminate redundant type guards (e.g. _GUARD_NOS_LIST) in more cases. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
| self.assert_specialized(to_bool_str, "TO_BOOL_STR") | ||
| self.assert_no_opcode(to_bool_str, "TO_BOOL") | ||
|
|
||
| def to_bool_generic_dict(): |
There was a problem hiding this comment.
There is quite some redundancy in the added tests (and also the existing tests). We could refactor this, but it is a bit tricky as re-using the same method (with different arguments) makes it more difficult to reason about the specialization that takes place.
If we want this, I suggest we open a separate PR.
| // already added one earlier. | ||
| if (sym_set_type_version(owner, type_version)) { | ||
| // sym_set_type_version can resolve the type from recorded type info | ||
| // even when the version cache has a collision |
There was a problem hiding this comment.
This change has as side effect the list.append needs less checks.
|
I don't think we want What you can do is add the You might also want to add |
We add
TO_BOOL_GENERICas suggested in #143732 (comment). This adds type information for several builtin classes. We also add_TO_BOOL_DICT(tier 2). In the jit conversion of a dict to bool is about 30% faster.