Hi Andy, Andy Wingo <wi...@pobox.com> writes: > Not sure what to do. The part of me that wants to do aggressive CSE > wants to transform to a form that fixes order of evaluation, but the > part of me that wants to be able to shuffle values using the Dybvig > algorithm wants to do the direct form. Dunno!
I think the proper solution is to fix order of evaluation somewhere in the _middle_ of compilation, so that compiler passes can be placed either before or after the order is fixed. Then we can have the best of both worlds. Some passes, such as fixing-letrec, can benefit greatly from UNspecified order of evaluation, whereas other passes such as CSE can benefit from a fixed order of evaluation and CPS form. Speaking of the fixing-letrec pass, I have a chunk of free time over the next week during which I intend to dust off my fixing-letrec-reloaded implementation, and to start generalizing that algorithm to support 'letrec-values', 'letrec*-values', and 'define-values'. Andy: the reason I bring this up is that it will require the 'letrec' and 'letrec*' node types to be changed to 'letrec-values' and 'letrec*-values'. I know you're working on that area of the code now, so consider this a heads-up. I suspect that fixing-letrec should be done fairly early in compilation. This has several advantages, most notably that later passes needn't understand 'letrec' or 'letrec*' nodes at all. What do you think? Mark