
On Thu, Dec 21, 2006 at 12:54:50AM +0100, Wolfgang Thaller wrote:
ad c) While they are supported in theory, I couldn't get LLVM to generate any tailcalls. Maybe I've done something wrong, maybe they're not really implemented yet.
it seems that ghc could benefit from a tail-call elimination optimization, that turns them directly into loops. I have implemented it for jhc and it was not terribly difficult (though, not trivial) basically, I just refrained from lambda lifting any functions that were always applied in a fully saturated manner and called in tail-position. then when spitting out C, I just compile them directly into 'goto's. It seems to work well and subsumes turning jump-points directly into goto's rather than function calls as well. I actually do lambda lifting twice, once right before converting to grin, where I lambda lift everything that can never be directly jumped to because it occurs in an unsaturated call or in a lazy context (even if it is called outside of tail position in a strict context), then I optimize, then I lambda lift right before conversion to C any that wern't able to be turned into true jumps. the grin optimizations seem to be able to expose more tail-calls so make this two pass lambda lifting worth it. John -- John Meacham - ⑆repetae.net⑆john⑈