]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-109823: Adjust labels in compiler when removing an empty basic block which...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 26 Sep 2023 00:37:52 +0000 (17:37 -0700)
committerGitHub <noreply@github.com>
Tue, 26 Sep 2023 00:37:52 +0000 (02:37 +0200)
gh-109823: Adjust labels in compiler when removing an empty basic block which is a jump target (GH-109839)
(cherry picked from commit d73c12b88c2275fd44e27c91c24f3ac85419d2b8)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Lib/test/test_compile.py
Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst [new file with mode: 0644]
Python/flowgraph.c

index 2e5763eb3d61e905b23ef7ed2cb78c7389f90380..e377620a0c87b8a9a18125eb887df9ddfc7050e7 100644 (file)
@@ -1236,6 +1236,11 @@ class TestSpecifics(unittest.TestCase):
             else:
                 1 if 1 else 1
 
+    def test_remove_empty_basic_block_with_jump_target_label(self):
+        # See gh-109823
+        def f(x):
+            while x:
+                0 if 1 else 0
 
 @requires_debug_ranges()
 class TestSourcePositions(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-25-14-28-14.gh-issue-109823.kbVTKF.rst
new file mode 100644 (file)
index 0000000..793c89f
--- /dev/null
@@ -0,0 +1,2 @@
+Fix bug where compiler does not adjust labels when removing an empty basic
+block which is a jump target.
index d19fe686d01c94a54d09a2b5bbeabf4f334c278d..ccf078c7feab2dd624d063bfca8352629508402f 100644 (file)
@@ -922,6 +922,7 @@ eliminate_empty_basic_blocks(cfg_builder *g) {
     while(g->g_entryblock && g->g_entryblock->b_iused == 0) {
         g->g_entryblock = g->g_entryblock->b_next;
     }
+    int next_lbl = get_max_label(g->g_entryblock) + 1;
     for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) {
         assert(b->b_iused > 0);
         for (int i = 0; i < b->b_iused; i++) {
@@ -931,7 +932,13 @@ eliminate_empty_basic_blocks(cfg_builder *g) {
                 while (target->b_iused == 0) {
                     target = target->b_next;
                 }
-                instr->i_target = target;
+                if (instr->i_target != target) {
+                    if (!IS_LABEL(target->b_label)) {
+                        target->b_label.id = next_lbl++;
+                    }
+                    instr->i_target = target;
+                    instr->i_oparg = target->b_label.id;
+                }
                 assert(instr->i_target && instr->i_target->b_iused > 0);
             }
         }