[LLVMdev] _Znwm is not a builtin
richard at metafoo.co.uk
Wed May 15 20:50:11 PDT 2013
On Wed, May 15, 2013 at 8:46 PM, Chris Lattner <clattner at apple.com> wrote:
> On May 15, 2013, at 8:44 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Wed, May 15, 2013 at 8:28 PM, Richard Smith <richard at metafoo.co.uk>wrote:
>> On Wed, May 15, 2013 at 7:49 PM, Chandler Carruth <chandlerc at google.com>wrote:
>>> On Wed, May 15, 2013 at 8:31 PM, Richard Smith <richard at metafoo.co.uk>wrote:
>>>> LLVM classifies _Znwm as a builtin by default. After some discussion,
>>>> the C++ core working group have decreed that that is not correct: calls to
>>>> "operator new" *can* be optimized, but only if they come from
>>>> new-expressions, and not if they come from explicit calls to ::operator
>>>> new. We cannot work around this in the frontend by marking the call as
>>>> 'nobuiltin' for two reasons:
>>>> 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.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev