1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-24 13:30:21 +02:00
guile/module
Andy Wingo 751708726b peval: visit operands on-demand, to inline mutually recursive bindings
This commit changes to use <operand> structures to hold the context
needed to visit lexical bindings lazily, in context, instead of eagerly
visiting them for value.  This laziness enables inlining of mutually
recursive bindings.

* module/language/tree-il/peval.scm (<var>): Remove comment about copy
  propagation having to run build-var-table; things don't work like that
  any more.
  (build-var-table): Build <var> entries for all variables, even
  unreferenced variables.
  (alpha-rename): Remove.  We will rename bindings on-demand now.

  (peval lookup-var): New helper, to fetch the <var> of a gensym.

  (peval fresh-gensyms): Fold here, under peval, and in it, handle
  updating the store to record a mapping between new names and <var>
  entries from the source program.

  (peval record-source-expression): Don't call build-var-table on the
  new expression, as alpha-renaming happens on-demand now.

  (peval prune-bindings): Rewrite to work with mutually-recursive
  bindings, while optionally preserving binding order.

  (peval extend-env): New helper.

  (peval loop): OK, here goes... Remove the `operand' context, as now we
  visit operands lazily.  Add a `call' context, which does not
  copy-propagate lambda expressions, used to residualize a call after
  aborting an inlining attempt.  Change the `env' to be a mapping of
  gensym to <operand>.  Instead of looking up the operand's binding then
  alpha-renaming it, just rely on the fact that visiting the operand
  will rename it if necessary.

  If we residualize a lexical, do so with the fresh name from the
  environment.  If we visit an operand and it doesn't turn out to be
  constant, we will never be able to copy it, and so cache that fact in
  the operand.  If we residualize a binding and we know what the value
  should be, record that binding so that prune-bindings won't have to
  visit it again.  If the operand folds to a constant, cache that too,
  to save effort when unrolling loops.

  For let, letrec, fix, and lambda-case, instead of visiting the
  bindings eagerly for value, simply record the source expressions and
  environments in an <operand> and rely on copy-propagation to visit
  them later in the right context.  In the case of letrec and fix, this
  allows mutually-recursive bindings to be inlined.

  Refactor folding of "constructors" (which still need renaming) to
  avoid visiting operands twice in some contexts.

  For applications, if we have to abort, process the procedure in call
  context, which allows some folding but avoids copying lambdas.  If we
  find a recursive procedure, mark intervening counters as recursive
  too, to allow for mutual recursion at the top level.

  For lambdas, if we are processing for value, record the source
  expression so we can detect recursion.  This was previously done in
  the lexical-ref copy propagator.

* test-suite/tests/tree-il.test ("partial evaluation"): Remove unused
  recursive lexicals in a couple of cases.  Add a couple test cases for
  pruning.  Add a few recursive binding cases.
2011-10-10 13:23:32 +02:00
..
ice-9 Add link to the (ice-9 match) bug. 2011-09-30 15:16:02 +02:00
language peval: visit operands on-demand, to inline mutually recursive bindings 2011-10-10 13:23:32 +02:00
oop fix some cache consistency issues with goops and extended generics 2011-09-02 13:17:19 +02:00
rnrs fix r6rs `map' 2011-08-17 23:24:20 +02:00
scripts better guild help FOO 2011-08-19 12:32:01 +02:00
srfi fix srfi-67 compilation 2011-09-02 19:49:26 +02:00
sxml more define-syntax-rule usage 2011-09-02 11:36:14 +02:00
system more define-syntax-rule usage 2011-09-02 11:36:14 +02:00
texinfo module-stexi-documentation #:docs-resolver keyword arg 2011-08-23 18:00:02 +02:00
web RFC 822 allows single digit days of the month 2011-09-10 11:12:04 -07:00
Makefile.am add tree-il verifier 2011-10-07 11:05:43 +02:00
rnrs.scm Enhance transcoder-related functionality of `(rnrs io ports)' 2011-03-13 23:14:43 +01:00
statprof.scm add gcprof 2011-05-05 11:43:12 +02:00
texinfo.scm more define-syntax-rule usage 2011-09-02 11:36:14 +02:00