https://github.com/python/cpython/commit/85bc489b649fe261f9625163c684a69a470b3dc1 commit: 85bc489b649fe261f9625163c684a69a470b3dc1 branch: main author: Tomas R. <tomas.ro...@gmail.com> committer: brandtbucher <brandtbuc...@gmail.com> date: 2025-04-05T15:56:01-07:00 summary:
GH-131798: Narrow the result of _CONTAINS_OP_SET to bool in the JIT (GH-132057) files: A Misc/NEWS.d/next/Core_and_Builtins/2025-04-03-20-11-02.gh-issue-131798.yhdUKW.rst M Lib/test/test_capi/test_opt.py M Python/optimizer_bytecodes.c M Python/optimizer_cases.c.h diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 9ac5d1ecf7eb1e..0e13799ad47381 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -1603,6 +1603,32 @@ def testfunc(n): self.assertNotIn("_COMPARE_OP_INT", uops) self.assertIn("_POP_TWO_LOAD_CONST_INLINE_BORROW", uops) + def test_to_bool_bool_contains_op_set(self): + """ + Test that _TO_BOOL_BOOL is removed from code like: + + res = foo in some_set + if res: + .... + + """ + def testfunc(n): + x = 0 + s = {1, 2, 3} + for _ in range(n): + a = 2 + in_set = a in s + if in_set: + x += 1 + return x + + res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD) + self.assertEqual(res, TIER2_THRESHOLD) + self.assertIsNotNone(ex) + uops = get_opnames(ex) + self.assertIn("_CONTAINS_OP_SET", uops) + self.assertNotIn("_TO_BOOL_BOOL", uops) + def test_remove_guard_for_known_type_str(self): def f(n): for i in range(n): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-03-20-11-02.gh-issue-131798.yhdUKW.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-03-20-11-02.gh-issue-131798.yhdUKW.rst new file mode 100644 index 00000000000000..8a448ee5e23b9b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-03-20-11-02.gh-issue-131798.yhdUKW.rst @@ -0,0 +1,2 @@ +Allow the JIT to remove an extra ``_TO_BOOL_BOOL`` instruction after +``_CONTAINS_OP_SET`` by setting the return type to bool. diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index da36704d91e4b3..d7b3564db1b90a 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -477,6 +477,10 @@ dummy_func(void) { res = sym_new_type(ctx, &PyBool_Type); } + op(_CONTAINS_OP_SET, (left, right -- res)) { + res = sym_new_type(ctx, &PyBool_Type); + } + op(_LOAD_CONST, (-- value)) { PyObject *val = PyTuple_GET_ITEM(co->co_consts, this_instr->oparg); int opcode = _Py_IsImmortal(val) ? _LOAD_CONST_INLINE_BORROW : _LOAD_CONST_INLINE; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index f5cd1697fbacda..870c32d74ac913 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1283,9 +1283,9 @@ } case _CONTAINS_OP_SET: { - JitOptSymbol *b; - b = sym_new_not_null(ctx); - stack_pointer[-2] = b; + JitOptSymbol *res; + res = sym_new_type(ctx, &PyBool_Type); + stack_pointer[-2] = res; stack_pointer += -1; assert(WITHIN_STACK_BOUNDS()); break; _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com