]
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()
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: