1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-04 05:50:26 +02:00
Commit graph

1799 commits

Author SHA1 Message Date
Andy Wingo
33e9a90d7b Always resolve-primitives in the root module.
* module/language/tree-il/primitives.scm (resolve-primitives): If we are
  compiling in the root module, ignore local definitions.
2013-10-23 19:28:26 +02:00
Andy Wingo
be0a8bb4f0 CPS conversion doesn't automatically produce $values
* module/language/tree-il/compile-cps.scm (convert): Don't convert
  values primcalls to $values, because we don't know that the
  continuation can accept that number of values.
2013-10-22 22:30:54 +02:00
Andy Wingo
8b2a96d044 Contify returns via calls to "values"
* module/language/cps/contification.scm: Returns from contified
  functions should primcall to 'values, as in general the return
  continuation is a multiple value context ($ktrunc or $ktail).  A later
  pass can elide the primcall if appropriate.
2013-10-22 22:29:56 +02:00
Andy Wingo
5db3e6bce4 CPS->RTL compiler: add push-fluid and pop-fluid
* module/language/cps/compile-rtl.scm (emit-rtl-sequence): Add cases for
  push-fluid and pop-fluid.
2013-10-21 22:25:27 +02:00
Andy Wingo
1e6aee3bf9 DFG: Remove lift-definition!
* module/language/cps/dfg.scm: Remove lift-definition!.
2013-10-21 22:24:54 +02:00
Andy Wingo
0620d6b4d2 Fix contification bugs
* module/language/cps/contification.scm (compute-contification): Rewrite
  to avoid mutating the DFG and the function while we are rewriting.
  Instead we compute a contification, and if it is not empty, we apply
  it and loop.
2013-10-21 22:24:18 +02:00
Andy Wingo
e92e0bbe9c More robust contification
* module/language/cps/contification.scm (contify): It could be that
  visiting pending contifications could enqueue more contifications, so
  iterate to a fixed point.  Signal an error if there are any pending
  contifications at the end of an iteration.
2013-10-21 16:59:42 +02:00
Andy Wingo
c8ad7426e2 add lookup-block-scope
* module/language/cps/dfg.scm (lookup-block-scope): New interface.
  (visit-fun): Give a bit more info if link-blocks! fails.
2013-10-21 16:32:36 +02:00
Andy Wingo
bc01d8f7e0 DFG fixup.
* module/language/cps/dfg.scm: Remove dead-after-def? and
  dead-after-use? export.
2013-10-21 16:31:49 +02:00
Andy Wingo
e636f424b9 RTL slot allocator uses more precise, correct liveness information
* module/language/cps/dfg.scm (control-point?): New interface, replaces
  branch?.
  (dead-after-def?, dead-after-use?, dead-after-branch?): Remove these.
  The first one was fine; dead-after-use? was conservative but OK; but
  dead-after-branch? was totally bogus.  Instead we use precise liveness
  information in the allocator.

* module/language/cps/slot-allocation.scm ($allocation): Remove "def"
  and "dead" slots.  We'll communicate liveness information in some
  other way to the compiler.
  (allocate-slots): Rework to use precise liveness information.
2013-10-21 15:45:19 +02:00
Andy Wingo
db11440d38 DFG: Add code to compute live variable sets.
* module/language/cps/dfg.scm (compute-live-variables)
  (compute-maximum-fixed-point, print-dfa): New code to compute live
  variable sets.
2013-10-21 13:50:48 +02:00
Andy Wingo
fc95a944d3 DFG: Use maps have variable names
* module/language/cps/dfg.scm ($use-map): Add variable names to the use
  maps.
  (visit-fun, lookup-def, lookup-uses, constant-needs-allocation?)
  (variable-free-in?, dead-after-def?, dead-after-use?)
  (dead-after-branch?): Adapt to use-map change.
2013-10-21 11:51:11 +02:00
Andy Wingo
8bd261baaa (language tree-il analyze) works better with RTL programs
* module/system/vm/program.scm (program-arguments-alists): Export this
  interface.  Fall back to grovelling through procedure-minimum-arity if
  the program has no arities, as might be the case for continuations.

* module/language/tree-il/analyze.scm (validate-arity): Use
  program-arguments-alists instead of the program-arities interface, to
  cover both stack VM and RTL programs.
