[LLVMdev] _Znwm is not a builtin
richard at metafoo.co.uk
Wed May 15 21:10:37 PDT 2013
On Wed, May 15, 2013 at 8:57 PM, Chris Lattner <clattner at apple.com> wrote:
> On May 15, 2013, at 8:50 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> 1) The 'nobuiltin' attribute doesn't actually prevent the optimization
>>>>> (see recent patch on llvmcommits)
>>>>> 2) We can't block the optimization if the call happens through a
>>>>> function pointer, unless we also annotate all calls through function
>>>>> pointers as 'nobuiltin'
>>>>> How feasible would it be to make the 'builtin-ness' of _Znwm etc be
>>>>> opt-in rather than opt-out? Is there some other option we could pursue?
>> Wow, this was spectacularly unclear, sorry about that. To avoid
>> confusion, I'm suggesting that we add a 'builtin' attribute, and do not
>> treat a call to _Znwm as a builtin call unless it has the attribute.
>> It's not clear to me that "builtin" is the right way to model this, but
>> it definitely sounds like this should be an attribute on a call site (as
>> opposed to on the function itself). What specific kinds of optimizations
>> are we interested in doing to _Znwm calls?
> Initially, I'm just concerned about keeping the optimizations we already
> perform, such as globalopt lowering a new/delete pair into a global, while
> disabling the non-conforming variations of those optimizations. But we're
> also permitted to merge multiple allocations into one if they have
> sufficiently similar lifetimes.
> So your proposal is for Clang to slap the attribute on explicit calls to
> ::operator new, but any other use of the symbol (e.g. from C code or
> something else weird) can be optimized?
No, because Clang cannot statically detect which indirect calls might call
::operator new. Instead, my proposal is to add a 'builtin' attribute to
LLVM, and then for clang to add that attribute to the calls which can be
If you think the C code / weird cases are important, a more nuanced option
springs to mind:
* Allow the 'nobuiltin' attribute on function declarations
* Add a 'builtin' attribute, permitted only on direct calls to 'nobuiltin'
functions, which overrides the 'nobuiltin' attribute on the function
Would that be preferable?
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev