Flow-Directed Lightweight Closure Conversion
Jeffrey Mark Siskind · 2000
procedures contain single concrete procedures when the procedure has no closure-pointer slot, due to closure-pointer--slot elimination, as described below. Furthermore, the concrete aggregate objects in abstract aggregate objects such as pairs, strings, vectors, symbols, continuations, and procedures are indistinguishable when their identity is not important and the components of those aggregate objects are fictitious or unaccessed. Such a collection of indistinguishable concrete objects can be treated as a single concrete object. Finally, continuations can be indistinguishable in certain circumstances that require a must-alias property to hold. The method used by Stalin to approximate this must-alias property is the crux of the lightweight closure-conversion process and is described in detail in section 3.12. Experiments reported in section 4 show that closure-pointer--slot elimination, in practice, allows most procedures to be fictitious and the variables holding such procedures to be eliminated. Not only does the notion of fictitious variables a#ect code generation, by eliminating the slots, parameters, passing, and spilling for such variables, as well as references to such variables, it also impacts the lightweight closure-conversion process itself. Free references to fictitious variables are ignored, allowing a greater degree of parent-slot, closure-pointer--slot, parent-parameter, parent-passing, and parent-spilling elimination.