]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-144681: Fix JIT trace builder assertion failure when conditional branch jump targe...
authorHai Zhu <haiizhu@outlook.com>
Tue, 10 Mar 2026 04:12:48 +0000 (12:12 +0800)
committerGitHub <noreply@github.com>
Tue, 10 Mar 2026 04:12:48 +0000 (12:12 +0800)
Lib/test/test_capi/test_opt.py
Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst [new file with mode: 0644]
Python/optimizer.c

index 90e2ed20d1f6b3a34b6bffec5fad111b052f731e..8fa4f02afb5b4571479e598ad50644f07207f1c2 100644 (file)
@@ -461,6 +461,19 @@ class TestUops(unittest.TestCase):
         uops = get_opnames(ex)
         self.assertIn(self.guard_is_false, uops)
 
+    def test_branch_coincident_targets(self):
+        # test for gh-144681: https://github.com/python/cpython/issues/144681
+        def testfunc(n):
+            for _ in range(n):
+                r = [x for x in range(10) if [].append(x) or True]
+            return r
+
+        res = testfunc(TIER2_THRESHOLD)
+        ex = get_first_executor(testfunc)
+
+        self.assertEqual(res, list(range(10)))
+        self.assertIsNotNone(ex)
+
     def test_for_iter_tier_two(self):
         class MyIter:
             def __init__(self, n):
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst
new file mode 100644 (file)
index 0000000..c8ca7a7
--- /dev/null
@@ -0,0 +1 @@
+Fix a JIT assertion failure when a conditional branch jumps to the same target as the fallthrough path.
index 4387bcb0d67832ac9c16f9dc2bcdeec7482dffb7..7315bb6b9f603d2ffdb4bb3061303fcd12302f09 100644 (file)
@@ -786,8 +786,8 @@ _PyJit_translate_single_bytecode_to_trace(
             _Py_CODEUNIT *computed_next_instr = computed_next_instr_without_modifiers + (computed_next_instr_without_modifiers->op.code == NOT_TAKEN);
             _Py_CODEUNIT *computed_jump_instr = computed_next_instr_without_modifiers + oparg;
             assert(next_instr == computed_next_instr || next_instr == computed_jump_instr);
-            int jump_happened = computed_jump_instr == next_instr;
-            assert(jump_happened == (target_instr[1].cache & 1));
+            int jump_happened = target_instr[1].cache & 1;
+            assert(jump_happened ? (next_instr == computed_jump_instr) : (next_instr == computed_next_instr));
             uint32_t uopcode = BRANCH_TO_GUARD[opcode - POP_JUMP_IF_FALSE][jump_happened];
             ADD_TO_TRACE(uopcode, 0, 0, INSTR_IP(jump_happened ? computed_next_instr : computed_jump_instr, old_code));
             break;