Bug report
Bug description:
Originally addressed in Issue #144388, the bytecode compiler does not always convert a LOAD_FAST instruction into a LOAD_FAST_BORROW. For example, the following python code, which gets compiled into only one basicblock, has a LOAD_FAST when it could have a LOAD_FAST_BORROW:
from dis import dis
def f(a,b):
return a if a < b else b
dis(f)
Byte code
3 RESUME 0
4 LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b)
COMPARE_OP 18 (bool(<))
POP_JUMP_IF_FALSE 3 (to L1)
NOT_TAKEN
LOAD_FAST_BORROW 0 (a)
RETURN_VALUE
L1: LOAD_FAST 1 (b)
RETURN_VALUE
In contrast, the following expanded version of f does convert all LOAD_FAST instructions into LOAD_FAST_BORROW and has three different basic blocks:
from dis import dis
def g(a,b):
if a < b:
return a
else:
return b
dis(g)
Byte code
3 RESUME 0
4 LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b)
COMPARE_OP 18 (bool(<))
POP_JUMP_IF_FALSE 3 (to L1)
NOT_TAKEN
5 LOAD_FAST_BORROW 0 (a)
RETURN_VALUE
7 L1: LOAD_FAST_BORROW 1 (b)
RETURN_VALUE
The function of interest is optimize_load_fast in Python/flowgraph.c. I have tried to fix this bug but have not been able to yet. All I have found so far is that the LOAD_FAST instruction is misclassified as REF_UNCONSUMED here for the case of function f:
|
for (Py_ssize_t i = 0; i < refs.size; i++) { |
|
ref r = ref_stack_at(&refs, i); |
|
if (r.instr != -1) { |
|
instr_flags[r.instr] |= REF_UNCONSUMED; |
|
} |
|
} |
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
Bug report
Bug description:
Originally addressed in Issue #144388, the bytecode compiler does not always convert a
LOAD_FASTinstruction into aLOAD_FAST_BORROW. For example, the following python code, which gets compiled into only onebasicblock, has aLOAD_FASTwhen it could have aLOAD_FAST_BORROW:Byte code
3 RESUME 0 4 LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b) COMPARE_OP 18 (bool(<)) POP_JUMP_IF_FALSE 3 (to L1) NOT_TAKEN LOAD_FAST_BORROW 0 (a) RETURN_VALUE L1: LOAD_FAST 1 (b) RETURN_VALUEIn contrast, the following expanded version of
fdoes convert allLOAD_FASTinstructions intoLOAD_FAST_BORROWand has three different basic blocks:Byte code
3 RESUME 0 4 LOAD_FAST_BORROW_LOAD_FAST_BORROW 1 (a, b) COMPARE_OP 18 (bool(<)) POP_JUMP_IF_FALSE 3 (to L1) NOT_TAKEN 5 LOAD_FAST_BORROW 0 (a) RETURN_VALUE 7 L1: LOAD_FAST_BORROW 1 (b) RETURN_VALUEThe function of interest is
optimize_load_fastinPython/flowgraph.c. I have tried to fix this bug but have not been able to yet. All I have found so far is that theLOAD_FASTinstruction is misclassified asREF_UNCONSUMEDhere for the case of functionf:cpython/Python/flowgraph.c
Lines 3006 to 3011 in 149c465
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs