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>