From: Pablo Galindo Date: Fri, 14 Jun 2019 06:18:51 +0000 (+0100) Subject: [3.7] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071... X-Git-Tag: v3.7.4rc1~29 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5292179afc6fd0dc533add054d4790773c9766d0;p=thirdparty%2FPython%2Fcpython.git [3.7] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) (GH-14073) Fix a regression introduced by af8646c8054d0f4180a2013383039b6a472f9698 that was causing code of the form: if True and False: do_something() to be optimized incorrectly, eliminating the block.. (cherry picked from commit 05f831865545b08c9a21cfb7773af58b76ec64cb) Co-authored-by: Pablo Galindo --- diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 0cc1e92907b5..1a031544fc01 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -311,6 +311,13 @@ class TestTranforms(BytecodeTestCase): self.assertFalse(instr.opname.startswith('BINARY_')) self.assertFalse(instr.opname.startswith('BUILD_')) + def test_condition_with_binop_with_bools(self): + def f(): + if True or False: + return 1 + return 0 + self.assertEqual(f(), 1) + class TestBuglets(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst new file mode 100644 index 000000000000..b9b79066774f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-14-06-32-33.bpo-37269.SjVVAe.rst @@ -0,0 +1,2 @@ +Fix a bug in the peephole optimizer that was not treating correctly constant +conditions with binary operators. Patch by Pablo Galindo. diff --git a/Python/peephole.c b/Python/peephole.c index 1ae62fa39a27..f1b71ed1a730 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -313,6 +313,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, fill_nops(codestr, op_start, nexti + 1); cumlc = 0; } else if (is_true == 0) { + if (i > 1 && + (_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE || + _Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) { + break; + } h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT); tgt = find_op(codestr, codelen, h); fill_nops(codestr, op_start, tgt);