1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-05 23:20:38 +02:00
Commit graph

20154 commits

Author SHA1 Message Date
Paulo Andrade
76876dd7bf Implement a correct generation of Fibonacci numbers.
* doc/body.texi: Change documentation to no longer say
	it is a variant of the Fibonacci sequence, and document
	a proper implementation.
	Thanks to Jon Arintok for pointing out that the Fibonacci
	sequence generation was incorrect. It was documented, but
	still confusing.

	* check/fib.tst, check/fib.ok, check/bp.tst, check/bp.ok,
	doc/ifib.c, doc/rbif.c: Implement a proper Fibonacci
	sequence implementation.
2015-11-30 15:32:48 -02:00
Andy Wingo
d729a0dc75 Remove br-if-equal opcode
* libguile/vm-engine.c (br-if-equal): Remove opcode.
2015-11-12 21:23:09 +01:00
Andy Wingo
3e5d4131d2 Don't compile equal? to br-if-equal
* module/language/cps/compile-bytecode.scm (compile-function):
* module/language/cps/primitives.scm (*branching-primcall-arities*):
* module/language/cps/type-fold.scm (equal?):
* module/language/cps/types.scm (equal?):
* module/language/tree-il/compile-cps.scm (convert): `equal?' is no
  longer a branching primcall, because it isn't inline.  The
  implementation could lead to bad backtraces also, as it didn't save
  the IP, and actually could lead to segfaults as it didn't reload the
  SP after the return.  There is an eqv? fast-path, though.
* module/system/vm/assembler.scm (br-if-equal): Remove interface.
* module/system/vm/disassembler.scm (code-annotation):
  (compute-labels): No need to handle br-if-equal.
2015-11-12 21:22:19 +01:00
Andy Wingo
92ed7f6989 Fix miscompilation of closures allocated as vectors
* module/language/cps/closure-conversion.scm (convert-one): Fix
  miscompilation of vector closure initialization.
2015-11-11 16:30:59 +01:00
Andy Wingo
13edcf57a0 load-path will skip over stale .go files and keep going
* libguile/load.c (compiled_is_fresh): Write warnings to warning port.
  Move up in the file.
  (search_path): Add ability to skip over matching files in the path
  that are stale, relative to some other corresponding file.
  (scm_search_path, scm_sys_search_load_path): Adapt to search_path
  changes.
  (do_try_auto_compile): Write status to warning port.
  (scm_primitive_load_path): Use new search_path ability to skip over
  stale files.  Allows updates to source files to use freshly-compiled
  bootstrap files, when building Guile itself.  Also allows
  simplification of fallback logic.
  (scm_init_eval_in_scheme): Skip stale eval.go files in the path.
2015-11-11 15:38:45 +01:00
Andy Wingo
25738ec35d Eval speedup for lexical-ref
* module/ice-9/eval.scm (primitive-eval): Specialize lexical-ref for
  depths 0, 1, and 2.  Speeds up this test by around 13%:

    (primitive-eval '(let lp ((n 0)) (when (< n #e1e7) (lp (1+ n)))))
2015-11-11 14:51:19 +01:00
Andy Wingo
ac5a05d02e Bump bytecode version
* libguile/_scm.h (SCM_OBJCODE_MINOR_VERSION):
* module/system/vm/assembler.scm (*bytecode-minor-version*): Bump
  bytecode version to prevent 2.1.1 users from thinking that they don't
  need to make clean after pulling.
2015-11-11 10:25:23 +01:00
Andy Wingo
7dc3e4ba23 Remove debug printout in specialize-numbers
* module/language/cps/specialize-numbers.scm (apply-f64-specialization):
  Remove printout.  I didn't see any when compiling Guile, which means
  that probably this optimization doesn't hit for any code in Guile
  itself, sadly :P
2015-11-11 10:21:43 +01:00
Andy Wingo
80f2726310 Better f64 unboxing for loop vars that might flow to $ktail
* module/language/cps/specialize-numbers.scm (compute-specializable-f64-vars):
  Tweak to allow f64 values to flow directly to return sites.
2015-11-11 10:21:43 +01:00
Andy Wingo
5b9835e1f8 The compiler can unbox float64 loop variables
* module/language/cps/specialize-numbers.scm: Specialize phi variables
  as well.
2015-11-11 10:21:43 +01:00
Andy Wingo
f0594be035 Fix slot representation computation for fadd, fmul, etc
* module/language/cps/slot-allocation.scm (compute-var-representations):
  fadd, fmul and so on also define f64 values.
2015-11-11 10:21:43 +01:00
Andy Wingo
12e9e2148e Add new pass to specialize "add" into "fadd" where possible
* module/language/cps/specialize-numbers.scm: New pass, to turn "add"
  into "fadd", and similarly for sub, mul, and div.

* module/language/cps/optimize.scm:
* module/Makefile.am:
* bootstrap/Makefile.am: Wire up the new pass.
2015-11-11 10:21:43 +01:00
Andy Wingo
3b4941f3a9 Add fadd, fsub, fmul, fdiv instructions
* libguile/vm-engine.c (fadd, fsub, fmul, fdiv): New instructions.

* module/language/cps/effects-analysis.scm:
* module/language/cps/types.scm: Wire up support for new instructions.

* module/system/vm/assembler.scm: Export emit-fadd and friends.
2015-11-11 10:21:28 +01:00
Andy Wingo
c438998e48 Scalar replacement for f64->scm
* module/language/cps/cse.scm (compute-equivalent-subexpressions):
  Scalar replacement for float boxes.
2015-11-11 10:21:16 +01:00
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
Paulo Andrade
fd57359498 Correct missing jit_unget_reg calls 2015-11-04 17:05:51 -02:00
Andy Wingo
5bbc47b06d Add VM ops to pack and unpack raw f64 values.
* libguile/vm-engine.c (scm->f64, f64->scm): New ops.
2015-10-28 17:58:30 +00:00
Andy Wingo
fc87033bf0 Stack slots can hold a double
* libguile/frames.h (union scm_vm_stack_element): Add double member.
* libguile/frames.c (scm_frame_local_ref, scm_frame_local_set_x): Wire
  up f64 support.
2015-10-28 17:47:48 +00: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
95855087ec Remove return opcode
* libguile/vm-engine.c (return): Remove opcode.
2015-10-28 13:11:40 +00:00
Andy Wingo
c984432f60 Remove use of return in disassembler.scm
* module/system/vm/disassembler.scm (instruction-has-fallthrough?):
  Remove return from static opcode set.
2015-10-28 13:11:20 +00:00
Andy Wingo
8db54c80ce rtl.test uses return-values
* test-suite/tests/rtl.test: Fix up to use return-values.
2015-10-28 11:33:17 +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
c99f9ba9c8 Release v2.1.1
* GUILE-VERSION (GUILE_MICRO_VERSION): Bump to v2.1.1.
2015-10-25 14:25:56 +00:00
Andy Wingo
e5bccb6e5d Fix distcheck issues
* bootstrap/Makefile.am:
* libguile/Makefile.am: Fix distcheck issues.
2015-10-25 14:25:56 +00:00
Andy Wingo
4339cb9fc1 Fix uninstalled-env bug that preferred bootstrap/ to module/
* meta/uninstalled-env.in (top_builddir): Whoops!  We were
  preferring bootstrap/ unoptimized .go files to module/ optimized .go
  files.  Fix!
2015-10-25 11:46:58 +00:00
Andy Wingo
95ac2204d9 Revert "Update Gnulib to v0.1-603-g1d16a7b"
This reverts commit 2d4da30fde.

This Gnulib update was causing failures related to timezones in
stime.c.  I tried to fix it by adopting the time_rz module from gnulib
but that then caused other failures.  We can try again later.
2015-10-25 10:55:14 +00:00
Andy Wingo
1c9e23c090 Bootstrap makefile tweaks
* bootstrap/Makefile.am (.scm.go): Fix -L options to point to /module.
  (SOURCES): Move up psyntax-pp.scm.  Sadly a bug while I was developing
  the bootstrap makefile meant that there was a stale psyntax-pp.go from
  module/ that the build was picking up, leading to invalid
  bootstrap timing measurements.
2015-10-23 16:49:02 +02:00
Andy Wingo
5f4ac529e1 Use a bootstrapped -O0 compiler to compile the -O2 Guile
This reduces total build time to around 30 minutes or so.

* Makefile.am (SUBDIRS): Visit bootstrap/ before module/.

* bootstrap/Makefile.am: New file.

* configure.ac: Generate bootstrap/Makefile.

* meta/uninstalled-env.in (top_builddir): Add bootstrap/ to the
  GUILE_LOAD_COMPILED_PATH.

* module/Makefile.am: Simplify to just sort files in alphabetical order;
  since bootstrap/ was already compiled, we don't need to try to
  optimize compilation order.  Although the compiler will get faster as
  more of the compiler itself is optimized, this isn't a significant
  enough effect to worry about.
2015-10-23 13:29:03 +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
2d4da30fde Update Gnulib to v0.1-603-g1d16a7b 2015-10-22 13:34:00 +00:00
Andy Wingo
139ef2d17c Minor NEWS update. 2015-10-22 13:03:51 +00:00
Andy Wingo
8832e8b68c Small subr-call refactor
* libguile/gsubr.c (scm_apply_subr): New internal helper.
* libguile/vm-engine.c (subr-call): Call out to scm_apply_subr.
* doc/ref/vm.texi (subr-call): Don't specify how the foreign pointer is
  obtained.
2015-10-22 12:13:37 +00:00
Andy Wingo
9144f50c31 subr-call implementation simplification
* libguile/vm-engine.c (subr-call): Reference args from SP, not FP.
2015-10-22 11:35:07 +00:00
Andy Wingo
467e587d68 Update VM documentation for new stack layout
* doc/ref/vm.texi: Update for new stack layout.
* module/system/vm/disassembler.scm (code-annotation): Print the frame
  sizes after alloc-frame, reset-frame, etc to make reading the
  disassembly easier.
2015-10-22 11:02:18 +00:00
Andy Wingo
f03960412e Add stack size computation to disassembler
* module/system/vm/disassembler.scm (define-stack-effect-parser)
  (stack-effect-parsers, instruction-stack-size-after): New stack size
  facility.
  (define-clobber-parser, clobber-parsers, instruction-slot-clobbers):
  Take incoming and outgoing stack sizes as arguments to interpret
  SP-relative clobbers.

* module/system/vm/frame.scm (compute-frame-sizes): New helper that
  computes frame sizes for each position in a function.
  (compute-killv): Adapt to compute the clobbered set given the computed
  frame sizes.
2015-10-21 15:02:28 +02:00
Andy Wingo
4afb46f859 Minor assembler cleanups
* module/system/vm/assembler.scm (shuffling-assembler): Minor renames.
2015-10-21 15:02:08 +02: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
9b1ac02a85 Fix boot closure wrong-num-args error
* libguile/eval.c (prepare_boot_closure_env_for_eval): Fix issue if
  fixed closure is called with wrong number of arguments during
  bootstrap.
2015-10-21 11:49:20 +02:00