1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-07-05 01:00:21 +02:00
Commit graph

375 commits

Author SHA1 Message Date
Andy Wingo
b1ac8d68b5 bv-{f32,f64}-{ref,set!} operate on raw f64 values
* module/language/tree-il/compile-cps.scm (convert): Box results of
  bv-f32-ref and bv-f64-ref.  Unbox the argument to bv-f32-set! and
  bv-f64-set!.

* libguile/vm-engine.c (bv-f32-ref, bv-f64-ref): Results are raw.
  (bv-f32-set!, bv-f64-set!): Take unboxed arguments.

* module/system/vm/assembler.scm (emit-scm->f64, emit-f64->scm):
  Export.

* module/language/cps/compile-bytecode.scm (compile-function):
* module/language/cps/effects-analysis.scm: Add support for scm->f64 and
  f64->scm.

* module/language/cps/slot-allocation.scm (compute-var-representations):
  Add cases for primops returning raw values.

* module/language/cps/types.scm (bv-f32-ref, bv-f32-set!)
  (bv-f64-ref, bv-f64-set!): Deal in &f64 values instead of reals.
2015-11-11 10:20:12 +01:00
Andy Wingo
608753982f Type inference distinguishes between untagged and tagged flonums
* module/language/cps/types.scm (&f64): New type, for untagged f64
  values.  Having a distinct type prevents type folding from replacing
  an untagged 3.0 with a tagged 3.0.
  (scm->f64, f64->scm): Support these new primcalls.
2015-11-11 10:14:51 +01:00
Andy Wingo
e3cc0eeb3a Reflection support for unboxed f64 slots
* module/system/vm/assembler.scm (emit-definition): Add representation
  field.
  (write-arities): Emit representations into the arities section.

* module/system/vm/debug.scm (arity-definitions): Read representations.

* module/system/vm/frame.scm (<binding>): Add representation field and
  binding-representation getter.
  (available-bindings): Pass representation to make-binding.
  (frame-binding-set!, frame-binding-ref, frame-call-representation):
  Pass representation to frame-local-ref / frame-local-set!.

* test-suite/tests/rtl.test: Update definition instructions.

* module/language/cps/slot-allocation.scm ($allocation): Add
  representations field.
  (lookup-representation): New public function.
  (allocate-slots): Pass representations to make-$allocation.

* module/language/cps/compile-bytecode.scm (compile-function): Adapt to
  emit-definition change.

* libguile/frames.h:
* libguile/frames.c (scm_frame_local_ref, scm_frame_local_set_x): Take
  representation argument.
  (scm_to_stack_item_representation): New internal helper.
2015-10-28 17:43:55 +00:00
Andy Wingo
e7660a607c VM support for raw slots
* libguile/loader.c (scm_find_slot_map_unlocked): Rename from
  scm_find_dead_slot_map_unlocked.

* libguile/vm.c (struct slot_map_cache_entry, struct slot_map_cache)
  (find_slot_map): Rename, changing "dead_slot" to "slot".
  (enum slot_desc): New type.
  (scm_i_vm_mark_stack): Interpret slot maps as having two bits per
  slot, allowing us to indicate that a slot is live but not a pointer.

* module/language/cps/compile-bytecode.scm (compile-function): Adapt to
  emit-slot-map name change.

* module/system/vm/assembler.scm (<asm>): Rename dead-slot-maps field to
  slot-maps.
  (emit-slot-map): Rename from emit-dead-slot-map.
  (link-frame-maps): 2 bits per slot.

* module/language/cps/slot-allocation.scm (lookup-slot-map): Rename from
  lookup-dead-slot-map.
  (compute-var-representations): New function.
  (allocate-slots): Adapt to encode two-bit slot representations.
2015-10-28 16:40:53 +00:00
Andy Wingo
dd77a818ba Treat tail $values as generating lazy allocations
* module/language/cps/slot-allocation.scm (compute-lazy-vars): Returning
  values in tail position also generates lazy vars.
2015-10-28 13:33:37 +00:00
Andy Wingo
696339a603 Always emit return-values
* module/language/cps/compile-bytecode.scm (compile-function): Remove
  special cases for nullary and unary returns; instead always use
  return-values and rely on hinting to try to place values in the right
  slot already.

* module/system/vm/assembler.scm (emit-init-constants): Use
  return-values.

* module/system/vm/disassembler.scm (code-annotation): Add annotation
  for return-values.
2015-10-28 11:32:15 +00:00
Andy Wingo
2f08838cd6 Replace return primcalls with $values
* module/language/cps/compile-bytecode.scm:
* module/language/cps/contification.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/type-fold.scm:
* module/language/cps/verify.scm:
* module/language/tree-il/compile-cps.scm: Never generate a return
  primcall.  Instead use $values.
