[llvm-dev] [PATCH] D12923: Add support for function attribute "notail"
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Wed Nov 4 14:36:17 PST 2015
I have no further comments. All of my points from previous discussion
stand, but it sounds like you have addressed those.
Philip
On 11/04/2015 01:23 PM, Akira Hatanaka wrote:
> I've been discussing the clang-side patch and making changes based on
> the feedback I got for the last few weeks. Aaron has reviewed the
> patch and he thinks it's OK now.
>
> http://reviews.llvm.org/D12922
>
> Do you have further comments on the llvm-side patch or the semantics
> of the function attribute? Since the last time we discussed on the
> list, I've made changes to disallow virtual functions and objective-c
> methods to be marked not_tail_called, which further reduces
> unpredictability due to optimization.
>
> On Tue, Sep 29, 2015 at 5:37 PM, Philip Reames
> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>
>
>
> On 09/29/2015 11:38 AM, Akira Hatanaka wrote:
>> On Tue, Sep 29, 2015 at 10:49 AM, Philip Reames
>> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>>
>>
>>
>> On 09/28/2015 10:38 PM, Sanjoy Das wrote:
>>
>>
>> > That was what I had in mind: the function attribute
>> blocks tail call for statically direct calls but doesn't
>> promise
>> > anything (in fact, does nothing) for indirect calls.
>> >
>> > Do you think we shouldn't make any promises for
>> statically direct calls either? I don't see why it's hard
>> to keep the
>> > promise that direct tail calls will be blocked. Do you
>> have a particular optimization in mind that would be
>> difficult or
>> > impossible to implement if we promised to block direct
>> calls?
>>
>> I think in this scheme we'll have problems around
>> devirtualization.
>> For instance, you could start with a indirect call to a
>> notail target
>> that would get TCO'ed (as an indirect call), after which
>> devirtualization or load/store motion would turn the
>> indirect call
>> into a direct call; and you'd end up with a direct tail
>> call to a
>> notail target.
>>
>> Sanjoy hits on some of the same concerns I had with this. In
>> particular, there's a distinction between what the language
>> specification defines as a direct call and what the
>> optimizer/compiler might turn into a direct call. At the
>> source layer, we can *only* make guarantees about the
>> former. Any specification we write has to account for the
>> fact the later are an implementation detail entirely under
>> the control of the compiler. i.e. optimizations can not break
>> the semantics. You have to ensure this when defining the
>> semantics.
>>
>>
>> By "statically direct calls", I meant the set of calls that can
>> be determined to be direct at the source level, which is normally
>> a subset of the calls that end up being direct calls after all
>> the optimization passes are run. I agree that we can probably
>> promise or guarantee that tail call will be blocked for direct
>> calls at the source level. We don't guarantee anything for
>> indirect calls at the source level.
>>
>>
>>
>> I don't know what your requirements are, but if I were
>> you I'd design
>> the `notail` marker to be logically part of a function's
>> calling
>> convention. That way functions marked `notail` get to do
>> things that
>> are legal only if the call to them wasn't a tail call,
>> because all
>> well-defined calls constrain the caller to match callee's
>> expectation
>> with respect to tail calls. In the CFE, you could make
>> the `notail`
>> attribute have the same restrictions / conventions as
>> things like
>> `fastcall`.
>>
>> I disagree with this slightly. As I've stated previously, I
>> think there are two distinct semantics here: a) this call
>> must be a notail call, and b) we'd "like" this to be a no
>> tail, but it's optional. We need to not mix them.
>>
>>
>>
>> The semantics of the tail call marker I'm looking for is close to
>> b), but differs in whether we say it's optional or we guarantee
>> that we block tail call for a certain subset of calls (direct
>> calls at the source level). I'm inclined to have the tail call
>> marker mean "notail is guaranteed if the call is direct at the
>> source level", but I wonder if it'll come back to bite us.
> I think this is probably fine, but you need someone with clang/C++
> spec knowledge that I don't have to help with the definition.
>>
>> Also, this tail call marker won't be used to enable optimizations
>> on the marked function that would be available only if it were
>> known the call to the function isn't TCO'ed. That might be an
>> interesting idea to other people, but it's not something that is
>> needed for our use case.
>>
>> -- Sanjoy
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151104/ded024fd/attachment.html>
More information about the llvm-dev
mailing list