question about tail call elimination pass ..

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

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