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

3884 commits

Author SHA1 Message Date
Andy Wingo
1f460cb054 Reify-primitives removes "/unlikely" ephemeral instructions
* module/language/cps/reify-primitives.scm (reify-primitives): Remove
  tag-fixnum/unlikely, etc.
2017-12-27 15:46:31 +01:00
Andy Wingo
8e7170a67a Refactor boxing/unboxing primcall args/results
This will allow individual primcall converters to define ad-hoc
conversion routines.

* module/language/tree-il/compile-cps.scm (convert-primcall/default)
  (convert-indexed-getter, convert-indexed-setter)
  (convert-indexed-getter/tag, convert-indexed-setter/untag)
  (convert-scm-u64->scm-primcall, convert-scm-u64-scm-primcall)
  (convert-scm-u64->f64-primcall, convert-scm-u64-f64-primcall)
  (convert-scm-u64->u64-primcall, convert-scm-u64-u64-primcall)
  (convert-scm-u64->s64-primcall, convert-scm-u64-s64-primcall)
  (convert-*->u64-primcall, convert-scm->u64-primcall)
  (convert-u64->scm-primcall): Define some primcall converter helpers.
  (*primcall-converters*, define-primcall-converter)
  (define-primcall-converters): Define converters for a number of
  primcalls.
  (convert-primcall*, convert-primcall): Interface to primcall
  converters.
  (convert): Pass most primcalls through convert-primcall, unless we
  know already that they don't need instruction explosion or
  boxing/unboxing.
2017-12-27 15:46:31 +01:00
Andy Wingo
f75d0adc3f Fix mismatch between CPS and Scheme "complex?" predicate
* module/system/base/types/internal.scm (heap-tags): Rename complex and
  fraction predicates to "compnum?" and "fracnum?", as they aren't the
  same as the Scheme predicates "complex?" and "fraction?".
2017-12-27 15:46:31 +01:00
Andy Wingo
a5dfbf5d0a Fix stack effect/clobber parsing for calls
* module/system/vm/disassembler.scm (define-stack-effect-parser)
  (define-clobber-parser):
* module/system/vm/frame.scm (compute-frame-sizes, compute-killv):
  Fix bug introduced in dd8bf6a98c whereby
  a call would clobber all locals, leaving the backtrace much less
  useful than it should be.
2017-12-27 15:46:25 +01:00
Andy Wingo
da7144d93c Use unchecked scm-ref/set in closure conversion
* module/language/cps/closure-conversion.scm (convert-one): Use
  unchecked initializers and accessors.
2017-12-06 13:46:14 +01:00
Andy Wingo
4dca2c5cfb Support closure annotations to scm-ref et al
* module/language/cps/effects-analysis.scm (annotation->memory-kind):
* module/language/cps/types.scm (annotation->type): Add pairs and
  closures.
2017-12-06 13:45:24 +01:00
Andy Wingo
52e28fd19e Fix DCE over primcall setters with params
* module/language/cps/dce.scm (compute-live-code): The primcall-param
  refactor made it so that a vector-set! to a dead vector would
  needlessly mark the vector as live.  This commit fixes it and adds
  scm-set!, etc.
2017-12-06 13:44:17 +01:00
Andy Wingo
eed4e09723 Assignment conversion uses unchecked memory accessors
* module/language/cps/effects-analysis.scm (annotation->memory-kind):
  Add box type annotation.
* module/language/cps/reify-primitives.scm (primitive-ref): Reify
  scm-ref/immediate instead of box-ref.
* module/language/cps/specialize-primcalls.scm (specialize-primcalls):
  Remove needless and unbound -> literal.
* module/language/cps/types.scm (annotation->type): Add box type.
* module/language/tree-il/compile-cps.scm (convert): Reify
  scm-ref/immediate / scm-set!/immediate instead of box-ref / box-set!.
2017-12-06 11:26:03 +01:00
Andy Wingo
dd8bf6a98c Re-mark "throw" et al as not having fallthrough
* module/system/vm/disassembler.scm (instruction-has-fallthrough?):
  Re-add throw, etc.
* module/system/vm/frame.scm (compute-frame-sizes, compute-killv): Allow
  for unreachable code.
2017-12-06 11:13:31 +01:00
Andy Wingo
f84474ef39 CPS conversion residualizes undefined? predicate
* module/language/tree-il/compile-cps.scm (init-default-value): Use
  undefined? predicate instead of reifying an unbound value in the CPS
  term.
* module/language/cps/compile-bytecode.scm (compile-function): Add cases
  for the special immediate predicates.  Evidently we aren't emitting
  these yet!
