[3.12] gh-112356: LOAD_GLOBAL can only include one PUSH_NULL (#112566)

This commit is contained in:
Dennis Sweeney 2023-11-30 19:35:49 -05:00 committed by GitHub
parent 4c9da4c964
commit a99305e7fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 2 deletions

View file

@ -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()

View file

@ -0,0 +1 @@
Stopped erroneously deleting a ``LOAD_NULL`` bytecode instruction when optimized twice.

View file

@ -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: