mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
[3.12] gh-112356: LOAD_GLOBAL can only include one PUSH_NULL (#112566)
This commit is contained in:
parent
4c9da4c964
commit
a99305e7fb
3 changed files with 24 additions and 2 deletions
|
@ -1075,5 +1075,26 @@ class DirectCfgOptimizerTests(CfgOptimizationTestCase):
|
|||
]
|
||||
self.cfg_optimization_test(insts, insts, consts=list(range(3)), nlocals=1)
|
||||
|
||||
def test_only_one_push_null_per_load_global(self):
|
||||
# When optimizing func()(), a second pass shouldn't
|
||||
# let the LOAD_GLOBAL absorb another PUSH_NULL.
|
||||
before = [
|
||||
('PUSH_NULL', 0, 1),
|
||||
('PUSH_NULL', 0, 1),
|
||||
('LOAD_GLOBAL', 0, 1),
|
||||
('CALL', 0, 1),
|
||||
('CALL', 0, 1),
|
||||
('RETURN_VALUE', 0, 1),
|
||||
]
|
||||
after = [
|
||||
('PUSH_NULL', 0, 1),
|
||||
('LOAD_GLOBAL', 1, 1),
|
||||
('CALL', 0, 1),
|
||||
('CALL', 0, 1),
|
||||
('RETURN_VALUE', 0, 1),
|
||||
]
|
||||
self.cfg_optimization_test(before, expected_insts=after, consts=[])
|
||||
self.cfg_optimization_test(after, expected_insts=after, consts=[])
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Stopped erroneously deleting a ``LOAD_NULL`` bytecode instruction when optimized twice.
|
|
@ -1554,9 +1554,9 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts)
|
|||
case KW_NAMES:
|
||||
break;
|
||||
case PUSH_NULL:
|
||||
if (nextop == LOAD_GLOBAL && (inst[1].i_opcode & 1) == 0) {
|
||||
if (nextop == LOAD_GLOBAL && (bb->b_instr[i+1].i_oparg & 1) == 0) {
|
||||
INSTR_SET_OP0(inst, NOP);
|
||||
inst[1].i_oparg |= 1;
|
||||
bb->b_instr[i+1].i_oparg |= 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue