summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-12-19 11:04:44 (GMT)
committerGitHub <noreply@github.com>2023-12-19 11:04:44 (GMT)
commite51b4009454939e3ee5f1bfaed45ce65689a71b8 (patch)
tree0933d9a4624dbb4f74a00ef5e1e4dfdcf7ab5327
parent76d757b38b414964546393bdccff31c1f8be3843 (diff)
downloadcpython-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.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-12-14-20-08-35.gh-issue-113054.e20CtM.rst2
-rw-r--r--Python/flowgraph.c17
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;
}