Skip to content

Commit bf6222b

Browse files
committed
Move optimize after all other passes have run
We need to run last, to ensure instructions are not inserted after we strength reduce load fast instructions.
1 parent 9bfa922 commit bf6222b

File tree

3 files changed

+23
-22
lines changed

3 files changed

+23
-22
lines changed

Lib/test/test_dis.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -462,15 +462,15 @@ def foo(a: int, b: str) -> str:
462462
NOT_TAKEN
463463
STORE_FAST 0 (e)
464464
465-
%4d L4: LOAD_FAST_BORROW 0 (e)
465+
%4d L4: LOAD_FAST 0 (e)
466466
LOAD_ATTR 2 (__traceback__)
467467
STORE_FAST 1 (tb)
468468
L5: POP_EXCEPT
469469
LOAD_CONST 0 (None)
470470
STORE_FAST 0 (e)
471471
DELETE_FAST 0 (e)
472472
473-
%4d LOAD_FAST_BORROW 1 (tb)
473+
%4d LOAD_FAST 1 (tb)
474474
RETURN_VALUE
475475
476476
-- L6: LOAD_CONST 0 (None)
@@ -717,7 +717,7 @@ def _tryfinallyconst(b):
717717
718718
-- L3: PUSH_EXC_INFO
719719
720-
%4d LOAD_FAST_BORROW 1 (b)
720+
%4d LOAD_FAST 1 (b)
721721
PUSH_NULL
722722
CALL 0
723723
POP_TOP
@@ -752,7 +752,7 @@ def _tryfinallyconst(b):
752752
753753
-- L1: PUSH_EXC_INFO
754754
755-
%4d LOAD_FAST_BORROW 0 (b)
755+
%4d LOAD_FAST 0 (b)
756756
PUSH_NULL
757757
CALL 0
758758
POP_TOP
@@ -791,7 +791,7 @@ def foo(x):
791791
792792
%4d RESUME 0
793793
794-
%4d LOAD_FAST 0 (y)
794+
%4d LOAD_FAST_BORROW 0 (y)
795795
BUILD_TUPLE 1
796796
LOAD_CONST 0 (<code object foo at 0x..., file "%s", line %d>)
797797
MAKE_FUNCTION
@@ -815,7 +815,7 @@ def foo(x):
815815
%4d RESUME 0
816816
817817
%4d LOAD_GLOBAL 1 (list + NULL)
818-
LOAD_FAST 0 (x)
818+
LOAD_FAST_BORROW 0 (x)
819819
BUILD_TUPLE 1
820820
LOAD_CONST 1 (<code object <genexpr> at 0x..., file "%s", line %d>)
821821
MAKE_FUNCTION
@@ -1711,8 +1711,8 @@ def _prepare_test_cases():
17111711
Instruction(opname='MAKE_CELL', opcode=95, arg=1, argval='b', argrepr='b', offset=2, start_offset=2, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
17121712
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=4, start_offset=4, starts_line=True, line_number=1, label=None, positions=None, cache_info=None),
17131713
Instruction(opname='LOAD_CONST', opcode=80, arg=3, argval=(3, 4), argrepr='(3, 4)', offset=6, start_offset=6, starts_line=True, line_number=2, label=None, positions=None, cache_info=None),
1714-
Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
1715-
Instruction(opname='LOAD_FAST', opcode=82, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
1714+
Instruction(opname='LOAD_FAST_BORROW', opcode=84, arg=0, argval='a', argrepr='a', offset=8, start_offset=8, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
1715+
Instruction(opname='LOAD_FAST_BORROW', opcode=84, arg=1, argval='b', argrepr='b', offset=10, start_offset=10, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
17161716
Instruction(opname='BUILD_TUPLE', opcode=50, arg=2, argval=2, argrepr='', offset=12, start_offset=12, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
17171717
Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=code_object_f, argrepr=repr(code_object_f), offset=14, start_offset=14, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
17181718
Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, argrepr='', offset=16, start_offset=16, starts_line=False, line_number=2, label=None, positions=None, cache_info=None),
@@ -1739,10 +1739,10 @@ def _prepare_test_cases():
17391739
Instruction(opname='MAKE_CELL', opcode=95, arg=1, argval='d', argrepr='d', offset=4, start_offset=4, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
17401740
Instruction(opname='RESUME', opcode=149, arg=0, argval=0, argrepr='', offset=6, start_offset=6, starts_line=True, line_number=2, label=None, positions=None, cache_info=None),
17411741
Instruction(opname='LOAD_CONST', opcode=80, arg=1, argval=(5, 6), argrepr='(5, 6)', offset=8, start_offset=8, starts_line=True, line_number=3, label=None, positions=None, cache_info=None),
1742-
Instruction(opname='LOAD_FAST', opcode=82, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1743-
Instruction(opname='LOAD_FAST', opcode=82, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1744-
Instruction(opname='LOAD_FAST', opcode=82, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1745-
Instruction(opname='LOAD_FAST', opcode=82, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1742+
Instruction(opname='LOAD_FAST_BORROW', opcode=84, arg=3, argval='a', argrepr='a', offset=10, start_offset=10, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1743+
Instruction(opname='LOAD_FAST_BORROW', opcode=84, arg=4, argval='b', argrepr='b', offset=12, start_offset=12, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1744+
Instruction(opname='LOAD_FAST_BORROW', opcode=84, arg=0, argval='c', argrepr='c', offset=14, start_offset=14, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
1745+
Instruction(opname='LOAD_FAST_BORROW', opcode=84, arg=1, argval='d', argrepr='d', offset=16, start_offset=16, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
17461746
Instruction(opname='BUILD_TUPLE', opcode=50, arg=4, argval=4, argrepr='', offset=18, start_offset=18, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
17471747
Instruction(opname='LOAD_CONST', opcode=80, arg=0, argval=code_object_inner, argrepr=repr(code_object_inner), offset=20, start_offset=20, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),
17481748
Instruction(opname='MAKE_FUNCTION', opcode=23, arg=None, argval=None, argrepr='', offset=22, start_offset=22, starts_line=False, line_number=3, label=None, positions=None, cache_info=None),

Lib/test/test_peepholer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2325,9 +2325,9 @@ def test_list_to_tuple_get_iter(self):
23252325
]
23262326
expected_insts = [
23272327
("BUILD_LIST", 0, 1),
2328-
("LOAD_FAST_BORROW", 0, 2),
2328+
("LOAD_FAST", 0, 2),
23292329
("LIST_EXTEND", 1, 3),
2330-
("LOAD_FAST_BORROW", 1, 4),
2330+
("LOAD_FAST", 1, 4),
23312331
("LIST_EXTEND", 1, 5),
23322332
("NOP", None, 6), # ("CALL_INTRINSIC_1", INTRINSIC_LIST_TO_TUPLE, 6),
23332333
("GET_ITER", None, 7),

Python/flowgraph.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#include <stdbool.h>
32

43
#include "Python.h"
@@ -571,6 +570,7 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
571570
basicblock_addop(backwards_jump, NOT_TAKEN, 0, last->i_loc));
572571
RETURN_IF_ERROR(
573572
basicblock_add_jump(backwards_jump, JUMP, target, last->i_loc));
573+
backwards_jump->b_startdepth = target->b_startdepth;
574574
last->i_opcode = reversed_opcode;
575575
last->i_target = b->b_next;
576576

@@ -2520,10 +2520,8 @@ kill_local(bool *has_killed_refs, ref_stack *refs, int local)
25202520
static void
25212521
load_fast_push_block(basicblock ***sp, basicblock *target, int start_depth)
25222522
{
2523-
assert(!target->b_visited || (target->b_startdepth == start_depth));
2523+
assert(target->b_startdepth >= 0 && target->b_startdepth == start_depth);
25242524
if (!target->b_visited) {
2525-
assert(target->b_startdepth == -1);
2526-
target->b_startdepth = start_depth;
25272525
target->b_visited = 1;
25282526
*(*sp)++ = target;
25292527
}
@@ -2535,8 +2533,8 @@ optimize_load_fast(cfg_builder *g)
25352533
int status;
25362534
ref_stack refs = {0};
25372535
int max_instrs = 0;
2538-
for (basicblock *b = g->g_block_list; b != NULL; b = b->b_list) {
2539-
b->b_startdepth = -1;
2536+
basicblock *entryblock = g->g_entryblock;
2537+
for (basicblock *b = entryblock; b != NULL; b = b->b_next) {
25402538
max_instrs = Py_MAX(max_instrs, b->b_iused);
25412539
}
25422540
size_t has_killed_refs_size = max_instrs * sizeof(bool);
@@ -2545,7 +2543,6 @@ optimize_load_fast(cfg_builder *g)
25452543
PyErr_NoMemory();
25462544
return ERROR;
25472545
}
2548-
basicblock *entryblock = g->g_entryblock;
25492546
basicblock **blocks = make_cfg_traversal_stack(entryblock);
25502547
if (blocks == NULL) {
25512548
status = ERROR;
@@ -3318,7 +3315,6 @@ _PyCfg_OptimizeCodeUnit(cfg_builder *g, PyObject *consts, PyObject *const_cache,
33183315
add_checks_for_loads_of_uninitialized_variables(
33193316
g->g_entryblock, nlocals, nparams));
33203317
RETURN_IF_ERROR(insert_superinstructions(g));
3321-
RETURN_IF_ERROR(optimize_load_fast(g));
33223318

33233319
RETURN_IF_ERROR(push_cold_blocks_to_end(g));
33243320
RETURN_IF_ERROR(resolve_line_numbers(g, firstlineno));
@@ -3650,6 +3646,11 @@ _PyCfg_OptimizedCfgToInstructionSequence(cfg_builder *g,
36503646
RETURN_IF_ERROR(normalize_jumps(g));
36513647
assert(no_redundant_jumps(g));
36523648

3649+
/* Can't modify the bytecode after inserting instructions that produce
3650+
* borrowed references.
3651+
*/
3652+
RETURN_IF_ERROR(optimize_load_fast(g));
3653+
36533654
/* Can't modify the bytecode after computing jump offsets. */
36543655
if (_PyCfg_ToInstructionSequence(g, seq) < 0) {
36553656
return ERROR;

0 commit comments

Comments
 (0)