Hi,
createTailCallEliminationPass() is able to turn recursive
functions into loops when the functions are written
in tail recursive form. However, I'm unable to get it
to convert mutually recursive functions to run without
a growing stack.
For example (in pseudo code)-
define fact(n,result)
if n < 2
then result
else fact(n-1,result *n)
is converted into a loop correctly. However the following
mutually recursive pair -
define even(n)
if n == 0
then true
else odd(n-1)
define odd(n)
if n==0
then false
else even(n-1)
doesn't get to run in constant stack space.
Is that possible with llvm?
-Srikumar
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20080803/ee73eeb3/attachment.html>
Chris Lattner
2008-Aug-03 18:11 UTC
[LLVMdev] question about tail call elimination pass ..
On Aug 3, 2008, at 8:45 AM, kumar wrote:> Hi, > > createTailCallEliminationPass() is able to turn recursive > functions into loops when the functions are written > in tail recursive form. However, I'm unable to get it > to convert mutually recursive functions to run without > a growing stack....> doesn't get to run in constant stack space. > Is that possible with llvm? >Sure, just run the function inliner pass first before the tail recursion elimination pass. -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080803/d42fb277/attachment.html>