[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
New special form suggestion: LET-CONSTANT
EB:
If the expression to which the variable is
bound is constant and there are no SETQs to the variable, all
references to the variable may be legitimately replaced by the
constant expression.
MOON:
It isn't an optimization in the Symbolics 3600, for most constants. The
same is true in any other machine that keeps variables in registers and
doesn't have an immediate addressing mode capable of accomodating all Lisp
constants, I believe.
Actually that's not quite true. On the 68k in Lucid lisp for instance compare
1. (let ((foo 'baz))
(setf (car x) foo))
and
2. (setf (car x) 'baz)
The symbol baz can't be represented as an immediate addressing mode. Instead
it is at some constant offset (inside any particular procedure)
from a closure pointer which is in a known register. There is a memory to memory
move on the 68k that can accomodate a source addressing mode that refers to
baz, and a destination mode that refers to (car x), assuming x is already in
a register. So case 2 takes one instruction, whereas case 1 under your description
would take two--one to move baz into the register used for foo, and one to move
that into (car x). Of course in this simple case a peephole optimizer should
be able to clean case 1 up, but if there is other intervening stuff around it
may not get it as easily as the source level transform.
So on some machines the optimization is more generally useful than your note implies.