Skip to content

Commit

Permalink
gh-113054: Compiler no longer replaces a redundant jump with no line …
Browse files Browse the repository at this point in the history
…number by a NOP (#113139)
  • Loading branch information
iritkatriel authored Dec 19, 2023
1 parent 76d757b commit e51b400
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
4 changes: 4 additions & 0 deletions Lib/test/test_compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,10 @@ def f():
self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
self.assertIn("__package__", A.f.__code__.co_varnames)

def test_condition_expression_with_dead_blocks_compiles(self):
# See gh-113054
compile('if (5 if 5 else T): 0', '<eval>', 'exec')

def test_compile_invalid_namedexpr(self):
# gh-109351
m = ast.Module(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fixed bug where a redundant NOP is not removed, causing an assertion to fail
in the compiler in debug mode.
17 changes: 16 additions & 1 deletion Python/flowgraph.c
Original file line number Diff line number Diff line change
Expand Up @@ -1110,7 +1110,10 @@ remove_redundant_jumps(cfg_builder *g) {
* of that jump. If it is, then the jump instruction is redundant and
* can be deleted.
*/

assert(no_empty_basic_blocks(g));

bool remove_empty_blocks = false;
for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) {
cfg_instr *last = basicblock_last_instr(b);
assert(last != NULL);
Expand All @@ -1122,10 +1125,22 @@ remove_redundant_jumps(cfg_builder *g) {
}
if (last->i_target == b->b_next) {
assert(b->b_next->b_iused);
INSTR_SET_OP0(last, NOP);
if (last->i_loc.lineno == NO_LOCATION.lineno) {
b->b_iused--;
if (b->b_iused == 0) {
remove_empty_blocks = true;
}
}
else {
INSTR_SET_OP0(last, NOP);
}
}
}
}
if (remove_empty_blocks) {
eliminate_empty_basic_blocks(g);
}
assert(no_empty_basic_blocks(g));
return SUCCESS;
}

Expand Down

0 comments on commit e51b400

Please sign in to comment.