2013-10-18 18:41:59 +02:00
Andy Wingo
5bd4b6585b Reify call-thunk/no-inline.
* module/language/cps/reify-primitives.scm (reify-primitives): Remove
  call-thunk/no-inline in this late phase.
2013-10-14 16:43:42 +02:00
Andy Wingo
8d59d55e86 RTL: Compile prompts
* libguile/vm-engine.c (prompt): Adapt to explicitly set the saved SP so
  we know how many incoming values the handler will receive, and to make
  escape-only? a flag.

* module/language/cps/compile-rtl.scm (emit-rtl-sequence): $prompt
  should only be found in a "seq" context, as it just pushes on a prompt
  and doesn't bind any values.  On the other hand it should emit
  appropriate code for the handler to bind its values, so do that.

* module/language/cps/slot-allocation.scm ($cont-allocation): Add a note
  that proc-slot is used by prompts as well.
  (allocate-slots): Compute the allocation of a prompt handler's args.

* module/language/tree-il/compile-cps.scm (convert): Use "unwind"
  instead of the nonexistent "pop-prompt".

* module/system/vm/disassembler.scm (code-annotation): Adapt to change
  in prompt VM op.
2013-10-14 16:13:57 +02:00
Andy Wingo
82f4bac420 RTL VM: receive-values has allow-extra? flag
* libguile/vm-engine.c (receive-values): Add an ALLOW-EXTRA? flag in
  unused bits of the third word.  Without it, receive-values will check
  for the exact number of incoming values.

* libguile/vm.c (vm_error_wrong_number_of_values): New error case.

* module/language/cps/compile-rtl.scm (emit-rtl-sequence): Adapt to add
  the ALLOW-EXTRA? flag.
2013-10-14 16:09:43 +02:00
Andy Wingo
b7f10defe6 call-with-prompt always compiles to CPS $prompt
* module/language/tree-il/compile-cps.scm (convert): For prompts without
  inline handlers, eta-convert the handler.
2013-10-14 12:20:58 +02:00
Andy Wingo
649f6043de More precise dead-after-use? for loop variables
* module/language/cps/dfg.scm (dead-after-use?):
  (dead-after-branch?): A symbol defined in the header block of a loop
  is still within the same loop.
2013-10-12 16:36:28 +02:00
Andy Wingo
b8da548fba RTL slot allocation: Don't kill variables that flow into loops
* module/language/cps/dfg.scm (dead-after-use?): Don't kill a variable
  if it was defined outside the current loop.
  (dead-after-branch?): Likewise, but I don't think this helper is
  correct yet :/
2013-10-12 16:22:45 +02:00
Andy Wingo
0e2446d4db Compute post-dominators
* module/language/cps/dfg.scm ($block): Add pdom and pdom-level fields,
  for post-dominators.
  (reverse-post-order, convert-predecessors): Arrange to work either
  way: for dominators or for post-dominators.
  (analyze-control-flow!): Compute post-dominators.
  (dominates?): Refactor.
  (post-dominates?): New helper.
2013-10-12 16:11:36 +02:00
Andy Wingo
96b8027cc4 Identify loops
* module/language/cps/dfg.scm (compute-dom-edges)
  (compute-join-edges, compute-reducible-back-edges)
  (compute-irreducible-dom-levels, compute-nodes-by-level)
  (mark-loop-body, mark-irreducible-loops, identify-loops): Identify
  loops.  Irreducible loops are TODO.

* test-suite/tests/rtl-compilation.test ("contification"): Add an
  irreducible loop test.
2013-10-12 15:19:20 +02:00
Andy Wingo
366eb4d764 DFG refactorings
* module/language/cps/dfg.scm ($block): Add "irreducible" field, format
  TBD.
  (reverse-post-order): Return a vector directly.
  (convert-predecessors, compute-dom-levels, compute-idoms):
  (analyze-control-flow!): Factor out control flow analsysis a bit
  better.
  (identify-loops): New helper.  Currently a NOP.
  (visit-fun): Adapt to compute-dominator-tree rename to
  analyze-control-flow!.
2013-10-12 15:19:16 +02:00
Andy Wingo
238ef4cf44 Replace conservatively-dominates? with a precise dominator lookup
* module/language/cps/dfg.scm (dominates?): Use the dominator tree
  instead of the scope tree.
