Optimizing away deletion of null pointers with g++

Jeff Law law@redhat.com
Wed Aug 16 15:47:00 GMT 2017

On 08/16/2017 08:44 AM, Jonathan Wakely wrote:
> On 16 August 2017 at 15:40, Jonathan Wakely wrote:
>> On 16 August 2017 at 15:27, Oleg Endo wrote:
>>> On Wed, 2017-08-16 at 13:30 +0200, Paolo Carlini wrote:
>>>> I didn't understand why we don't already handle the easy case:
>>>> constexpr int* ptr = nullptr;
>>>> delete ptr;
>>> What about overriding the global delete operator with some user defined
>>> implementation?  Is there something in the C++ standard that says the
>>> invocation can be completely omitted, i.e. on which side of the call
>>> the nullptr check is being done?
>>> One possible use case could be overriding the global delete operator to
>>> count the number of invocations, incl. for nullptr.  Not sure how
>>> useful that is though.
>> Users can replace the deallocation function "operator delete" but this
>> is the delete operator ... a subtly different thing.
>> Anyway, the standard says:
>> "If the value of the operand of the delete-expression is a null
>> pointer value, it is unspecified whether a deallocation function will
>> be called as described above."
>> So it's permitted to omit the call to operator delete.
> Before C++11 the call was required:
> "The delete-expression will call a deallocation function ("
> This was changed by
> http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348
Which I think argues that we can safely remove a call to operator delete
when we know the pointer is null.  However, we can not assume that an
object passed to operator delete is non-null.

ISTM this would be better implemented in the optimizers rather than in
the front-end.  tree-ssa-dce.c would seem fairly natural.

The only wrinkle is we can't do it in C++03 or earlier mode.

More information about the Gcc mailing list