[fpc-pascal] fpc isn't optimised for tail recursion, is it?

Steve Litt slitt at troubleshooters.com
Mon Jun 12 19:57:15 CEST 2023


Nikolay Nikolov via fpc-pascal said on Mon, 12 Jun 2023 09:15:17 +0300

>On 6/12/23 04:44, Steve Litt via fpc-pascal wrote:

[snip]

>> So, subject to your guidance, I'm assuming FPC isn't optimized for
>> tail recursion. Is my assumption an accurate one?  
>
>FPC supports tail recursion optimization, it is enabled at -O2 
>optimization level for most CPUs, however your code isn't eligible for 
>that optimization, because there's extra code, after the recursive 
>invoke. If you change it like that:
>
>program recursion_hello;
>
>function nextt(num: int64): int64;
>    begin
>    writeln('Going deeper=>   ', num);
>    nextt := num;
>    if (num > 0) then
>       begin
>       nextt(num - 1);
>       end;
>    end;
>
>begin
>   nextt(1000000000);
>end.
>
>And if you compile with -O2 it works, without segfaulting (tested with 
>FPC 3.2.2 on x86_64-linux).

Thanks Nickolay,

You're right about not assigning nextt below the call to nextt, and
about the -O2 argument. After learning from you about -O2 and
investigating further, I used {$OPTIMIZE tailrec}, which isn't quite the
same thing, but it worked beautifully. {$OPTIMIZE on} also enables tail
recursion and speeds things up about 10% of tailrec.

Thanks for your help.

SteveT

Steve Litt 
Autumn 2022 featured book: Thriving in Tough Times
http://www.troubleshooters.com/bookstore/thrive.htm


More information about the fpc-pascal mailing list