* module/language/tree-il/peval.scm (peval): Move up the find-definition
helper. Use it to speculatively destructure conses and lists into the
tail position of an `apply' form.
* test-suite/tests/peval.test ("partial evaluation"): Add tests.
* module/language/tree-il/analyze.scm (format-string-argument-count):
Handle ~t and ~k options case-insensitively.
~! ~| ~/ ~q and ~Q should not update the min-count or max-count.
~^ returns the min-count and 'any
+ - # and ' should not increase the argument count.
* test-suite/tests/tree-il.test (*): Tests for new parameters.
* module/system/base/language.scm (<language>): Add 'for-humans?'
field, and export new 'language-for-humans?' predicate.
* doc/ref/compiler.texi (Compiler Tower): Document.
* module/language/assembly/spec.scm, module/language/bytecode/spec.scm,
module/language/glil/spec.scm, module/language/objcode/spec.scm,
module/language/tree-il/spec.scm, module/language/value/spec.scm:
Mark these languages as 'for-humans?'.
* module/language/tree-il/peval.scm (peval): Gensyms use whitespace as
an infix, not a dash. Helps gensym?-like procedures like those in the
unused lexical analysis.
Fixes <http://bugs.gnu.org/12883>.
* module/language/tree-il/cse.scm (cse)[find-dominating-lexical]: Fix
computation of the last argument passed to `unroll'.
Patch by Stefan Israelsson Tampe <stefan.itampe@gmail.com>.
* test-suite/tests/cse.test ("cse")["http://bugs.gnu.org/12883"]: New
test.
Moved scm_i_struct_hash from struct.c to hash.c and made it static.
The port's alist is now a field of 'scm_t_port'.
Conflicts:
libguile/arrays.c
libguile/hash.c
libguile/ports.c
libguile/print.h
libguile/read.c
* module/language/tree-il/primitives.scm (maybe-simplify-to-eq): New
helper procedure shared by expanders for 'eqv?' and 'equal?'.
(*primitive-expand-table*): Add expansion rule for 'eqv?'.
* test-suite/tests/tree-il.test ("primitives"): Add tests.
* module/language/tree-il/primitives.scm (*primitive-expand-table*):
Don't simplify 'equal?' to 'not' or 'null?', but only to 'eq?'.
* test-suite/tests/tree-il.test ("primitives"): Adjust tests.
* module/language/tree-il/primitives.scm (*primitive-expand-table*):
Refine test for fixnums to verify that the small integer is exact.
* test-suite/tests/tree-il.test ("primitives"): Add test.
* module/language/tree-il/primitives.scm (*primitive-expand-table*): Add
expansion rules for `equal?', when called with one constant and
another argument.
* test-suite/tests/tree-il.test (pass-if-primitives-resolved): New
macro.
("primitives"): New test prefix.
* module/language/tree-il/fix-letrec.scm: Use effects.scm for effects
analysis, instead of primitives.scm.
(simple-expression?, partition-vars): Adapt.
* module/language/tree-il/peval.scm (<operand>): Instead of having a
`residualize?' field, have it be a use count.
(peval): Adapt to <operand> change. Add function to kill uses of an
operand. Use it in the <prompt> inliner. Add another kind of
degenerate prompt to elide. We should really switch to CPS though, as
that will allow us to contify more aggressively.
* test-suite/tests/peval.test ("partial evaluation"): Adapt (while #t
#t) test, which was sensitive to how far the recursive inlining got.
Add a test for the degenerate prompt elision.
* module/language/tree-il/effects.scm (make-effects-analyzer): Be more
precise regarding the effects of the so-called
effect+exception-free-primitives: now we check their arities.
* test-suite/tests/cse.test ("cse"): Add a test that we don't
elide (cons 1 2 3) in effect context.
* module/language/tree-il/peval.scm (peval): Inline applications where
we know the contents of the tail.
* test-suite/tests/peval.test ("partial evaluation"): Add tests.
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
(*effect-free-primitives*): Add string->number, number->string,
integer->char, and char->integer to allow for constant folding and
better effects analysis.
* module/language/tree-il/cse.scm (cse): When trying to fold
conditionals, only look at entries in the database that were added in
test context.
* test-suite/tests/cse.test ("cse"): Add a test case.
* module/language/tree-il/analyze.scm (validate-arity): Fix for
applicable structs. Applicable structs are procedures, but not every
struct has a first slot, and not every struct with a procedure in its
first slot is applicable. Besides, the approach in this patch gives
better errors.
* module/language/tree-il/effects.scm (make-effects-analyzer): The
analyzer will take an optional second argument, a lookup procedure of
type sym -> exp. This can let the analyzer dig into calls to
lexically bound procedures.
* module/language/tree-il/cse.scm (singly-valued-expression?, cse):
Allow CSE to propagate lexicals to tail positions, if the expression
is singly-valued.
* module/language/tree-il/peval.scm (peval): If we can lift one common
test, see if we can lift others as well.
* test-suite/tests/peval.test: Add a test.
* module/language/tree-il/peval.scm (peval): Optimize common tests in
chains of "if" expressions, like those generated by matchers.
* test-suite/tests/peval.test ("partial evaluation"): Add a test.
* module/language/tree-il/analyze.scm (proc-ref?)[special?]: New
procedure.
Return #t for any toplevel-ref of `_'.
* test-suite/tests/tree-il.test ("warnings")["format"]("non-literal
format string using gettext as top-level _"): New test.
* module/language/tree-il/analyze.scm (proc-ref?): Check for
SPECIAL-NAME in the <module-ref> and <lexical-ref> cases too.
* test-suite/tests/tree-il.test ("warnings")["format"]("non-literal
format string using gettext as module-ref _", "non-literal format
string using gettext as lexical _"): New tests.
* module/language/tree-il/peval.scm (<operand>, make-operand)
(make-bound-operands, peval): Avoid emitting needless aliases in
degenerate cases of let.
(visit-operand): If we visit an operand with a fresh counter and have
to abort, record that fact.
* test-suite/tests/peval.test ("partial evaluation"): Add a test.
* module/language/tree-il/cse.scm: New pass, some simple common
subexpression elimination with effects analysis.
* test-suite/tests/cse.test: New test.
* test-suite/Makefile.am:
* module/Makefile.am: Adapt.
* module/language/tree-il/peval.scm: Use effects analysis from (language
tree-il effects) instead of our own constant-expression?. Eagerly
mark assigned lexicals as non-copyable.
* module/language/tree-il/primitives.scm
(*interesting-primitive-names*): Add number? and char?. Add more
numeric predicates. Add character comparators. Add throw, error, and
scm-error.
(*primitive-accessors*): Remove struct-vtable. Though the vtable's
contents may change (through redefinition), its identity does not
change.
(*effect-free-primitives*): Put struct-vtable, number?, and char?
here.
(*multiply-valued-primitives*): Instead of listing singly-valued
primitives, list multiply-valued primitives.
(*bailout-primitives*): New list.
(*negatable-primitives*): New alist.
(*bailout-primitive-table*, *multiply-valued-primitive-table*)
(*negatable-primitive-table*): New tables.
(singly-valued-primitive?): Adapt to
use *multiply-valued-primitive-table*.
(bailout-primitive?, negate-primitive): New exported procedures.