optimizations in classic imperative style, we built a control-flow graph using mutable
pointers and other mutable state in the nodes. This decision proved unfortunate:
the mutable flow graph was big and complex, and it led to many bugs. We have
replaced it by a smaller, simpler, applicative flow graph based on Huet’s (1997)
zipper. The new flow graph is a success; this paper presents its design and shows
how it leads to a gratifyingly simple implementation of the dataflow framework
developed by Lerner, Grove, and Chambers (2002)...
The measurements in Table 1 reflect costs with optimization turned off.
With optimization turned on, it is hard to make an apples-to-apples comparison:
the old optimizer uses a dataflow framework that does not compose
analyses and transformations; some of the older optimizations are more conservative
than the newer ones; and some of the older optimizations run once
instead of being iterated to a fixed point. Still, when we compensate for these
differences as best we can, the results are similar: the applicative flow graph
performs about 10% better than its imperative counterpart...