mirror of
https://github.com/python/cpython.git
synced 2025-08-01 15:43:13 +00:00
gh-120367: fix removal of redundant NOPs and jumps after reordering hot-cold blocks (#120425)
This commit is contained in:
parent
c2d5df5787
commit
21866c8ed2
3 changed files with 47 additions and 12 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue