mirror of https://github.com/python/cpython
gh-109719: Fix missing jump target labels when compiler reorders cold/warm blocks (#109734)
This commit is contained in:
parent
73ccfa28c5
commit
7c55399172
|
@ -1261,6 +1261,17 @@ class TestSpecifics(unittest.TestCase):
|
||||||
except:
|
except:
|
||||||
pass
|
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()
|
@requires_debug_ranges()
|
||||||
class TestSourcePositions(unittest.TestCase):
|
class TestSourcePositions(unittest.TestCase):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix missing jump target labels when compiler reorders cold/warm blocks.
|
|
@ -2133,6 +2133,8 @@ push_cold_blocks_to_end(cfg_builder *g) {
|
||||||
}
|
}
|
||||||
RETURN_IF_ERROR(mark_cold(entryblock));
|
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 */
|
/* If we have a cold block with fallthrough to a warm block, add */
|
||||||
/* an explicit jump instead of fallthrough */
|
/* an explicit jump instead of fallthrough */
|
||||||
for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
|
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) {
|
if (explicit_jump == NULL) {
|
||||||
return ERROR;
|
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);
|
basicblock_addop(explicit_jump, JUMP, b->b_next->b_label.id, NO_LOCATION);
|
||||||
explicit_jump->b_cold = 1;
|
explicit_jump->b_cold = 1;
|
||||||
explicit_jump->b_next = b->b_next;
|
explicit_jump->b_next = b->b_next;
|
||||||
|
|
Loading…
Reference in New Issue