[issue30501] Produce optimized code for boolean conditions

Serhiy Storchaka report at bugs.python.org
Mon May 29 03:19:43 EDT 2017


Serhiy Storchaka added the comment:

Some examples.

if not a and b: x

Unpatched:
  1           0 LOAD_NAME                0 (a)
              2 UNARY_NOT
              4 POP_JUMP_IF_FALSE       14
              6 LOAD_NAME                1 (b)
              8 POP_JUMP_IF_FALSE       14
             10 LOAD_NAME                2 (x)
             12 POP_TOP
        >>   14 LOAD_CONST               0 (None)
             16 RETURN_VALUE

Patched:
  1           0 LOAD_NAME                0 (a)
              2 POP_JUMP_IF_TRUE        12
              4 LOAD_NAME                1 (b)
              6 POP_JUMP_IF_FALSE       12
              8 LOAD_NAME                2 (x)
             10 POP_TOP
        >>   12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

if a <= b < c: x

Unpatched:
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               1 (<=)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 JUMP_FORWARD             4 (to 22)
        >>   18 ROT_TWO
             20 POP_TOP
        >>   22 POP_JUMP_IF_FALSE       28
             24 LOAD_NAME                3 (x)
             26 POP_TOP
        >>   28 LOAD_CONST               0 (None)
             30 RETURN_VALUE

Patched:
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               1 (<=)
             10 POP_JUMP_IF_FALSE       20
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 POP_JUMP_IF_FALSE       28
             18 JUMP_FORWARD             4 (to 24)
        >>   20 POP_TOP
             22 JUMP_FORWARD             4 (to 28)
        >>   24 LOAD_NAME                3 (x)
             26 POP_TOP
        >>   28 LOAD_CONST               0 (None)
             30 RETURN_VALUE

if not (a and b) and c: x

Unpatched:
  1           0 LOAD_NAME                0 (a)
              2 JUMP_IF_FALSE_OR_POP     6
              4 LOAD_NAME                1 (b)
        >>    6 UNARY_NOT
              8 POP_JUMP_IF_FALSE       18
             10 LOAD_NAME                2 (c)
             12 POP_JUMP_IF_FALSE       18
             14 LOAD_NAME                3 (x)
             16 POP_TOP
        >>   18 LOAD_CONST               0 (None)
             20 RETURN_VALUE

Patched:
  1           0 LOAD_NAME                0 (a)
              2 POP_JUMP_IF_FALSE        8
              4 LOAD_NAME                1 (b)
              6 POP_JUMP_IF_TRUE        16
        >>    8 LOAD_NAME                2 (c)
             10 POP_JUMP_IF_FALSE       16
             12 LOAD_NAME                3 (x)
             14 POP_TOP
        >>   16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

Note that the __bool__() method of every value is evaluated only once.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue30501>
_______________________________________


More information about the Python-bugs-list mailing list