2017-12-06 11:13:31 +01:00
Andy Wingo
315dd366ee Add scm-ref, etc instructions for generic heap object field access
* libguile/vm-engine.c (allocate-words, allocate-words/immediate)
  (scm-ref, scm-set!, scm-ref/tag, scm-set!/tag, scm-ref/immediate)
  (scm-set!/immediate): New instructions for generic access to fields in
  heap objects.
* module/language/cps/cse.scm (compute-equivalent-subexpressions):
* module/language/cps/effects-analysis.scm:
* module/language/cps/reify-primitives.scm (reify-primitives):
* module/language/cps/specialize-primcalls.scm (specialize-primcalls):
* module/language/cps/types.scm (allocate-words)
  (allocate-words/immediate, scm-ref, scm-ref/immediate, scm-ref/tag)
  (scm-set!/tag, scm-set!, scm-set!/immediate, word-ref)
  (word-ref/immediate, word-set!, word-set!/immediate):
* module/system/vm/assembler.scm:
* module/language/cps/compile-bytecode.scm (compile-function): Add
  support for the new instructions.
2017-12-06 11:13:29 +01:00
Andy Wingo
9db628ee29 Bailouts can continue directly to tail
* module/language/cps/compile-bytecode.scm (compile-function): Allow a
  'throw primcall in tail position.
* module/language/cps/prune-bailouts.scm (prune-bailouts): Continue
  directly to the nearest tail continuation, so we don't cause
  unreachable handle-interrupts / return 0 instructions to be emitted.
* module/language/cps/reify-primitives.scm (reify-clause): Residualized
  'throw primcall continues directly to tail.
* module/language/cps/verify.scm (check-arities): Relax check for
  'throw.
2017-12-05 14:27:01 +01:00
Andy Wingo
64acf24b40 Fix NaN handling in <= and >=
* module/language/cps/compile-bytecode.scm (compile-function): Add
  support for emitting <= via < and jge / jnge.
* module/language/cps/effects-analysis.scm: Declare effects for <= and
  f64-<=.
* module/language/cps/primitives.scm (*comparisons*): Add <=, f64-<=.
* module/language/cps/specialize-numbers.scm (specialize-operations):
  Specialize <= to < for integer comparisons.  Specialize to f64-<= for
  f64 ops.
* module/language/cps/type-fold.scm (<=): Add folder.
* module/language/cps/types.scm (infer-<=): Add inferrer.
* module/language/tree-il/compile-cps.scm (canonicalize): Canonicalize
  <= and >= to <=, so that nans are handled correctly.
2017-12-02 21:07:48 +01:00
Andy Wingo
40dac99d42 Integer comparison folding refactors
* module/language/cps/type-fold.scm (compare-exact-ranges): Rename from
  compare-integer-ranges.
  (<, u64-<, s64-<, =, u64-=, s64-=): Separate the generic and unboxed
  implementations.
2017-12-02 20:50:13 +01:00
Andy Wingo
8c37cf083f Refactor number specialization to reduce duplication
* module/language/cps/specialize-numbers.scm (specialize-operations):
  Factor out specialize-primcall and specialize-branch operations.
2017-12-02 20:40:26 +01:00
Andy Wingo
bcfadf099a Mark throw, throw/value, etc as having fallthrough
* module/system/vm/disassembler.scm (instruction-has-fallthrough?): Mark
  throw and so on as having fallthrough.  Doing otherwise breaks
  backtraces.
2017-12-02 19:44:06 +01:00
Andy Wingo
0cbba8efe0 Avoid generating arity-adapting zero-value conts where possible
* module/language/tree-il/compile-cps.scm (adapt-arity, convert): Avoid
  generating arity-adapting continuations for nullary continuations.
2017-12-02 10:14:45 +01:00
Andy Wingo
4002849393 Avoid generating arity-adapting continuations if not needed
* module/language/tree-il/compile-cps.scm (adapt-arity): Allow k to be
  $kargs for the 1-valued case.
  (convert): For single-valued continuations where the definition is
  clearly single-valued, avoid making a needless $kreceive and extra
  "rest" binding that will just be filled with () and have to be
  eliminated later.
2017-12-02 10:14:25 +01:00
Andy Wingo
67901cde76 Allow integer devirtualization to be disabled
* module/language/cps/optimize.scm (optimize-higher-order-cps)
  (cps-default-optimization-options): Add #:devirtualize-integers?.
2017-11-30 17:00:37 +01:00
Andy Wingo
5675e46410 -O1 disables call precoloring
* module/language/cps/compile-bytecode.scm (compile-function)
  (emit-bytecode):
