[Python-checkins] Eliminate NOPs in extended blocks. (GH-24209)

markshannon webhook-mailer at python.org
Wed Jan 13 10:05:34 EST 2021


https://github.com/python/cpython/commit/1659ad1c644240d3db1d65e782c8c53b4c4e71ea
commit: 1659ad1c644240d3db1d65e782c8c53b4c4e71ea
branch: master
author: Mark Shannon <mark at hotpy.org>
committer: markshannon <mark at hotpy.org>
date: 2021-01-13T15:05:04Z
summary:

Eliminate NOPs in extended blocks. (GH-24209)

files:
M Python/compile.c

diff --git a/Python/compile.c b/Python/compile.c
index 268c5aa9eab2e..d373d8a4061a3 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -6328,10 +6328,9 @@ optimize_basic_block(basicblock *bb, PyObject *consts)
 
 
 static void
-clean_basic_block(basicblock *bb) {
-    /* Remove NOPs. */
+clean_basic_block(basicblock *bb, int prev_lineno) {
+    /* Remove NOPs when legal to do so. */
     int dest = 0;
-    int prev_lineno = -1;
     for (int src = 0; src < bb->b_iused; src++) {
         int lineno = bb->b_instr[src].i_lineno;
         if (bb->b_instr[src].i_opcode == NOP) {
@@ -6531,7 +6530,7 @@ optimize_cfg(struct assembler *a, PyObject *consts)
         if (optimize_basic_block(b, consts)) {
             return -1;
         }
-        clean_basic_block(b);
+        clean_basic_block(b, -1);
         assert(b->b_predecessors == 0);
     }
     if (mark_reachable(a)) {
@@ -6544,6 +6543,15 @@ optimize_cfg(struct assembler *a, PyObject *consts)
             b->b_nofallthrough = 0;
        }
     }
+    basicblock *pred = NULL;
+    for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) {
+        int prev_lineno = -1;
+        if (pred && pred->b_iused) {
+            prev_lineno = pred->b_instr[pred->b_iused-1].i_lineno;
+        }
+        clean_basic_block(b, prev_lineno);
+        pred = b->b_nofallthrough ? NULL : b;
+    }
     eliminate_empty_basic_blocks(a->a_entry);
     /* Delete jump instructions made redundant by previous step. If a non-empty
        block ends with a jump instruction, check if the next non-empty block
@@ -6571,7 +6579,7 @@ optimize_cfg(struct assembler *a, PyObject *consts)
                         case JUMP_ABSOLUTE:
                         case JUMP_FORWARD:
                             b_last_instr->i_opcode = NOP;
-                            clean_basic_block(b);
+                            clean_basic_block(b, -1);
                             maybe_empty_blocks = 1;
                             break;
                     }



More information about the Python-checkins mailing list