Вот мое понимание вещей:Оптимизация вызовов хвоста LLVM
Функция «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) В своем примере, ключевое слово «хвост» предшествует вызов. В другом месте я читал, что это ключевое слово необязательно. Пусть функция выше переводится на LLVM надлежащим образом, сделать последние несколько строк должны быть
%x' = load *i32 %x
%m = tail call fastcc i32 @h(i32 %x')
ret %m
2) Каково значение опции inreg в их примере?
3) Я бы не хотел выполнять оптимизацию хвостовых вызовов повсюду, только для рекурсивных функций. Есть ли способ заставить LLVM выполнять только оптимизацию (когда она доступна) для рекурсивных функций?
Соглашение о вызове по умолчанию - 'ccc', соглашение о вызове C. См. Http://llvm.org/docs/LangRef.html#calling-conventions –