* module/language/cps/slot-allocation.scm (allocate-slots):
* module/language/cps/optimize.scm (cps-default-optimization-options):
  Allow the "lazy vars" optimization, a form of slot precoloring, to be
  disabled.  It will be disabled at -O0 or -O1, to speed compilation
  times.
2017-11-30 16:58:58 +01:00
Andy Wingo
2ab89102e7 Improve CSE complexity
* module/language/cps/cse.scm (compute-available-expressions):
  (compute-equivalent-subexpressions): Improve algorithmic complexity of
  CSE by pre-computing the labels whose reads are clobbered by a label's
  writes.
2017-11-30 12:51:45 +01:00
Andy Wingo
eb85b4190f Add compute-clobber-map to effect analysis
* module/language/cps/effects-analysis.scm (compute-clobber-map): New
  public function.
2017-11-30 12:25:43 +01:00
Andy Wingo
1575c863fe Minor CSE run-time optimization
* module/language/cps/cse.scm (compute-equivalent-subexpressions): Minor
  optimization to reduce the size of equivalent expression keys, and to
  avoid some work if an expression has no key.
2017-11-30 10:41:45 +01:00
Andy Wingo
bfe70b129c Merge until 8e2314c46d from stable-2.2 2017-11-29 21:13:40 +01:00
Andy Wingo
b6762f5f7e Merge until 83d4c4d622 from stable-2.2 2017-11-29 21:12:28 +01:00
Andy Wingo
e10999be2e Merge until 2fe9a852fb from stable-2.2 2017-11-29 21:12:01 +01:00
Andy Wingo
82b57d113c Merge until 81d2e35266 from stable-2.2 2017-11-29 21:10:25 +01:00
Andy Wingo
f85d3c0bd8 Merge until e0bcda4ad9 from stable-2.2 2017-11-29 21:04:59 +01:00
Andy Wingo
8e2314c46d Simplify live variable computation for graphs without loops
* module/language/cps/slot-allocation.scm
  (compute-reverse-control-flow-order): For graphs without back-edges,
  use a simplified computation of reverse control flow order.
2017-11-29 20:23:10 +01:00
Andy Wingo
76d4608d7a Add nullary intmap and intset folders
* module/language/cps/intmap.scm (intmap-fold, intmap-fold-right):
* module/language/cps/intset.scm (intset-fold, intset-fold-right): Add
  nullary folders.
2017-11-29 20:23:10 +01:00
Andy Wingo
5f59e2812d Fix logand type inference
* module/language/cps/types.scm (logand): We were computing the wrong
  ranges when either argument was negative; a terrible bug!
  (logsub): Also fix range when A is negative and B is non-negative.
  (ulogand): Tighten up range.
2017-11-29 20:23:10 +01:00
Andy Wingo
39520f879a Simplify live variable computation for graphs without loops
* module/language/cps/slot-allocation.scm
  (compute-reverse-control-flow-order): For graphs without back-edges,
  use a simplified computation of reverse control flow order.
2017-11-29 19:57:48 +01:00
Andy Wingo
b077e807c0 Add nullary intmap and intset folders
* module/language/cps/intmap.scm (intmap-fold, intmap-fold-right):
* module/language/cps/intset.scm (intset-fold, intset-fold-right): Add
  nullary folders.
2017-11-29 19:57:11 +01:00
Andy Wingo
16ed2aee88 Enable lsh/immediate, rsh/immediate specialization
* module/language/cps/specialize-numbers.scm (specialize-operations):
  Fix typo in match syntax preventing us from optimizing the immediate
  variants of lsh and rsh, and typo also in specialize-unop argument
  order.
2017-11-28 22:35:27 +01:00
Andy Wingo
96d1cff802 Tighten up untag-fixnum range
* module/language/cps/types.scm (untag-fixnum): Tighten up range.
2017-11-28 22:35:27 +01:00
Andy Wingo
abd5d2e428 Fix arity of slsh/immediate inferrer
* module/language/cps/types.scm (slsh/immediate): Fix arity.
2017-11-28 22:35:27 +01:00
Andy Wingo
aeb7c18b99 Add fabricated expressions for u64-s64 conversion
* module/language/cps/cse.scm (compute-equivalent-subexpressions): Add
  cases for u64->s64 and s64->u64.
2017-11-27 16:57:45 +01:00
Andy Wingo
bc1fdf73db Refactor aux definition fabrication in CSE pass
* module/language/cps/cse.scm (compute-equivalent-subexpressions):
  Define a little language for creating aux definitions.
