]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-109889: fix compiler's redundant NOP detection to look past NOPs with no...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 2 Oct 2023 15:43:16 +0000 (08:43 -0700)
committerGitHub <noreply@github.com>
Mon, 2 Oct 2023 15:43:16 +0000 (17:43 +0200)
gh-109889: fix compiler's redundant NOP detection to look past NOPs with no lineno when looking for the next instruction's lineno (GH-109987)
(cherry picked from commit f580edcc6a4c528020afe46c753db713474acad6)

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-27-21-35-49.gh-issue-109889.t5hIRT.rst [new file with mode: 0644]
Python/flowgraph.c

index b75d1c59591e91ba64de4788c2e6cd2df4997308..42df670fe00e0ab525d89b76b3ac0a17ba782a79 100644 (file)
@@ -1269,6 +1269,11 @@ class TestSpecifics(unittest.TestCase):
             while x:
                 0 if 1 else 0
 
+    def test_remove_redundant_nop_edge_case(self):
+        # See gh-109889
+        def f():
+            a if (1 if b else c) else d
+
 @requires_debug_ranges()
 class TestSourcePositions(unittest.TestCase):
     # Ensure that compiled code snippets have correct line and column numbers
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-27-21-35-49.gh-issue-109889.t5hIRT.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-27-21-35-49.gh-issue-109889.t5hIRT.rst
new file mode 100644 (file)
index 0000000..8be373f
--- /dev/null
@@ -0,0 +1,2 @@
+Fix the compiler's redundant NOP detection algorithm to skip over NOPs with
+no line number when looking for the next instruction's lineno.
index f860631a6c21dd15f95a5a1c000036c5e3932e96..afcae317403ef270c5c58465397bc0aef10f4031 100644 (file)
@@ -981,7 +981,17 @@ remove_redundant_nops(basicblock *bb) {
                 }
                 /* or if last instruction in BB and next BB has same line number */
                 if (next) {
-                    if (lineno == next->b_instr[0].i_loc.lineno) {
+                    location next_loc = NO_LOCATION;
+                    for (int next_i=0; next_i < next->b_iused; next_i++) {
+                        cfg_instr *instr = &next->b_instr[next_i];
+                        if (instr->i_opcode == NOP && instr->i_loc.lineno == NO_LOCATION.lineno) {
+                            /* Skip over NOPs without location, they will be removed */
+                            continue;
+                        }
+                        next_loc = instr->i_loc;
+                        break;
+                    }
+                    if (lineno == next_loc.lineno) {
                         continue;
                     }
                 }