Callee-save Registers in Continuation-Passing Style
Abstract:
Continuation-passing style (CPS) is a good abstract representation to
use for compilation and optimization: it has a clean semantics and is
easily manipulated. We examine how CPS expresses the saving and
restoring of registers in source-language procedure calls. As
CPS-conversion is usually written, the context of the calling procedure
is saved in a "continuation closure" -- a single variable that is
passed as an argument to the function being called. This closure is a
record containing bindings of all the free variables of the
continuation; that is, registers that hold values needed by the caller
"after the call" are written to memory in the closure, and fetched back
after the call. Consider the procedure-call mechanisms used by
conventional compilers. In particular, registers holding values needed
after the call must be saved and later restored. The responsibility
for saving registers can lie with the caller (a "caller-saves"
convention) or with the called function (a "callee-saves"). In
practice, to optimize memory traffic compilers find it useful to have
some caller-saves registers and some callee-saves. Clearly the usual
translation into CPS is a caller-saves convention. We explain how to
express callee-save registers in Continuation-Passing Style, and give
measurements showing the resulting improvement in execution time.
- This technical report has been published as
- Callee-save registers in Continuation-Passing Style. Andrew
W. Appel and Zhong Shao, Lisp and Symbolic Computation 5
pp. 189-219, 1992.