[Python-Dev] AST Optimization: Branch Elimination in Generator Functions

Jeremy Hylton jeremy at alum.mit.edu
Tue May 6 17:41:09 CEST 2008


I'm not sure I understand the problem exactly.  If we have one pass
converting the concrete syntax to the AST, we can mark functions as
generators as part of that pass.  In a later pass, you can remove the
unreachable code.

Jeremy

On Sat, May 3, 2008 at 12:51 AM, Thomas Lee <tom at vector-seven.com> wrote:
> The next problem that cropped up during the implementation of the AST code
> optimizer is related to branch elimination and the elimination of any code
> after a return.
>
>  Within a FunctionDef node, we would (ideally) like to blow away If nodes
> with a constant - but false - test expression. e.g.:
>
>  def foo():
>  if False:
>   # ... stuff ...
>
>  For most functions, this will cause no problems and the code will behave as
> expected. However, if the eliminated branch contains a "yield" expression,
> the function is actually a generator function - even if the yield expression
> can never be reached:
>
>  def foo():
>  if False:
>   yield 5
>
>  In addition to this, the following should also be treated as a generator
> even though we'd like to be able to get rid of all the code following the
> "return" statement:
>
>  def foo():
>  return
>  yield 5
>
>  Again, blowing away the yield results in a normal function instead of a
> generator. Not what we want: we need to preserve the generator semantics.
>
>  Upon revisiting this, it's actually made me reconsider the use of a Const
> node for the earlier problem relating to arbitrary constants. We may be
> better off with annotations after all ... then we could mark FunctionDef
> nodes as being generators at the AST level to force the compiler to produce
> code for a generator, but eliminate the branches anyway.
>
>  The other alternative I can think of is injecting a yield node somewhere
> unreachable and ensuring it doesn't get optimized away, but this seems
> pretty hacky in comparison.
>
>  Any other ideas?
>
>  Cheers,
>  Tom
>  _______________________________________________
>  Python-Dev mailing list
>  Python-Dev at python.org
>  http://mail.python.org/mailman/listinfo/python-dev
>  Unsubscribe:
> http://mail.python.org/mailman/options/python-dev/jeremy%40alum.mit.edu
>


More information about the Python-Dev mailing list