diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2023-12-19 11:04:44 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-19 11:04:44 (GMT) |
commit | e51b4009454939e3ee5f1bfaed45ce65689a71b8 (patch) | |
tree | 0933d9a4624dbb4f74a00ef5e1e4dfdcf7ab5327 | |
parent | 76d757b38b414964546393bdccff31c1f8be3843 (diff) | |
download | cpython-e51b4009454939e3ee5f1bfaed45ce65689a71b8.zip cpython-e51b4009454939e3ee5f1bfaed45ce65689a71b8.tar.gz cpython-e51b4009454939e3ee5f1bfaed45ce65689a71b8.tar.bz2 |
gh-113054: Compiler no longer replaces a redundant jump with no line number by a NOP (#113139)
-rw-r--r-- | Lib/test/test_compile.py | 4 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2023-12-14-20-08-35.gh-issue-113054.e20CtM.rst | 2 | ||||
-rw-r--r-- | Python/flowgraph.c | 17 |
3 files changed, 22 insertions, 1 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index f681d12..906e16c 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -444,6 +444,10 @@ class TestSpecifics(unittest.TestCase): 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( diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-12-14-20-08-35.gh-issue-113054.e20CtM.rst b/Misc/NEWS.d/next/Core and Builtins/2023-12-14-20-08-35.gh-issue-113054.e20CtM.rst new file mode 100644 index 0000000..d0729f9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-12-14-20-08-35.gh-issue-113054.e20CtM.rst @@ -0,0 +1,2 @@ +Fixed bug where a redundant NOP is not removed, causing an assertion to fail +in the compiler in debug mode. diff --git a/Python/flowgraph.c b/Python/flowgraph.c index fe63208..d2e3a7a 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -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); @@ -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; } |