]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109719: Fix missing jump target labels when compiler reorders cold/warm blocks...
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>
Fri, 22 Sep 2023 16:59:35 +0000 (17:59 +0100)
committerGitHub <noreply@github.com>
Fri, 22 Sep 2023 16:59:35 +0000 (16:59 +0000)
Lib/test/test_compile.py
Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst [new file with mode: 0644]
Python/flowgraph.c

index f4e28559194dd68b78ce177b7417f672ed89b13d..d3a5517963c54003a83e37f8cc433bab44650dae 100644 (file)
@@ -1261,6 +1261,17 @@ class TestSpecifics(unittest.TestCase):
                 except:
                     pass
 
+    def test_cold_block_moved_to_end(self):
+        # See gh-109719
+        def f():
+            while name:
+                try:
+                    break
+                except:
+                    pass
+            else:
+                1 if 1 else 1
+
 
 @requires_debug_ranges()
 class TestSourcePositions(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst
new file mode 100644 (file)
index 0000000..83be54c
--- /dev/null
@@ -0,0 +1 @@
+Fix missing jump target labels when compiler reorders cold/warm blocks.
index 2df9b4811817f2fd3e55328767991c23628a3963..adfcef33895a538bb469819adf657d8e27c62ed2 100644 (file)
@@ -2133,6 +2133,8 @@ push_cold_blocks_to_end(cfg_builder *g) {
     }
     RETURN_IF_ERROR(mark_cold(entryblock));
 
+    int next_lbl = get_max_label(g->g_entryblock) + 1;
+
     /* If we have a cold block with fallthrough to a warm block, add */
     /* an explicit jump instead of fallthrough */
     for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
@@ -2141,6 +2143,9 @@ push_cold_blocks_to_end(cfg_builder *g) {
             if (explicit_jump == NULL) {
                 return ERROR;
             }
+            if (!IS_LABEL(b->b_next->b_label)) {
+                b->b_next->b_label.id = next_lbl++;
+            }
             basicblock_addop(explicit_jump, JUMP, b->b_next->b_label.id, NO_LOCATION);
             explicit_jump->b_cold = 1;
             explicit_jump->b_next = b->b_next;