Great work.
* a garbage colletor which can be enabled with '-fjgc' is available. after some more testing, I will make it the default in the 0.7.5 release. * A new memory allocator based on Jeff Bonwick's slab memory allocator for kernels. This means that in many cases, memory can be pulled off a slab and immediately used with no initialization, in addition, it allowed a rearrangement of the GC meta-data to optimizally use the cache.
That sounds like you're essentially using BIBOP (big bag of pages, http://www.memorymanagement.org/glossary/b.html#bibop). Did you compare the overheads with the header-based scheme? Do you still need a tag/header word or do you get the tag by looking up the per page info? Do you use this scheme for all objects or only for small objects? I could imagine a hybrid scheme where where you use bibop for, say, single-constructor objects, although I wonder how you would deal with thunks and their update.
* packed representation of algebraic types, 'Maybe Foo' is actually represented in memory as a NULL pointer or just a 'Foo' with no tag bits. Combined with the slab allocator, this can double the number of some common values that can be put in a cache line.
Interesting. How do you distinguish 'Just e' from 'Just _|_'? Do you need the whole program assumption to disprove that the latter case can happen? / Thomas