2013-10-11 14:10:19 +02:00
Andy Wingo
3aee6cfdd7 Compute a dominator tree
* module/language/cps/dfg.scm (reverse-post-order, for-each/enumerate)
  (convert-predecessors, finish-idoms, compute-dominator-tree): Compute
  a dominator tree.  We don't use it yet.
2013-10-11 13:35:43 +02:00
Andy Wingo
f22979db66 DFG refactor to allow dominator tree construction
* module/language/cps/dfg.scm: Refactor so that we can think about
  building a dominator tree.  Split continuations out of use maps and
  put them in a separate table, which will have more flow information.
  (visit-fun): Mark clauses as using their bodies.
  (lookup-predecessors, lookup-successors): New exports.
  (find-defining-expression): Add an exception for clauses, now that
  clauses are in the flow graph.
  (continuation-bound-in?): Rename from variable-bound-in?, as it can
  currently only be used for continuations.

* module/language/cps/contification.scm (contify): Adapt to use
  lookup-predecessors and continuation-bound-in?.
2013-10-10 12:42:50 +02:00
Andy Wingo
4a6d351979 Fix peval bug with inlining and optional argument initializers
* module/language/tree-il/peval.scm (peval): Fix a bug whereby inlined
  function applications with default argument initializers were putting
  the initializers in the wrong scope.

* test-suite/tests/peval.test ("partial evaluation"): Add a test.
2013-10-10 11:19:19 +02:00
Andy Wingo
61c7264fcc Fix slot allocation bug
* module/language/cps/slot-allocation.scm (allocate-slots): Fix
  dead-after-use computation to use the expression's label and not its
  continuation.
2013-10-05 15:57:54 +02:00
Andy Wingo
fea115c33f Fix nested contification bugs
* module/language/cps/contification.scm (contify): Exhaustively replace
  contified tail continuations, to fix a bug in nested tail-recursive
  contifications.  Likewise, call lookup-return-cont when searching for
  common return continuations.
2013-10-04 18:03:29 +02:00
Andy Wingo
c648869346 Fix variable-bound-in?
* module/language/cps/dfg.scm (variable-bound-in?): Fix to look up
  correct variable.
2013-10-04 17:30:59 +02:00
Andy Wingo
25833e807d Fix verify-cps
* module/language/cps/verify.scm (verify-cps): Fix visiting functions.
2013-10-04 16:36:17 +02:00
Andy Wingo
7ea00e230a Contify functions in the scope of their continuation.
* module/language/cps/contification.scm (contify): Fix to contify
  functions in the scope of their continuation.
2013-10-04 14:08:52 +02:00
Andy Wingo
d51fb1e67b dfg: variable-free-in?, add variable-bound-in?
* module/language/cps/dfg.scm (variable-free-in?): Rename from
  variable-used-in?, to match CWCC language.
  (variable-bound-in?): New interface.

* module/language/cps/contification.scm (contify): Adapt caller.  Add
  more comments.
2013-10-04 14:07:36 +02:00
Andy Wingo
e675e9bd39 Add new "source" macro instruction; compile-rtl emits it.
* module/system/vm/assembler.scm (<asm>): Add "sources" field.
  (make-assembler): Adapt to make-asm change.
  (source): New macro assembler.

* module/language/cps/compile-rtl.scm (emit-rtl-sequence):
  (compile-fun): Emit source instructions as appropriate.
2013-09-30 21:48:07 +02:00
Andy Wingo
8ac8e2dfeb Add contification pass
* module/Makefile.am:
* module/language/cps/contification.scm: New pass.

* module/language/cps/compile-rtl.scm (optimize): Wire it into the
  compiler.
2013-08-31 09:40:56 +02:00
Andy Wingo
6e8ad82335 Add CPS -> RTL compiler
* module/Makefile.am:
* module/language/cps/compile-rtl.scm:
* module/language/cps/dfg.scm:
* module/language/cps/slot-allocation.scm: New modules.

* module/language/cps/spec.scm: Register the compiler.

* test-suite/Makefile.am:
* test-suite/tests/rtl-compilation.test: Add tests.
2013-08-31 09:40:56 +02:00
Andy Wingo
934e6b9515 Add pass to reify primcalls without corresponding VM ops
* module/Makefile.am:
* module/language/cps/reify-primitives.scm: New pass.
2013-08-31 09:40:56 +02:00
Andy Wingo
026b561154 Add arity-adapting module
* module/Makefile.am:
* module/language/cps/arities.scm: New module.  Adapts call and return
  arities, especially for primcalls.
