Message343752
My PR 13600 works as expected.
I simplified attached continue.py: see attached traceme.py.
Output with optimizations
---
$ ./python traceme.py
6 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (a)
7 4 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 2 (3)
8 LOAD_CONST 3 (4)
10 CALL_FUNCTION 2
12 GET_ITER
>> 14 FOR_ITER 30 (to 46)
16 STORE_FAST 1 (n)
8 18 LOAD_FAST 1 (n)
20 LOAD_CONST 4 (2)
22 BINARY_MODULO
24 POP_JUMP_IF_FALSE 14
9 26 LOAD_FAST 1 (n)
28 LOAD_CONST 2 (3)
30 BINARY_MODULO
32 POP_JUMP_IF_FALSE 14
10 34 LOAD_FAST 0 (a)
36 LOAD_CONST 5 (1)
38 INPLACE_ADD
40 STORE_FAST 0 (a)
11 42 JUMP_ABSOLUTE 14
44 JUMP_ABSOLUTE 14
>> 46 LOAD_CONST 0 (None)
48 RETURN_VALUE
--- modulename: traceme, funcname: func
traceme.py(6): a = 0
traceme.py(7): for n in range(3, 4):
traceme.py(8): if n % 2:
traceme.py(9): if n % 3:
traceme.py(7): for n in range(3, 4):
---
Output without optimizations (-X noopt):
---
$ ./python -X noopt traceme.py
6 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (a)
7 4 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 2 (3)
8 LOAD_CONST 3 (4)
10 CALL_FUNCTION 2
12 GET_ITER
>> 14 FOR_ITER 30 (to 46)
16 STORE_FAST 1 (n)
8 18 LOAD_FAST 1 (n)
20 LOAD_CONST 4 (2)
22 BINARY_MODULO
24 POP_JUMP_IF_FALSE 44
9 26 LOAD_FAST 1 (n)
28 LOAD_CONST 2 (3)
30 BINARY_MODULO
32 POP_JUMP_IF_FALSE 42
10 34 LOAD_FAST 0 (a)
36 LOAD_CONST 5 (1)
38 INPLACE_ADD
40 STORE_FAST 0 (a)
11 >> 42 JUMP_ABSOLUTE 14
>> 44 JUMP_ABSOLUTE 14
>> 46 LOAD_CONST 0 (None)
48 RETURN_VALUE
--- modulename: traceme, funcname: func
traceme.py(6): a = 0
traceme.py(7): for n in range(3, 4):
traceme.py(8): if n % 2:
traceme.py(9): if n % 3:
traceme.py(11): continue
traceme.py(7): for n in range(3, 4):
---
The difference on the trace is that using -X noopt, "traceme.py(11): continue" line is traced as expected.
The difference on the bytecode is that jumps are no longer optimized using -X noopt:
* Optimized:
"32 POP_JUMP_IF_FALSE 14"
* Not optimized:
"32 POP_JUMP_IF_FALSE 42"
">> 42 JUMP_ABSOLUTE 14"
The peephole optimizer replaces a jump to an unconditional jump with a jump directly to the target of the unconditional jump.
I documented peephole optimizations in my reimplementation in pure Python:
https://bytecode.readthedocs.io/en/latest/peephole.html#optimizations
(I'm not sure that it's up to date, but it should give you an idea of which kinds of optimizations are implemented.) |
|
Date |
User |
Action |
Args |
2019-05-28 09:35:53 | vstinner | set | recipients:
+ vstinner, barry, brett.cannon, rhettinger, terry.reedy, amaury.forgeotdarc, belopolsky, ajaksu2, nedbat, eric.araujo, alex, flox, THRlWiTi, ethan.furman, tshepang, eric.snow, serhiy.storchaka, yselivanov, diana, Trip.Volpe, pgimeno, Sergey.Kirpichev, ArthurGoldberg |
2019-05-28 09:35:53 | vstinner | set | messageid: <1559036153.17.0.58711265835.issue2506@roundup.psfhosted.org> |
2019-05-28 09:35:53 | vstinner | link | issue2506 messages |
2019-05-28 09:35:52 | vstinner | create | |
|