GCCJIT and tail-recursive calls

David Malcolm dmalcolm@redhat.com
Thu Jan 1 00:00:00 GMT 2015


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?

> Also, even without optimization (i.e. at -O0) that should remain a 
> tailcall...

Can't you simply turn on -foptimize-sibling-calls at -O0?

> Perhaps adding a gcc_jit_block_end_with_tail_call function?

I can see a way of implementing it for tail-recursion (via a goto),
though it would complicate the implementation (and hence I'm not keen);
I can't see way of doing it for the more general case of tail calls.





More information about the Jit mailing list