From 41757bfabd26ef1d01dcde1d2bbf90e1a8d9d62c Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Fri, 12 Aug 2022 16:35:09 +0100 Subject: [PATCH] gh-95922: compiler's eliminate_empty_basic_blocks ignores the last block of the compilation unit (GH-95924) --- .../2022-08-12-13-04-25.gh-issue-95922.YNCtyX.rst | 2 ++ Python/compile.c | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-08-12-13-04-25.gh-issue-95922.YNCtyX.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-08-12-13-04-25.gh-issue-95922.YNCtyX.rst b/Misc/NEWS.d/next/Core and Builtins/2022-08-12-13-04-25.gh-issue-95922.YNCtyX.rst new file mode 100644 index 00000000000..277d35deab3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-08-12-13-04-25.gh-issue-95922.YNCtyX.rst @@ -0,0 +1,2 @@ +Fixed bug where the compiler's ``eliminate_empty_basic_blocks`` function +ignores the last block of the code unit. diff --git a/Python/compile.c b/Python/compile.c index a971b09c530..3dec7b5edfb 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -9349,17 +9349,13 @@ eliminate_empty_basic_blocks(basicblock *entryblock) { /* Eliminate empty blocks */ for (basicblock *b = entryblock; b != NULL; b = b->b_next) { basicblock *next = b->b_next; - if (next) { - while (next->b_iused == 0 && next->b_next) { - next = next->b_next; - } - b->b_next = next; + while (next && next->b_iused == 0) { + next = next->b_next; } + b->b_next = next; } for (basicblock *b = entryblock; b != NULL; b = b->b_next) { - if (b->b_iused == 0) { - continue; - } + assert(b->b_iused > 0); for (int i = 0; i < b->b_iused; i++) { struct instr *instr = &b->b_instr[i]; if (HAS_TARGET(instr->i_opcode)) { @@ -9368,6 +9364,7 @@ eliminate_empty_basic_blocks(basicblock *entryblock) { target = target->b_next; } instr->i_target = target; + assert(instr->i_target && instr->i_target->b_iused > 0); } } }