summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_compile.py11
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst1
-rw-r--r--Python/flowgraph.c5
3 files changed, 17 insertions, 0 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index f4e2855..d3a5517 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1261,6 +1261,17 @@ class TestSpecifics(unittest.TestCase):
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):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst b/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst
new file mode 100644
index 0000000..83be54c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-09-22-13-38-17.gh-issue-109719.fx5OTz.rst
@@ -0,0 +1 @@
+Fix missing jump target labels when compiler reorders cold/warm blocks.
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index 2df9b48..adfcef3 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -2133,6 +2133,8 @@ push_cold_blocks_to_end(cfg_builder *g) {
}
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) {
@@ -2141,6 +2143,9 @@ push_cold_blocks_to_end(cfg_builder *g) {
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;