以下是我对事物的理解:
当调用自身是函数“f”的最后一个操作时,函数“f”是尾递归的。通过形成循环而不是再次调用函数可以显着优化尾递归;函数的参数被更新到位,并再次运行主体。这称为递归尾调用优化。
LLVM 在使用 fastcc、GHC 或 HiPE 调用约定时实现递归尾调用优化。 http://llvm.org/docs/CodeGenerator.html#tail-call-optimization
我有一些问题:让我们考虑这个愚蠢的例子:
int h(int x){
if (x <= 0)
return x;
else
h(x-1);
}
1)在他们的例子中,关键字“tail”在调用之前。在其他地方我读到这个关键字是可选的。假设上面的函数被适当地翻译成 LLVM,最后几行是否需要
%x' = load *i32 %x
%m = tail call fastcc i32 @h(i32 %x')
ret %m
2)在他们的例子中 inreg 选项的含义是什么?
3) 我不想到处执行尾调用优化,只针对递归函数。有没有办法让 LLVM 只对递归函数执行优化(如果可用)?