[PATCH 0/3] Support for mandatory tail calls

Richard Biener richard.guenther@gmail.com
Thu May 19 13:28:00 GMT 2016


On Thu, May 19, 2016 at 3:19 PM, Jason Merrill <jason@redhat.com> wrote:
> On Thu, May 19, 2016 at 12:30 AM, Basile Starynkevitch
> <basile@starynkevitch.net> wrote:
>> On 05/19/2016 12:12 AM, Jeff Law wrote:
>>>
>>> On 05/17/2016 04:01 PM, David Malcolm wrote:
>>>>
>>>> There have been requests [1] for libgccjit to better support
>>>> functional programming by supporting the contination-passing style,
>>>> in which every function "returns" by calling a "continuation"
>>>> function pointer.
>>>>
>>>> These calls must be guaranteed to be implemented as a jump,
>>>> otherwise the program could consume an arbitrary amount of stack
>>>> space as it executed.
>>>>
>>>> This patch kit implements this.
>>>>
>>>> Patch 1 is a preliminary tweak to calls.c
>>>>
>>>> Patch 2 implements a new flag in tree.h: CALL_EXPR_MUST_TAIL_CALL,
>>>> which makes calls.c try harder to implement a flagged call as a
>>>> tail-call/sibling call, and makes it issue an error if
>>>> the optimization is impossible.  It doesn't implement any
>>>> frontend support for setting the flag (instead using a plugin
>>>> to test it).  We had some discussion on the jit list about possibly
>>>> introducing a new builtin for this, but the patch punts on this
>>>> issue.
>>>
>>> I wonder if we should have an attribute so that the flag can be set for
>>> C/C++ code.  I've seen requests for forcing tail calls in C/C++ code several
>>> times in the past, precisely to support continuations.
>>
>> Why an attribute? Attributes are on declarations. I think it should better
>> be some pragma like _Pragma(GCC tail cail, foo(x,y)) or some builtin (or
>> else some syntax extension like goto return foo(x,y); ...) because what we
>> really want is to annotate a particular call to be tail-recursive.
>
> C++11 attributes can apply to expression-statements as well, e.g.
>
> [[gnu::tail_call]] fn();
>
> though not to sub-expressions.

That's nice.  Can they apply to things like loops?

 [[gnu::no_unroll]] for (int i=0; i<4; ++i)
   a[i] = 0;

Richard.

> Jason



More information about the Gcc-patches mailing list