[Patches] [ python-Patches-1346238 ] A constant folding optimization pass for the AST
SourceForge.net
noreply at sourceforge.net
Wed May 17 17:54:46 CEST 2006
Patches item #1346238, was opened at 2005-11-02 18:49
Message generated for change (Comment added) made by gbrandl
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1346238&group_id=5470
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Parser/Compiler
Group: Python 2.5
Status: Open
Resolution: None
Priority: 5
Submitted By: Rune Holm (titanstar)
Assigned to: Neal Norwitz (nnorwitz)
Summary: A constant folding optimization pass for the AST
Initial Comment:
This patch adds the following: A visitor interface
generalized from the existing ast pass code in order to
make it easy to write ast passes that only care about
specific node types. A constant folding pass that looks
for operations involving number or string literals, and
calculates these at compile time. Example code snippets
that this pass will optimize:
3 + 4 + x => 7 + x
2 ** 2 ** 2 => 16
4 and 5 and x and 6 => x and 6
4 or 5 or x => 4
4 and 5 and ~6 => -7
When combined with patch 1346214, the compiler will
also optimize statements like
if 2**2**2 - 16: expensive_computation() => nothing
The patch adds two new files: Include/optimize.h and
Python.optimize.c. This was done because I anticipate
adding more AST optimizations later using the same
visitor interface, and Python/compile.c is already very
crowded with byte code generation and bytecode
optimization. If new files aren't desired, I could
easily change the pass to add the extra code to compile.c
This patch combined with patch 1346214 passes the unit
tests on all the platforms I've tested it on, namely:
macos 10.3/ppc
linux/x86
linux/amd64
linux/ppc
linux/ia64
valgrind on linux/x86 does not reveal any additional
leaks or uninitialized accesses that aren't already in
the svn head.
----------------------------------------------------------------------
>Comment By: Georg Brandl (gbrandl)
Date: 2006-05-17 15:54
Message:
Logged In: YES
user_id=849994
Candidate for Iceland?
----------------------------------------------------------------------
Comment By: Raymond Hettinger (rhettinger)
Date: 2006-02-19 17:12
Message:
Logged In: YES
user_id=80475
I'm +1 on the idea, but won't have an opportunity to
review the patch in detail (to check for possible semantic
changes). Neal, what do you think?
----------------------------------------------------------------------
Comment By: Rune Holm (titanstar)
Date: 2006-02-19 13:35
Message:
Logged In: YES
user_id=858364
It avoids generating constant objects with sizes above 20 (in a similar fashion
as the bytecode peepholer), and checks whether the operand of unary minus
is non-zero in order to avoid changing -0.0.
As for the bytecode peephole optimizer, this AST constant folder performs
quite similar optimizations, but optimizes partially constant and/or and
comparative expressions in addition. This patch should however not be seen
as a replacement for the bytecode constant folder, but rather as a
complement. An optimizing compiler typically contains many forms of
constant folding in the different phases of compilation, since many later
optimizations benefit from constant folding (warranting early constant
folding), and some optimizations might emit code that benefit from constant
folding again (warranting late constant folding). For an example of the
former, consider the statement
if 1-1: some_code()
both passes are able to transform this into
if 0: some_code()
but since the AST constant folder is run before the dead code eliminator at
<http://python.org/sf/1346214>, these two together are able to optimize
the if statement away altogether.
Note that this patch probably won't apply cleanly anymore, since it was
written three months ago and the AST code has undergone quite a few
changes since then. But if there is interest in applying this patch, I'll gladly
update it for the current trunk.
----------------------------------------------------------------------
Comment By: Raymond Hettinger (rhettinger)
Date: 2006-02-19 10:09
Message:
Logged In: YES
user_id=80475
This should be compared to the constant folding already
added to Py2.5 via the peepholer:
dis.dis(compile('x=2+3', '', 'exec'))
Also, make sure it doesn't go over the top consuming
memory for the likes of:
'-' * 100
(None,)*2000
Both of those should not be optimized away at compile-time.
Also, be sure not optimize away -0.0. Thet is not the
same as +0.0. The distinction is important for branch
cuts in cmath.
----------------------------------------------------------------------
Comment By: Georg Brandl (birkenfeld)
Date: 2006-02-19 09:41
Message:
Logged In: YES
user_id=1188172
Neal, what do you think of this?
----------------------------------------------------------------------
Comment By: Rune Holm (titanstar)
Date: 2005-11-06 20:42
Message:
Logged In: YES
user_id=858364
Sorry, I'm new to the sourceforge patch tracker. The patch should be
attached now.
----------------------------------------------------------------------
Comment By: Simon Dahlbacka (sdahlbac)
Date: 2005-11-06 19:10
Message:
Logged In: YES
user_id=750513
the actual patch is missing...
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1346238&group_id=5470
More information about the Patches
mailing list