Skip to content

Commit

Permalink
[3.12] gh-109719: Fix missing jump target labels when compiler reorde…
Browse files Browse the repository at this point in the history
…rs cold/warm blocks (GH-109734) (#109749)

gh-109719: Fix missing jump target labels when compiler reorders cold/warm blocks (GH-109734)
(cherry picked from commit 7c55399)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
  • Loading branch information
miss-islington and iritkatriel committed Sep 24, 2023
1 parent f6287bd commit 633bd6e
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 0 deletions.
11 changes: 11 additions & 0 deletions Lib/test/test_compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -1225,6 +1225,17 @@ def f():
except:
pass

def test_cold_block_moved_to_end(self):
# See gh-109719
def f():
while name:
try:
break
except:
pass
else:
1 if 1 else 1


@requires_debug_ranges()
class TestSourcePositions(unittest.TestCase):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix missing jump target labels when compiler reorders cold/warm blocks.
5 changes: 5 additions & 0 deletions Python/flowgraph.c
Original file line number Diff line number Diff line change
Expand Up @@ -1945,6 +1945,8 @@ push_cold_blocks_to_end(cfg_builder *g, int code_flags) {
}
RETURN_IF_ERROR(mark_cold(entryblock));

int next_lbl = get_max_label(g->g_entryblock) + 1;

/* If we have a cold block with fallthrough to a warm block, add */
/* an explicit jump instead of fallthrough */
for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
Expand All @@ -1953,6 +1955,9 @@ push_cold_blocks_to_end(cfg_builder *g, int code_flags) {
if (explicit_jump == NULL) {
return ERROR;
}
if (!IS_LABEL(b->b_next->b_label)) {
b->b_next->b_label.id = next_lbl++;
}
basicblock_addop(explicit_jump, JUMP, b->b_next->b_label.id, NO_LOCATION);
explicit_jump->b_cold = 1;
explicit_jump->b_next = b->b_next;
Expand Down

0 comments on commit 633bd6e

Please sign in to comment.