[llvm-dev] [PATCH] D12923: Add support for function attribute "notail"
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 29 10:49:08 PDT 2015
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.
>
> 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.
>
> -- Sanjoy
More information about the llvm-commits
mailing list