2017-11-27 16:54:11 +01:00
Andy Wingo
7d71d9b945 Optimize check-urange in assembler.scm
* module/system/vm/assembler.scm (check-urange): Hoist exact-integer?
  check so that the side effect is entirely in this function and not in
  `logand'.  Allows devirtualize-integers to peel off a nice straight
  trace.
2017-11-24 11:03:46 +01:00
Andy Wingo
8d30643751 DCE of branches punches through dead terms
* module/language/cps/dce.scm (compute-live-code): DCE removes
  effect-free branches where both continuations are the same.  This
  change makes it so that we compare the next *live* continuations.
  This allows DCE to remove chains of dead branches, not just the last
  one, improving compilation e.g. of

    (unless (and (exact-integer? x) (<= 10 x 20)) (error "foo" x))

  so that the bignum trace goes away entirely.
2017-11-24 11:03:46 +01:00
Andy Wingo
3600dbf0cc Refactor to finish the primcalls-take-parameters work
* module/language/cps/compile-bytecode.scm (compile-function): Remove
  helper to look up constants now that primcalls can take parameters.
* module/language/cps/devirtualize-integers.scm (peel-trace): Remove
  extra argument to expression-effects.
* module/language/cps/effects-analysis.scm (constant?, indexed-field):
  Remove unused definitions.
  (expression-effects): Remove "constants" argument; constants come from
  primcall params.
  (compute-effects): Don't compute a constants table.
* module/language/cps/slot-allocation.scm ($allocation): Remove
  "constant-values" field.
  (lookup-constant-value, lookup-maybe-constant-value): Remove; unused.
  (allocate-slots): Don't create a constants table.
* module/language/cps/specialize-primcalls.scm
  (compute-defining-expressions, compute-constant-values): Move these
  definitions here, which were previously in utils.scm
* module/language/cps/utils.scm: Remove moved definitions.
2017-11-24 11:03:46 +01:00
Andy Wingo
5c9398099d Add integer devirtualization pass.
* module/language/cps/devirtualize-integers.scm: New pass.
* module/language/cps/optimize.scm:
* module/Makefile.am:
* am/bootstrap.am: Add new pass.
2017-11-24 11:03:46 +01:00
Andy Wingo
3ae2a88c15 Better unboxing for logand over s64 values
* module/language/cps/specialize-numbers.scm (specialize-operations): Do
  a better job unboxing logand if we know the result is a u64, even if
  arguments are s64.
2017-11-24 11:03:46 +01:00
Andy Wingo
695362a830 Better type folding for = on exact numbers
* module/language/cps/type-fold.scm (=): Fold to #f if values are exact
  but of different types.
  (s64-=): Add missing alias.
2017-11-24 11:03:46 +01:00
Andy Wingo
cdd51d0995 Declare bignum? as effect-free
* module/language/cps/effects-analysis.scm (bignum?): Mark as
  effect-free.
2017-11-24 11:03:46 +01:00
Andy Wingo
31691000b7 Minor refactoring to type inference on < and =
* module/language/cps/types.scm (infer-=): Factor out of
  `define-=-inferrer'.
  (define-<-inferrer): Remove unused definition.
  (=, u64-=, s64-=): Use infer-=.
2017-11-24 11:03:46 +01:00
Andy Wingo
e79de9d4b5 Fix inference of generic < on NaN values
* module/language/cps/types.scm (<): Don't infer anything if either
  number could be a flonum.
2017-11-24 11:03:44 +01:00
Andy Wingo
6f3ae92b37 Improve type and range inference on bignums
* module/language/cps/types.scm (bignum?): New predicate inferrer.
  (infer-integer-<, <, u64-<, s64-<): Factor out how integer comparisons
  are done.  Improve inference over bignums.
  (define-<-inferrer): Remove unused definition.
  (s64-=): Define inferrer; omitted before because of a typo.
  (define-binary-result!, abs): Fix up fixnum/bignum bits; before, we
  would lose some cases where fixnums could become bignums and vice
  versa.
  (define-unary-result!): Remove unused helper.
* module/language/cps/types.scm (bignum?): New folder.
2017-11-24 10:59:29 +01:00
Andy Wingo
6a11fb1532 Add &exact-number helper definition
* module/language/cps/types.scm (&exact-number): New union type.
  (rational?, exact?):
* module/language/cps/type-fold.scm (mul/immediate): Use the new
  definition.
2017-11-24 10:41:28 +01:00
Andy Wingo
980de88902 Add exact-integer? as interesting Tree-IL effect-free primitive
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
  (*effect-free-primitives*, *effect+exception-free-primitives*): Detect
  use of exact-integer?.
* module/language/tree-il/compile-cps.scm (canonicalize): Compile
  exact-integer? to a fixnum?-or-bignum? check.
2017-11-24 10:37:50 +01:00