Optimize self-recursive tail calls
authorJan Stolarek <jan.stolarek@p.lodz.pl>
Thu, 29 Aug 2013 09:57:04 +0000 (10:57 +0100)
committerJan Stolarek <jan.stolarek@p.lodz.pl>
Thu, 29 Aug 2013 11:56:09 +0000 (12:56 +0100)
commitd61c3ac186c94021c851f7a2a6d20631e35fc1ba
treeff43791dfcd729fb9951feb6568be5306292fc9d
parent1d1ab12d084c07bd6aee03177ef6008c7ab08127
Optimize self-recursive tail calls

This patch implements loopification optimization. It was described
in "Low-level code optimisations in the Glasgow Haskell Compiler" by
Krzysztof Woś, but we use a different approach here. Krzysztof's
approach was to perform optimization as a Cmm-to-Cmm pass. Our
approach is to generate properly optimized tail calls in the code
generator, which saves us the trouble of processing Cmm. This idea
was proposed by Simon Marlow. Implementation details are explained
in Note [Self-recursive tail calls].

Performance of most nofib benchmarks is not affected. There are
some benchmarks that show 5-7% improvement, with an average improvement
of 2.6%. It would require some further investigation to check if this
is related to benchamrking noise or does this optimization really
help make some class of programs faster.

As a minor cleanup, this patch renames forkProc to forkLneBody.
It also moves some data declarations from StgCmmMonad to
StgCmmClosure, because they are needed there and it seems that
StgCmmClosure is on top of the whole StgCmm* hierarchy.
compiler/codeGen/StgCmmBind.hs
compiler/codeGen/StgCmmClosure.hs
compiler/codeGen/StgCmmExpr.hs
compiler/codeGen/StgCmmMonad.hs