[3.12] gh-109823: Adjust labels in compiler when removing an empty basic block which is a jump target (GH-109839) (#109865)

gh-109823: Adjust labels in compiler when removing an empty basic block which is a jump target (GH-109839)
(cherry picked from commit d73c12b88c)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2023-09-25 17:37:52 -07:00 committed by GitHub
parent a19251764a
commit 538f505a37
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 1 deletions

View file

@ -1236,6 +1236,11 @@ class TestSpecifics(unittest.TestCase):
else:
1 if 1 else 1
def test_remove_empty_basic_block_with_jump_target_label(self):
# See gh-109823
def f(x):
while x:
0 if 1 else 0
@requires_debug_ranges()
class TestSourcePositions(unittest.TestCase):

View file

@ -0,0 +1,2 @@
Fix bug where compiler does not adjust labels when removing an empty basic
block which is a jump target.

View file

@ -922,6 +922,7 @@ eliminate_empty_basic_blocks(cfg_builder *g) {
while(g->g_entryblock && g->g_entryblock->b_iused == 0) {
g->g_entryblock = g->g_entryblock->b_next;
}
int next_lbl = get_max_label(g->g_entryblock) + 1;
for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) {
assert(b->b_iused > 0);
for (int i = 0; i < b->b_iused; i++) {
@ -931,7 +932,13 @@ eliminate_empty_basic_blocks(cfg_builder *g) {
while (target->b_iused == 0) {
target = target->b_next;
}
instr->i_target = target;
if (instr->i_target != target) {
if (!IS_LABEL(target->b_label)) {
target->b_label.id = next_lbl++;
}
instr->i_target = target;
instr->i_oparg = target->b_label.id;
}
assert(instr->i_target && instr->i_target->b_iused > 0);
}
}