Add a parameter to constrain the compiler (off by default) to
implement `+`, `*`, and variants as left-associative when given
multiple arguments.
original commit: d126ba3364893e66263c65af1cd6dbdd8b021439
Make the recent changes insensitive to whether `/` produces
an exact value when its first argument is an exact 0.
original commit: 2d0f59dfdfa9deb37efded804ebd17b98e26f8b6
reclaimed by the collector and must be released explicitly by the
programmer via (profile-release-counters).
pdhtml.ss, primdata.ss,
globals.h, externs.h, fasl.c, prim5.c, prim.c, alloc.c, scheme.c,
misc.ms,
release_notes.stex, system.stex
original commit: 68e20f721618dbaf4c1634067c2bee24a493a750
A large-magnitude mantissa can cancel some of the magnitude of an
exponent.
Also, make numbers like 1/0e1 be divide-by-zero parse errors
instead of +inf.0 (like 1/0, and in contract to 1/0# or 1/0#e1).
original commit: 820145370046aa3b4d4863ad896d40ffeae01453
In safe compilation modes, avoid turning an error like
(let ([x (values 1 2)]) x)
or
(car (list (values 1 2)))
into a program that returns multiple values or
(if (list (values 1 2)) 3 4)
into a program that returns without an error.
In addition, refrain from moving an expression from a non-tail
position within a procedure to a tail position, unless the expression
is not only single valued but also gauarnteed not to inspect the
immediate continuation (e.g., using `call/cc` and comparing the result
to a previously captured continuation). This constraint applies even
in unsafe compilation modes, because the intent it to provide some
guarantees about non-tail positions to complement existing guarantees
of tail positions.
original commit: 91e9631576e7b97137be856e985609320e327f32
Also adds `get-initial-thread`, since threa values are useful with
`compute-size[-increments]`.
Changes the compiler to inline `weak-pair?` and `ephemeron-pair?`,
since that provides better performance for `compute-size-increments`.
original commit: 57d0cc13f8e932972cba3837b4f54e9c86786091
Aviod turning an error like
(let ([x (values 1 2)]) x)
or
(car (list (values 1 2)))
into a program that returns multiple values.
original commit: 4efb3d6f226d9131f87023e45ff2b7e4713da8ae
When writing a fasl stream, add extra graph points as needed
to limit recursive reading to about 500 non-tail recursions.
original commit: a6759efdc6ac68e45ec8755a5fe9b75038e173a5
Use `vfasl-convert-file` to convert to the vfasl format, something
like this:
(vfasl-convert-file "orig/petite.boot" "new/petite.boot" '())
(vfasl-convert-file "orig/scheme.boot" "new/scheme.boot" '("petite"))
(vfasl-convert-file "orig/racket.boot" "new/racket.boot" '("petite" "scheme"))
original commit: a40886e2fba741ca8cfc5ebd16b902d6414da0ae
Also, for completeness, correct the listing of callee-save registers
in callable return for x86 & x86_64.
original commit: 276f8da076a5692457226ea6ad74ba5f0e71cc06
Also, for completeness, correct the listing of callee-save registers
in callable return for x86 & x86_64.
original commit: 4cd942be6ab2eb5e02f6d6c5c509db3131bd015f
When a record-type constructor is formed dynamically,
and when it had more than 6 arguments, use a wrapper
to explicitly set the constructor's arity.
Relevant to racket/racket#2390
original commit: 0a8d335b4f479681dc6dcb5e67126aa3a97357c3
An `mvcall` or `mvset` form holds multiple calls, so the producer call
and the consumer calls need to be tracked separately.
original commit: 0dd559cdd1539753f4ec3fa0c1d575709074b455
- the compiler now uses a temporary variable to hold the return
value of a nested call across the restore-local-saves form to
properly handle the case where the destination lvalue is an mref
whose base and/or index is a local save.
cpnanopass.ss,
misc.ms
original commit: 835cbc2430be4f7381cee27133d42e77ace2b37f
The `object-references` function is intended to support debugging of
memory leaks by providing a mapping from each live object to the
object that retained it.
original commit: 61f6602b7e6c388c529f3c5995dcf71a7c42e005
A program can use `make-arity-wrapper-procedure` to synthesize a
function that reports a given arity mask (without calling `compile`).
In addition, `set-arity-wrapper-procedure!` suports modifying the
implementation of a synthesized procedure. Although similar
functionality could be achieved with `(lambda args (apply (unbox proc)
args))`, an arity wrapper procedure can dispatch to another procedure
without allocating a list for the arguments.
The interpreter now uses an internal variant of arity wrappers to
cooperate with `procedure-arity-mask`.
original commit: 5fede14302840b55edbeb7565e28d09350a4b2e9
bootstrap failures after small changes like the recent change to
procedure names, so we don't have to rebuild the boot files as often.
Mf-base
original commit: 94aaebe54807780791b8373017c979f59e6c45f1
In some cases, such as
(define g (let ([f (lambda (x) x)]) f))
the inner name `f` could get replaced by the outer name `g`.
Prefer the inner name so that macros can use a `let` wrapper
to reliably name a procedure.
original commit: 9ae0f856b0f81610c6caea13a5bfdf3b135de5b0
Libraries incorporated via compile-whole-program are, by default,
not visible to environment or eval, unless libs-visible? is true;
complain if we try to visit such libraries.
original commit: 220dca39d0cb482a1cff3f31b8a3197f8b5ee1bc
Improve error reporting and improve docs as suggested by Andy, and
adjust `conv` -> `conv*` to fit a naming convention.
original commit: b34817aea5d3c4862e7bb313ee9f5281472a832f
Changed the base language foregin and fcallable forms to accept a list of
conventions, which are each symbols, instead of a single convention, which was
a list of conventions, mostly to make it clear in the grammar what is going on.
base-lang.ss, cp0.ss cpcheck.ss, cpcommonize.ss, cpletrec.ss, cpnanopass.ss,
cprep.ss, cpvalid.ss, interpret.ss, syntax.ss,
Fixed a place where we were checking for eq? of two conventions, which now
should be equal? since it is a list (assuming this list will always be in a
consistent order).
cpcommonize.ss
Removed a spurious definition of convention?
np-languages.ss
original commit: dabf5a8abeaef12cdfcb36d9aac236dda9ac9158
Removed counter field from prelex, using the operand field instead to
provide the index into the fxmap. This follows other uses within the compiler
where we use the operand field as a little place for state that is used
within a single pass. This has a few advantages. First, it keeps the record a
little smaller. Second, it means that the prelex numbering can start from 0
for each compilation unit, which should help keep the numbers for the fxmap a
bit smaller in longer running sessions with multiple calls to the compiler.
Finally, it avoids adding to the burden of the tc-mutex, since within the pass
it is safe for us to set the prelexes, since only the instance of the pass
holding this block of code has a handle on it. As part of this change
prelex-counter is now defined in cptypes and the operand is cleared after the
variables go out of scope.
base-lang.ss
Fixed the highest-set-bit function in fxmap so that it will work in the 32-bit
versions of Chez Scheme. The fxsrl by 32 raises an exception, and was leading
to tests to fail in 32-bit mode.
fxmap.ss
Restructured predicate-implies? so that it uses committed choice instead of
uncommitted choice in comparing x and y. Basically, this means, instead of
doing:
(or
(and (predicate-1? x) (predicate-1? y) ---)
(and (predicate-2? x) (predicate-2? y) ---)
...)
we now do:
(cond
[(predicate-1? x) (and (predicate-1? y) ---)]
[(predicate-2? x) (and (predicate-2? y) ---)]
...)
This avoids running predicates on x that we know will fail because an earlier
predicate matches, generally getting out of the predicate faster. This did
require a little restructuring, because in some cases x was dominant and in
other cases y was dominant. This is now restructured with y dominate, after
the eq? and x 'bottom check.
Replaced let-values calls with cata-morphism syntax, including removal of maps
that built up a list of values that then needed to be separated out with
(map car ...) (map cadr ...) etc. calls. This avoid building up structures we
don't need, since the nanopass framework will generate a mutltivalued let for
these situations.
The if clause in cptypes/raw now uses types1 (the result of the recursive call
on e1) in place of the incoming types clause when processing the e2 or e3
expressions in the cases where e1 is known statically to produce either a false
or non-false value.
Fixed a bug with directly-applied variable arity lambda. The original code
marked all directly-applied variable arity lambda's as producing bottom,
because it was chacking for the interface to be equal to the number of
arguments. However, variable arity functions are represented with a negative
number. For instance, the original code would transform the expression:
(begin
((lambda (a . b) (set! t (cons* b a t))) 'a 'b 'c)
t)
to
((lambda (a . b) (set! t (cons* b a t))) 'a 'b 'c)
anticipating that the call would raise an error, however, it is a perfectly
valid (if some what unusual) expression. I tried to come up with a test for
this, however, without building something fairly complicated, it is difficult
to get past cp0 without cp0 turning it into something like:
(let ([b (list 'b 'c)])
(set! t (cons* b 'a t))
t)
Fixed make-time, time-second-set!, and time-second to indicate that second can
be an exact-integer, since it is not really restricted to the fixnum range (and
if fact we even test this fact in the mats on 32-bit machines).
primdata.ss
Changed check of prelex-was-assigned (which is not reliably on the input to any
give pass) with prelex-assigned, which should always have an accurate, if
conservative, value in it.
Added enable-type-recovery parameter to allow the type recover to be turned on
and off, and added cptype to the cp0 not run path that runs cpletrec, so that
cptypes can be run independent of cp0. This is helpful for testing and allows
us to benefit from type recovery, even in cases where we do not want cp0 to
perform any inlining.
compile.ss, front.ss, primdata.ss
Stylistic changes, mostly for consistency with other parts of the compiler,
though I'm not married to these changes if you'd really prefer to keep things
the way the are.
1. clauses of define-record type now use parenthesis instead of square brackets.
2. indented by 2 spaces where things were only indented by one space
3. define, let, define-pass, nanopass pass productions clauses, now use
parenthesis for outer markers instead of square brackets.
fxmap.ss,
original commit: 5c6c5a534ff708d4bff23f6fd48fe6726a5c4e05
- fixed an issue with the library system where an exception that occurs
during visit or revisit left the library in an inconsistent state that
caused it to appear that it was still in the process of running. This
manifested in it raising a cyclic dependency exception, even though
there really is not a cyclic dependency. The various library
management functions involved will now reset the part of the library
when an exception occurs. This also means that if the library visit
or revisit failed for a transient reason (such as a missing or
incorrect library version that can be fixed by updating the
library-directories) it is now possible to recover from these errors.
expand-lang.ss, syntax.ss, interpret.ss, compile.ss, cprep.ss,
8.ms
original commit: 6dbd72496fb4eaf5fb65453d0ae0a75f0ef2ad80
Also, report an error if a string type is misused as an argument (for
foreign procedures) or result (for foreign callables) with
`__collect_safe`.
original commit: cdbfa3d86cb0719bf0979b3fe0aa5c4383282b77
So the reduced version checks that p is a procedure
Also make the same change for #2%for-each.
cp0.ss, 4.ms
original commit: 5caa11c85bc74c0af25ac215d48b7f5f0c1d3e42
commonizatio pass and support for specifying default record
equal and hash procedures:
- more staid and consistent Mf-cross main target
Mf-cross
- cpletrec now replaces the incoming prelexes with new ones so
that it doesn't have to alter the flags on the incoming ones, since
the same expander output is passed through the compiler twice while
compiling a file with macro definitions or libraries. we were
getting away without this just by luck.
cpletrec.ss
- pure? and ivory? now return #t for a primref only if the prim is
declared to be a proc, since some non-proc prims are mutable, e.g.,
$active-threads and $collect-request-pending.
cp0.ss
- $error-handling-mode? and $eol-style? are now properly declared to
be procs rather than system state variables.
primdata.ss
- the new pass $check-prelex-flags verifies that prelex referenced,
multiply-referenced, and assigned flags are set when they
should be. (it doesn't, however, complain if a flag is set
when it need not be.) when the new system parameter
$enable-check-prelex-flags is set, $check-prelex-flags is
called after each major pass that produces Lsrc forms to verify
that the flags are set correctly in the output of the pass.
this parameter is unset by default but set when running the
mats.
cprep.ss, back.ss, compile.ss, primdata.ss,
mats/Mf-base
- removed the unnecessary set of prelex referenced flag from the
build-ref routines when we've just established that it is set.
syntax.ss, compile.ss
- equivalent-expansion? now prints differences to the current output
port to aid in debugging.
mat.ss
- the nanopass that patches calls to library globals into calls to
their local counterparts during whole-program optimization now
creates new prelexes and sets the prelex referenced, multiply
referenced, and assigned flags on the new prelexes rather than
destructively setting flags on the incoming prelexes. The
only known problems this fixes are (1) the multiply referenced
flag was not previously being set for cross-library calls when
it should have been, resulting in overly aggressive inlining
of library exports during whole-program optimization, and (2)
the referenced flag could sometimes be set for library exports
that aren't actually used in the final program, which could
prevent some unreachable code from being eliminated.
compile.ss
- added support for specifying default record-equal and
record-hash procedures.
primdata.ss, cmacros.ss, cpnanopass.ss, prims.ss, newhash.ss,
gc.c,
record.ms
- added missing call to relocate for subset-mode tc field, which
wasn't burning us because the only valid non-false value, the
symbol system, is in the static generation after the initial heap
compaction.
gc.c
- added a lambda-commonization pass that runs after the other
source optimizations, particularly inlining, and a new parameter
that controls how hard it works. the value of commonization-level
ranges from 0 through 9, with 0 disabling commonization and 9
maximizing it. The default value is 0 (disabled). At present,
for non-zero level n, the commonizer attempts to commonize
lambda expressions consisting of 2^(10-n) or more nodes.
commonization of one or more lambda expressions requires that
they have identical structure down to the leaf nodes for quote
expressions, references to unassigned variables, and primitives.
So that various downstream optimizations aren't disabled, there
are some additional restrictions, the most important of which
being that call-position expressions must be identical. The
commonizer works by abstracting the code into a helper that
takes the values of the differing leaf nodes as arguments.
the name of the helper is formed by concatenating the names of
the original procedures, separated by '&', and this is the name
that will show up in a stack trace. The source location will
be that of one of the original procedures. Profiling inhibits
commonization, because commonization requires profile source
locations to be identical.
cpcommonize.ss (new), compile.ss, interpret.ss, cprep.ss,
primdata.ss, s/Mf-base,
mats/Mf-base
- cpletrec now always produces a letrec rather than a let for
single immutable lambda bindings, even when not recursive, for
consistent expand/optimize output whether the commonizer is
run or not.
cpletrec.ss,
record.ms
- trans-make-ftype-pointer no longer generates a call to
$verify-ftype-address if the address expression is a call to
ftype-pointer-address.
ftype.ss
original commit: b6a3dcc814b64faacc9310fec4a4531fb3f18dcd
- fixed substring-fill! and vector-fill! to return void, reflecting the
documented return value of unspecified value. Also changes substring-fill!
to use define-who instead of repeating 'substring-fill! in all the error
messages.
5_4.ss, 5_6.ss
original commit: 3f65788b5422693f3648a9e2fe575f464eb31ccd
compilation now treat a malformed object file as if it were
not present and needs to be regenerated. A malformed object
file (particularly a truncated one) might occur if the compiling
processes is killed or aborts before it has a chance to delete
a partial object file.
syntax.ss,
7.ms
original commit: c2cb8c79a925c0eb2f9d589e3a497712800bd1dc
entries x and y in the list produced by the sort call, if x's
bfp = y's bfp, x should come before y if x's efp < y's efp.
The idea is that enclosing entries should always come later
in the list. this affects only languages where two expressions
can start at the same character position.
pdhtml.ss
expanded capability of ez-grammar with support for simpl
parsing of binary operators w/precedence and associativity
and automatically generated markdown grammar descriptions.
ez-grammar-test.ss now also doubles as a test of pdhtml for
algebraic languages.
mats/examples.ms,
examples/ez-grammar.ss, examples/ez-grammar-test.ss,
examples/Makefile
original commit: 53b8d16a1e86f3956585dbec0c7b573e485f7844
test and ephemeron gc test while resensitizing the former
8.ms, 4.ms
various formatting and comment corrections
workarea,
s/Mf-base, bytevector.ss, cpnanopass.ss, date.ss,
5_6.ms, examples.ms
original commit: 19e2505fc6477fce2d1d0e61187bd504b58ea994
procedures with large numbers of variables:
- added pass-time tracking for pre-cpnanopass passes to compile.
compile.ss
- added inline handler for fxdiv-and-mod
cp0.ss, primdata.ss
- changed order in which return-point operations are done (adjust
sfp first, then store return values, then restore local saves) to
avoid storing return values to homes beyond the end of the stack
in cases where adjusting sfp might result in a call to dooverflood.
cpnanopass.ss, np-languages.ss
- removed unused {make-,}asm-return-registers bindings
cpnanopass.ss
- corrected the max-fv value field of the lambda produced by the
hand-coded bytevector=? handler.
cpnanopass.ss
- reduced live-pointer and inspector free-variable mask computation
overhead
cpnanopass.ss
- moved regvec cset copies to driver so they aren't copied each
time a uvar is assigned to a register. removed checks for
missing register csets, since registers always have csets.
cpnanopass.ss
- added closure-rep else clause in record-inspector-information!.
cpnanopass.ss
- augmented tree representation with a constant representation
for full trees to reduce the overhead of manipulating trees or
subtress with all bits set.
cpnanopass.ss
- tree-for-each now takes start and end offsets; this cuts the
cost of traversing and applying the action when the range of
applicable offsets is other than 0..tree-size.
cpnanopass.ss
- introduced the notion of poison variables to reduce the cost of
register/frame allocation for procedures with large sets of local
variables. When the number of local variables exceeds a given
limit (currently hardwired to 1000), each variable with a large
live range is considered poison. A reasonable set of variables
with large live ranges (the set of poison variables) is computed
by successive approximation to avoid excessive overhead. Poison
variables directly conflict with all spillables, and all non-poison
spillables indirectly conflict with all poison spillables through
a shared poison-cset. Thus poison variables cannot live in the
same location as any other variable, i.e., they poison the location.
Conflicts between frame locations and poison variables are handled
normally, which allows poison variables to be assigned to
move-related frame homes. Poison variables are spilled prior to
register allocation, so conflicts between registers and poison
variables are not represented. move relations between poison
variables and frame variables are recorded as usual, but other
move relations involving poison variables are not recorded.
cpnanopass.ss, np-languages.ss
- changed the way a uvar's degree is decremented by remove-victim!.
instead of checking for a conflict between each pair of victim
and keeper and decrementing when the conflict is found, remove-victim!
now decrements the degree of each var in each victim's conflict
set. while this might decrement other victims' degrees unnecessarily,
it can be much less expensive when large numbers of variables are
involved, since the number of conflicts between two non-poison
variables should be small due to the selection process for
(non-)poison variables and the fact that the unspillables introduced
by instruction selection should also have few conflicts. That
is, it reduces the worst-case complexity of decrementing degrees
from O(n^2) to O(n).
cpnanopass.ss
- took advice in compute-degree! comment to increment the uvars in
each registers csets rather than looping over the registers for
each uvar asking whether the register conflicts with the uvar.
cpnanopass.ss
- assign-new-frame! now zeros out save-weight for local saves, since
once they are explicitly saved and restored, they are no longer
call-live and thus have no save cost.
cpnanopass.ss
- desensitized the let-values source-caching timing test slightly
8.ms
- updated allx, bullyx patches
patch*
original commit: 3a49d0193ae57b8e31ec6a00b5b49db31a52373f
redundant keys and expands into exclusive-cond rather than cond.
it catches references to => before expanding into exclusive-cond
to avoid supporting => as an undocumented and useless extension
of the case syntax. the r6rs:case and case macros now require
multiple clauses rather than leaving the enforcement to exclusive-cond,
and the exclusive-cond macro now requires multiple clauses rather
than leaving the enforcement to cond.
syntax.ss,
4.ms, root-experr*, patch*
original commit: 303921d8515b101c558a056dcf9c05f7cad97f4a
an existing setting will not interfere with the build process, and
added a note to BUILDING that CHEZSCHEMELIBDIRS should be unset in
Version 9.5 and before.
s/Mf-base, mats/Mf-base, BUILDING
original commit: 1cccd56693911a38ece784da677e35f724950700
scheme.1.in, newrelease
- removed version update of no-longer-existing bldnt.bat. "fixed"
sed patterns to replace \? with * for the benefit of the deficient
mac sed.
newrelease
- updated version to 9.5
bintar BUILDING NOTICE makefiles/Mf-install.in scheme.1.in
c/Makefile.i3nt c/Makefile.a6nt c/Makefile.ti3nt c/Makefile.ta6nt
workarea c/scheme.rc s/7.ss s/cmacros.ss
release_notes/release_notes.stex csug/csug.stex
- updated release notes and fixed user's guide overfull hbox.
release-notes.stex, syntax.stex
- updated install target to do something more sensible
release_notes/Makefile
original commit: adb3b7bb22ddaa1ba91b98b6f4a647427c3a4d9b
in tail and predicate context and added regression tests. Thanks to
@marcomaggi for reporting the bug and @yjqww6 for providing a
simplified test and finding the initial solution.
cpnanopass.ss,
3.ms
original commit: 28f31d84b6c45e2fa701655e9131801dd603d925
Add optional beginning-line and beginning-column components to a
source object, so that line and column information can be recorded
independent of the file. Add `locate-source-object-source` to use
the recorded information. Add a cache for `locate-source` as enabled by
the `use-cache?` optional argument, which can avoid compilation times
that are quadratic in the number of `let-values` or `define-values`
forms.
original commit: b36fab81d5041a54ce01a422395eee79d2f930bc
Revert the use of ephemeron pairs in weak hashtables, since the
difference is visible via guardians. Add hashtable based on ephemerons
(to avoid key-in-value problems) as an explicit variant.
original commit: 31ac6d78592e1a9ba6bfbe802260e3d56d4cf772
8-byte read instead of a 4-byte read to pick up the 4 highest-order
bytes of a little-endian flonum, potentially reading past the end of
mapped memory for flonums produced by taking the imaginary part of an
inexact complexnum (which, unlike other flonums, are not aligned on
16-byte boundaries). The 8-byte load would also have failed to produce
correct results on 64-bit big-endian machines (of which we presently
have none) because the offsets passed to flonum-extractor assume the
bits are in the lowest-order 4 bytes of the extracted field.
cp0.ss,
misc.ms,
release_notes.stex
original commit: 97bd75bcedbcf32b77c59615a638ea1528ebe26b