Generational garbage collection for Haskell
FPCA '93 Proceedings of the conference on Functional programming languages and computer architecture
A tractable Scheme implementation
Lisp and Symbolic Computation
C--: A Portable Assembly Language that Supports Garbage Collection
PPDP '99 Proceedings of the International Conference PPDP'99 on Principles and Practice of Declarative Programming
The nofib Benchmark Suite of Haskell Programs
Proceedings of the 1992 Glasgow Workshop on Functional Programming
Making a fast curry: push/enter vs. eval/apply for higher-order languages
Proceedings of the ninth ACM SIGPLAN international conference on Functional programming
Comparing tag scheme variations using an abstract machine generator
Proceedings of the 10th international ACM SIGPLAN conference on Principles and practice of declarative programming
A Supercompiler for Core Haskell
Implementation and Application of Functional Languages
Proceedings of the 15th ACM SIGPLAN international conference on Functional programming
Multicore garbage collection with local heaps
Proceedings of the international symposium on Memory management
Adams' trees revisited: correctness proof and efficient implementation
TFP'11 Proceedings of the 12th international conference on Trends in Functional Programming
Guiding parallel array fusion with indexed types
Proceedings of the 2012 Haskell Symposium
Challenges for a trace-based just-in-time compiler for haskell
IFL'11 Proceedings of the 23rd international conference on Implementation and Application of Functional Languages
Data flow fusion with series expressions in Haskell
Proceedings of the 2013 ACM SIGPLAN symposium on Haskell
Hi-index | 0.00 |
In the light of evidence that Haskell programs compiled by GHC exhibit large numbers of mispredicted branches on modern processors, we re-examine the "tagless" aspect of the STG-machine that GHC uses as its evaluation model. We propose two tagging strategies: a simple strategy called semi-tagging that seeks to avoid one common source of unpredictable indirect jumps, and a more complex strategy called dynamic pointer-tagging that uses the spare low bits in a pointer to encode information about the pointed-to object. Both of these strategies have been implemented and exhaustively measured in the context of a production compiler, GHC, and the paper contains detailed descriptions of the implementations. Our measurements demonstrate significant performance improvements (14% for dynamic pointer-tagging with only a 2% increase in code size), and we further demonstrate that much of the improvement can be attributed to the elimination of mispredicted branch instructions. As part of our investigations we also discovered that one optimisation in the STG-machine, vectored-returns, is no longer worthwhile and we explain why.