[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GCCJIT and tail-recursive calls



On 07/10/2015 03:31 AM, David Malcolm wrote:
On Fri, 2015-07-10 at 00:30 +0200, Basile Starynkevitch wrote:
Hello all,

It is well known that GCC is sometimes able to optimize some calls to
tail-recursive calls (or tail calls
https://en.wikipedia.org/wiki/Tail_call ...) which do not consume any stack.

can a GCCJIT application issues such tail calls? I'm not talking of
letting GCC decide entirely by itself (GCCJIT is probably doing that
already).
gcc (and thus libgccjit) can already decide by itself if a call is a
tail-call, and optimize accordingly.

See:
https://gcc.gnu.org/onlinedocs/jit/intro/tutorial04.html#behind-the-curtain-how-does-our-code-get-optimized
and in particular:
https://gcc.gnu.org/onlinedocs/jit/intro/tutorial04.html#elimination-of-tail-recursion


This is done by:
   gcc/tree-tailcall.c
controlled by:
   -foptimize-sibling-calls

which is on by default at -02 and above.


Normally you'd do something like:

    gcc_jit_block_end_with_return (...
      gcc_jit_context_new_call (...));

or

    gcc_jit_block_add_eval (...
      gcc_jit_context_new_call (...));

    gcc_jit_block_end_with_void return (...);


The tailcall is obvious in both of these cases.

I was thinking of adding a construct where the GCCJIT client knows
for sure that the call should be tail-rec (and if GCCJIT was not able to
make a tailcall, that would be an error).
It's not clear to me why that would be useful.  Am I missing something?


You are coding a JIT for your implementation of Scheme.
Scheme requires that tailcails are effectively ilmplemented as such.
So your Scheme implementation has to detect tailcalls and want to be sure that GCCJIT
is implementing them as needed.

How would you ensure that?

Regards.


--
Basile STARYNKEVITCH         http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mine, sont seulement les miennes} ***