summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2024-06-17 10:10:06 (GMT)
committerGitHub <noreply@github.com>2024-06-17 10:10:06 (GMT)
commit21866c8ed296524f0ca175c0f55b43744c2b30df (patch)
treee3999b48aa9a4d66d4ac4b1e90518d8659b5d3aa /Python
parentc2d5df5787b1f7fbd2583811c66c34a417593cad (diff)
downloadcpython-21866c8ed296524f0ca175c0f55b43744c2b30df.zip
cpython-21866c8ed296524f0ca175c0f55b43744c2b30df.tar.gz
cpython-21866c8ed296524f0ca175c0f55b43744c2b30df.tar.bz2
gh-120367: fix removal of redundant NOPs and jumps after reordering hot-cold blocks (#120425)
Diffstat (limited to 'Python')
-rw-r--r--Python/flowgraph.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index aed694a..6f30dfc 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -1857,6 +1857,22 @@ error:
static int resolve_line_numbers(cfg_builder *g, int firstlineno);
+static int
+remove_redundant_nops_and_jumps(cfg_builder *g)
+{
+ int removed_nops, removed_jumps;
+ do {
+ /* Convergence is guaranteed because the number of
+ * redundant jumps and nops only decreases.
+ */
+ removed_nops = remove_redundant_nops(g);
+ RETURN_IF_ERROR(removed_nops);
+ removed_jumps = remove_redundant_jumps(g);
+ RETURN_IF_ERROR(removed_jumps);
+ } while(removed_nops + removed_jumps > 0);
+ return SUCCESS;
+}
+
/* Perform optimizations on a control flow graph.
The consts object should still be in list form to allow new constants
to be appended.
@@ -1878,17 +1894,7 @@ optimize_cfg(cfg_builder *g, PyObject *consts, PyObject *const_cache, int firstl
}
RETURN_IF_ERROR(remove_redundant_nops_and_pairs(g->g_entryblock));
RETURN_IF_ERROR(remove_unreachable(g->g_entryblock));
-
- int removed_nops, removed_jumps;
- do {
- /* Convergence is guaranteed because the number of
- * redundant jumps and nops only decreases.
- */
- removed_nops = remove_redundant_nops(g);
- RETURN_IF_ERROR(removed_nops);
- removed_jumps = remove_redundant_jumps(g);
- RETURN_IF_ERROR(removed_jumps);
- } while(removed_nops + removed_jumps > 0);
+ RETURN_IF_ERROR(remove_redundant_nops_and_jumps(g));
assert(no_redundant_jumps(g));
return SUCCESS;
}
@@ -2358,7 +2364,7 @@ push_cold_blocks_to_end(cfg_builder *g) {
b->b_next = cold_blocks;
if (cold_blocks != NULL) {
- RETURN_IF_ERROR(remove_redundant_jumps(g));
+ RETURN_IF_ERROR(remove_redundant_nops_and_jumps(g));
}
return SUCCESS;
}