2015-10-28 11:11:23 +00:00
Andy Wingo
7c9e477b82 Don't emit redundant reset-frame before return
* module/language/cps/compile-bytecode.scm (compile-function): Don't
  emit reset-frame before return-values.
2015-10-28 11:00:05 +00:00
Andy Wingo
7aee3c74f5 return-values opcode resets the frame
* libguile/vm-engine.c (return-values): Change to also reset the frame,
  if nlocals is nonzero.

* doc/ref/vm.texi (Procedure Call and Return Instructions): Updated
  docs.

* module/language/cps/compile-bytecode.scm (compile-function): Adapt to
  call emit-return-values with the right number of arguments.
2015-10-28 10:47:18 +00:00
Andy Wingo
34f3fb78e0 Fix slot-allocation to make 'return' not need to alloc-frame
* module/language/cps/slot-allocation.scm (compute-frame-sizes): Ensure
  that frames with `return' have space to shuffle the arg into return
  position.
2015-10-28 10:14:30 +00:00
Andy Wingo
3f345f564f Run CSE to clean up after closure conversion
* module/language/cps/optimize.scm: Enable CSE over first-order CPS.
2015-10-28 10:07:38 +00:00
Andy Wingo
04356dabb9 CSE can run on first-order CPS
* module/language/cps/cse.scm (compute-truthy-expressions):
  (compute-equivalent-subexpressions):
  (eliminate-common-subexpressions): Refactor to be able to work on
  first-order CPS.
2015-10-28 09:13:20 +00:00
Andy Wingo
8d79dfddb6 Revert "Bootstrap build doesn't have to expand CPS optimizations"
This reverts commit ce36fb16ff.
2015-10-28 09:12:02 +00:00
Andy Wingo
ce36fb16ff Bootstrap build doesn't have to expand CPS optimizations
* module/language/cps/optimize.scm (define-optimizer)
  (optimize-higher-order-cps, optimize-first-order-cps): Obfuscate a bit
  so that the bootstrap build won't have to expand optimization passes.
  Might marginally speed up the bootstrap process.
2015-10-28 09:10:37 +00:00
Andy Wingo
f169be9fc8 Wire up `guild compile -O0 foo.scm'
* module/scripts/compile.scm (%options): Resurrect -O option and make it
  follow GCC, more or less.  The default is equivalent to -O2.

* module/language/cps/compile-bytecode.scm (lower-cps):
* module/language/cps/optimize.scm (optimize-higher-order-cps): Move
  split-rec to run unconditionally for now, as closure conversion fails
  without it.
  (define-optimizer): Only verify the result if we are debugging, to
  save time.
  (cps-default-optimization-options): New exported procedure.

* module/language/tree-il/optimize.scm
  (tree-il-default-optimization-options): New exported procedure.
2015-10-22 17:44:17 +00:00
Andy Wingo
70c317ab51 SP-relative local addressing
* libguile/vm-engine.c: S24/S12/S8 operands addressed relative to the
  SP, not the FP.  Cache the SP instead of a FP-relative locals
  pointer.  Further cleanups to follow.

* libguile/vm.c (vm_builtin_call_with_values_code): Adapt to mov operand
  addresing change.

* module/language/cps/compile-bytecode.scm (compile-function): Reify
  SP-relative local indexes where appropriate.

* module/system/vm/assembler.scm (emit-fmov*): New helper, exported as
  emit-fmov.
  (shuffling-assembler, define-shuffling-assembler): Rewrite to shuffle
  via push/pop/drop.
  (standard-prelude, opt-prelude, kw-prelude): No need to provide for
  shuffling args.

* test-suite/tests/rtl.test: Update.

* module/language/cps/slot-allocation.scm: Don't reserve slots 253-255.
2015-10-21 11:49:20 +02:00
Andy Wingo
d7199da8c9 Fix prompt miscompilation
* module/language/cps/compile-bytecode.scm (compile-function): Fix
  miscompilation when the handler body is forwarded.
2015-10-21 11:49:20 +02:00
Andy Wingo
48412395c6 Add closure effects
* module/language/cps/effects-analysis.scm: Add closure effects, to
  enable hoisting/CSE of free-ref/free-set!.
2015-07-27 15:19:45 +02:00
Andy Wingo
90c11483e6 Better codegen for $values terms that don't shuffle
* module/language/cps/compile-bytecode.scm (compute-forwarding-labels):
  Analyze forwarding labels before emitting code.  This lets us elide
  conts that cause no shuffles, allowing more fallthrough.
2015-07-27 14:53:59 +02:00
Andy Wingo
3b60e79879 Loop peeling
* module/language/cps/peel-loops.scm: New pass.  Only enabled if the
  loop has one successor.

* module/language/cps/optimize.scm: Peel instead of doing LICM on
  higher-order CPS, then LICM on first-order CPS.