2013-08-31 09:40:56 +02:00
Andy Wingo
045392f1b2 Add CPS primitives info module
* module/Makefile.am:
* module/language/cps/primitives.scm: New file.
2013-08-31 09:40:56 +02:00
Andy Wingo
43f768f48d RTL language
* module/Makefile.am
 * module/language/rtl.scm:
 * module/language/rtl/spec.scm: Add a stub RTL language.
2013-08-31 09:40:56 +02:00
Andy Wingo
4b8de65e9d Add closure conversion
* module/Makefile.am
* module/language/cps/closure-conversion.scm: New module, implementing a
  closure conversion pass.
2013-08-31 09:40:56 +02:00
Andy Wingo
4fefc3a867 (compile foo #:to 'cps)
* module/language/tree-il/compile-cps.scm: New module implementing CPS
  conversion of Tree-IL.

* module/Makefile.am:
* module/language/tree-il/spec.scm:
* module/language/cps/spec.scm: Integrate CPS in the build and language
  system.
2013-08-31 09:40:56 +02:00
Andy Wingo
80b01fd086 Add CPS language
* module/Makefile.am:
* module/language/cps.scm:
* module/language/cps/verify.scm: Add CPS language.

* .dir-locals.el: Add indentation rules for some CPS forms.
2013-08-31 09:40:56 +02:00
Andy Wingo
72bb47ae4c compile-file adds #:to-disk? #t to opts
* module/system/base/compile.scm (compile-file): Pass #:to-disk? as an
  option to indicate that the result will be being loaded from disk.
  Perhaps a linker might want to page-align in that case.

* module/language/elisp/compile-tree-il.scm (process-options!): Accept
  and ignore the #:to-file compiler option.
2013-08-24 15:27:57 +02:00
Mark H Weaver
62d3430cb6 Convert branchable primitives into binary operations only.
* module/language/tree-il/primitives.scm (maybe-simplify-to-eq): Wrap
  within another lambda, binding the primitive name.  If there are less
  than two arguments, expand to constant #t.  If there are more than two
  arguments, convert into a conjunction of binary applications.
  (expand-chained-comparisons): New procedure.
  (*primitive-expand-table*): Add entries for (< <= = >= > eq?).
2013-08-24 15:18:32 +02:00
Mark H Weaver
79a6c3be6a Merge remote-tracking branch 'origin/stable-2.0' 2013-08-12 21:36:45 -04:00
Mark H Weaver
71673fba93 Common numeric operations are left-to-right associative.
* module/language/tree-il/primitives.scm (define-primitive-expander):
  Use 'match-lambda*' instead of 'case-lambda' for pattern matching.
  (*primitive-expand-table*): In primitive expanders for '+', '*', '-',
  '/', 'logior', and 'logand', assume conventional left-to-right
  associativity.
2013-08-12 20:03:41 -04:00
Mark H Weaver
73b98028f0 Numerical comparisons are not negatable.
* module/language/tree-il/primitives.scm (*negatable-primitives*):
  Remove (< <= > >=) from the list of negatable primitives.
2013-08-12 18:08:59 -04:00
Mark H Weaver
1160e2d94e Merge remote-tracking branch 'origin/stable-2.0' 2013-08-11 22:46:22 -04:00
Mark H Weaver
1e5c32054e Adapt ecmascript compiler to tree-il prompt changes, again.
* module/language/ecmascript/compile-tree-il.scm (with-return-prompt):
  The body of an escape-only prompt is no longer a thunk.  Adapt.
2013-08-11 17:18:09 -04:00
Andy Wingo
99983d544a Inline escape-only prompt bodies in the Tree-IL
* module/language/scheme/decompile-tree-il.scm (do-decompile):
* module/language/tree-il/analyze.scm (analyze-lexicals):
* module/language/tree-il/canonicalize.scm (canonicalize):
* module/language/tree-il/compile-glil.scm (flatten-lambda-case):
* module/language/tree-il/cse.scm (cse):
* module/language/tree-il/peval.scm (peval):
* test-suite/tests/peval.test ("partial evaluation"):  Partially revert
  178a40928, so that escape-only prompts explicitly inline their bodies.
2013-08-11 16:45:31 +02:00