That is much clearer now. 
Thanks a lot Raymond for taking the time out to explain this to me.
 On a closing note, is this mailing list the right place to ask these kinds of 
n00b questions?

Obi.
> On 18 Jun 2016, at 23:10, Raymond Hettinger <raymond.hettin...@gmail.com> 
> wrote:
> 
> 
>> On Jun 18, 2016, at 2:04 PM, Obiesie ike-nwosu via Python-Dev 
>> <python-dev@python.org> wrote:
>> 
>> Hi, 
>> 
>> Could some one give a hand with explaining to me why we have a JUMP_ABSOLUTE 
>> followed by a JUMP_FORWARD op code when this function is disassembled.
>> < snipped>
>> From my understanding, once JUMP_ABSOLUTE is executed, then JUMP_FORWARD is 
>> never gotten to so must be dead code so why is it being generated?
>> Furthermore why is JUMP_ABSOLUTE rather than JUMP_FORWARD used in this 
>> particular case of nested if statements? I have tried other types of nested 
>> if statements and it has always been JUMP_FORWARD that 
>> is generated.
> 
> The AST compilation step generates code with two JUMP_FORWARDs (see below).  
> Then, the peephole optimizer recognizes a jump-to-an-unconditional-jump and 
> replaces the first one with a JUMP_ABSOLUTE to save an unnecessary step.
> 
> The reason that it uses JUMP_ABSOLUTE instead of JUMP_FORWARD is that the 
> former is more general (it can jump backwards).  Using the more general form 
> reduces the complexity of the optimizer.
> 
> The reason that the remaining jump-to-jump isn't optimized is that the 
> peepholer is intentionally kept simplistic, making only a single pass over 
> the opcodes.  That misses some optimizations but gets the most common cases.
> 
> FWIW, the jump opcodes are very fast, so missing the final jump-to-jump isn't 
> much of a loss.
> 
> If you're curious, the relevant code is in Python/compile.c and 
> Python/peephole.c.  The compile.c code generated opcodes in the most 
> straight-forward way possible and then the peephole optimizer gets some of 
> the low-hanging fruit by making a few simple transformations.
> 
> 
> Raymond
> 
> 
> ------------ AST generated code before peephole optimization -----------------
> 
> 
>  5           0 LOAD_CONST               1 (10)
>              3 LOAD_CONST               2 (11)
>              6 BUILD_TUPLE              2
>              9 UNPACK_SEQUENCE          2
>             12 STORE_FAST               0 (a)
>             15 STORE_FAST               1 (b)
> 
>  6          18 LOAD_FAST                0 (a)
>             21 LOAD_CONST               1 (10)
>             24 COMPARE_OP               5 (>=)
>             27 POP_JUMP_IF_FALSE       53
> 
>  7          30 LOAD_FAST                1 (b)
>             33 LOAD_CONST               2 (11)
>             36 COMPARE_OP               5 (>=)
>             39 POP_JUMP_IF_FALSE       50
> 
>  8          42 LOAD_CONST               3 ('hello world')
>             45 PRINT_ITEM
>             46 PRINT_NEWLINE
>             47 JUMP_FORWARD             0 (to 50)
>>>  50 JUMP_FORWARD             0 (to 53)
>>>  53 LOAD_CONST               0 (None)
>             56 RETURN_VALUE
> 

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to