* module/Makefile.am: Wire up new pass.
2015-07-27 13:45:23 +02:00
Andy Wingo
4792577ab8 solve-flow-equations tweak
* module/language/cps/utils.scm (solve-flow-equations): Revert to take
  separate in and out maps.  Take an optional initial worklist.

* module/language/cps/slot-allocation.scm: Adapt to solve-flow-equations
  change.
2015-07-27 13:25:38 +02:00
Andy Wingo
ce2888701c Simplify rotate-loops.scm
* module/language/cps/rotate-loops.scm: Clean up unused code.
2015-07-27 12:59:09 +02:00
Andy Wingo
e54fbff185 Loop inversion with multiple exits
* module/language/cps/rotate-loops.scm (rotate-loop): Instead of
  restricting rotation to loops with just one exit node, restrict to
  loops with just one exit successor.
2015-07-25 11:03:59 +02:00
Andy Wingo
ee85e2969f Rotate comparisons down to loop back-edges
* module/language/cps/rotate-loops.scm: New pass.
* module/Makefile.am:
* module/language/cps/optimize.scm: Wire up the new pass.
2015-07-24 16:51:04 +02:00
Andy Wingo
bf6930b3f6 Eliminate trampoline gotos when possible in compile-bytecode
* module/language/cps/compile-bytecode.scm (compile-function): Eliminate
  trampoline jumps for conditional branches that don't shuffle.
2015-07-24 16:51:04 +02:00
Andy Wingo
bcfa9fe70e Small expression-effects tweak
* module/language/cps/effects-analysis.scm (expression-effects):
  Closures with zero free vars don't allocate.
2015-07-24 16:51:04 +02:00
Andy Wingo
ec9554d138 Loop-invariant code motion
* module/language/cps/licm.scm: New pass.
* module/language/cps/optimize.scm: Wire up new pass.
* module/Makefile.am: Add new file.
2015-07-24 16:50:58 +02:00
Andy Wingo
bebc70c8b1 Move solve-flow-equations to utils
* module/language/cps/slot-allocation.scm (compute-lazy-vars):
  (compute-live-variables):  Adapt to solve-flow-equations interface
  change.

* module/language/cps/utils.scm (solve-flow-equations): Move here.  Use
  an init value instead of an init map.
2015-07-24 11:40:00 +02:00
Andy Wingo
b40fac1e98 Factor out compute-effects/elide-type-checks from dce.scm
* module/language/cps/type-checks.scm: New module.
* module/language/cps/dce.scm: Use new module.
* module/Makefile.am: Add new module.
2015-07-24 11:39:18 +02:00
Andy Wingo
4aabc205cc Add missing files
Last commit meant to rename files, not delete them.  Whoops!
2015-07-22 18:27:37 +02:00
Andy Wingo
0d4c937722 Remove CPS1 language
* module/language/cps.scm:
* module/language/cps/compile-bytecode.scm:
* module/language/cps/dfg.scm:
* module/language/cps/renumber.scm:
* module/language/cps/slot-allocation.scm:
* module/language/cps/spec.scm:
* module/language/cps/verify.scm:
* module/language/cps2/compile-cps.scm: Delete.
* module/Makefile.am: Remove deleted files.
2015-07-22 17:15:06 +02:00
Andy Wingo
2df454b95b intset-intersect bugfix
* module/language/cps/intset.scm (intset-intersect): Remove new-leaf
  procedure, inlining to single call site.  An empty intersection
  properly produces #f so that the set can be pruned.
2015-07-22 16:59:47 +02:00
Andy Wingo
f63b2e4814 More slot-allocation simplification
* module/language/cps/slot-allocation.scm (allocate-slots): Remove
  unreachable clause.
2015-07-20 10:57:52 +02:00
Andy Wingo
365296a866 CPS1 slot-allocation simplification
* module/language/cps/slot-allocation.scm (allocate-slots): Don't pass
  around nargs, as it's not used.
2015-07-19 12:23:05 +02:00
Andy Wingo
3b1d316383 Add intset-prev and intset-fold-right
* module/language/cps/intset.scm (intset-prev): New function.
  (make-intset-folder): Add forward? argument like make-intmap-folder.
  (intset-fold-right): New function.
2015-07-19 12:21:02 +02:00
Andy Wingo
1a819eaaa7 Reify primitives in CPS2
* module/language/cps/reify-primitives.scm: Remove.
* module/language/cps2/reify-primitives.scm: New file.
* module/Makefile.am: Adapt build.

* module/language/cps/compile-bytecode.scm:
* module/language/cps2/compile-cps.scm: Reify primitives in CPS2 instead
  of CPS.
