New submission from Pablo Galindo Salgado <pablog...@gmail.com>:
The peephole optimizer currently does not optimize the result of its own optimization when its possible. For example, consider the following code: if a: if b: if (c or d): foo() else: bar() else: baz() The bytecode for this is: 2 0 LOAD_GLOBAL 0 (a) 2 POP_JUMP_IF_FALSE 32 4 4 LOAD_GLOBAL 1 (b) 6 POP_JUMP_IF_FALSE 24 5 8 LOAD_GLOBAL 2 (c) 10 POP_JUMP_IF_TRUE 16 6 12 LOAD_GLOBAL 3 (d) 14 POP_JUMP_IF_FALSE 30 7 >> 16 LOAD_GLOBAL 4 (foo) 18 CALL_FUNCTION 0 20 POP_TOP 22 JUMP_ABSOLUTE 38 9 >> 24 LOAD_GLOBAL 5 (bar) 26 CALL_FUNCTION 0 28 POP_TOP >> 30 JUMP_FORWARD 6 (to 38) 11 >> 32 LOAD_GLOBAL 6 (baz) 34 CALL_FUNCTION 0 36 POP_TOP >> 38 LOAD_CONST 0 (None) 40 RETURN_VALUE Notice that the 14 POP_JUMP_IF_FALSE 30 jumps to another jump (30 JUMP_FORWARD 6 (to 38)). If we repeat the optimizations until the resulting bytecode does not change more we get: 2 0 LOAD_GLOBAL 0 (a) 2 POP_JUMP_IF_FALSE 32 4 4 LOAD_GLOBAL 1 (b) 6 POP_JUMP_IF_FALSE 24 5 8 LOAD_GLOBAL 2 (c) 10 POP_JUMP_IF_TRUE 16 6 12 LOAD_GLOBAL 3 (d) 5 14 POP_JUMP_IF_FALSE 38 7 >> 16 LOAD_GLOBAL 4 (foo) 18 CALL_FUNCTION 0 20 POP_TOP 22 JUMP_ABSOLUTE 38 9 >> 24 LOAD_GLOBAL 5 (bar) 26 CALL_FUNCTION 0 28 POP_TOP 30 JUMP_FORWARD 6 (to 38) 11 >> 32 LOAD_GLOBAL 6 (baz) 34 CALL_FUNCTION 0 36 POP_TOP >> 38 LOAD_CONST Notice that in this example the original instruction now is (14 POP_JUMP_IF_FALSE 38). ---------- components: Interpreter Core messages: 345543 nosy: pablogsal priority: normal severity: normal status: open title: Make multiple passes of the peephole optimizer until bytecode cannot be optimized further versions: Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue37271> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com