2015-07-16 11:27:14 +02:00
Andy Wingo
420423f9a0 Remove CPS optimization passes and closure conversion
* module/language/cps/closure-conversion.scm:
* module/language/cps/constructors.scm:
* module/language/cps/contification.scm:
* module/language/cps/cse.scm:
* module/language/cps/dce.scm:
* module/language/cps/effects-analysis.scm:
* module/language/cps/elide-values.scm:
* module/language/cps/prune-bailouts.scm:
* module/language/cps/prune-top-level-scopes.scm:
* module/language/cps/self-references.scm:
* module/language/cps/simplify.scm:
* module/language/cps/specialize-primcalls.scm:
* module/language/cps/type-fold.scm:
* module/language/cps/types.scm: Remove these files, obsoleted by CPS2.

* module/Makefile.am: Update.
2015-07-16 07:58:36 +02:00
Andy Wingo
6f6a6aee9d Optimize first-order CPS
* module/language/cps2/optimize.scm: Move comments here from
  cps/compile-bytecode.scm.

* module/language/cps/compile-bytecode.scm: Remove optimization and
  closure conversion calls, since CPS2 does this for us.

* module/language/cps2/compile-cps.scm (compile-cps): Use set! to save
  memory at bootstrap-time.  Optimize first-order CPS, to get rid of
  strangeness introduced in closure conversion.
2015-07-16 07:44:30 +02:00
Andy Wingo
030e9b7603 Enable CPS2 closure conversion
* module/language/cps2/closure-conversion.scm: Remove debug printfs.
* module/language/cps2/compile-cps.scm (compile-cps):
* module/language/cps/compile-bytecode.scm (compile-bytecode): Use CPS2
  closure conversion by default.
2015-07-15 16:44:49 +02:00
Andy Wingo
981802c4c2 Wire up new closure conversion pass
* module/language/cps/compile-bytecode.scm (compile-bytecode): Only
  convert closures if the #:cps2-convert? option is not passed.

* module/language/cps2/compile-cps.scm (conts->fun*, compile-cps): Add
  support for CPS2 closure conversion, disabled by default.
2015-07-15 09:43:33 +02:00
Andy Wingo
363d6498e5 Tweak intset printing
* module/language/cps/intset.scm: Print members of set as absolute
  values, not diffs from set minumum.
2015-07-14 16:14:09 +02:00
Andy Wingo
dc27708f0b Fix intset-subtract to reliably produce empty-intset
* module/language/cps/intset.scm (intset-subtract): Reliably produce
  empty-intset if the result is empty.
2015-07-13 11:03:00 +02:00
Andy Wingo
47a4727b78 intset-union fast paths
* module/language/cps/intset.scm (intset-union): Add fast paths for
  union with empty intset.
2015-07-13 11:02:29 +02:00
Andy Wingo
6f4487f268 Disable CPS optimization passes
* module/language/cps/compile-bytecode.scm (compile-bytecode): Don't
  bother running the CPS optimization passes, as they are redundant
  with CPS2.
2015-06-05 00:54:18 +02:00
Andy Wingo
1850497a5c Fix intmap-ref bug
* module/language/cps/intmap.scm (intmap-ref): Fix a case in which the
  not-found procedure could be called with an incorrect value.
2015-06-05 00:34:05 +02:00
Andy Wingo
8eea1fb142 Fix slot allocation hinting for intervening terms that define dead values
* module/language/cps/slot-allocation.scm (allocate-slots): Even if an
  expression does not define a live value, it might need a place to
  put its value.  In that case we should stop scanning for hints,
  otherwise e.g. an (current-module) primcall whose value isn't used
  could clobber a hinted variable.
2015-06-05 00:34:05 +02:00
Andy Wingo
c3bc1f8e93 Port CSE to CPS2
* module/language/cps2/cse.scm: New file, ported from CPS.
* module/language/cps2/optimize.scm: Wire up CSE.
* module/Makefile.am: Add language/cps2/cse.scm.

* module/language/cps/compile-bytecode.scm (optimize): Disable
  prune-top-level-scopes on old CPS.  It seems to not work if CSE has
  run beforehand.
2015-06-03 12:59:51 +02:00
Andy Wingo
d78e5a260c Add "intset" syntax to construct intsets.
* module/language/cps/intset.scm (intset): New syntax.
2015-06-02 10:05:10 +02:00
Andy Wingo
8b4a523ad5 Add intmap-fold-right
* module/language/cps/intmap.scm (make-intmap-folder): Add forward? argument.
  (intmap-fold): Adapt.
  (intmap-fold-right): New function.
2015-06-02 10:05:10 +02:00
Andy Wingo
23379467ae Add intmap-replace!.
* module/language/cps/intmap.scm (intmap-replace!): New interface.

* module/language/cps2/dce.scm (elide-type-checks):
* module/language/cps2/simplify.scm (transform-conts):
* module/language/cps2/utils.scm (intmap-map):
* module/language/tree-il/compile-cps2.scm (cps-convert/thunk): Use intmap-replace!.
2015-06-02 10:05:09 +02:00