On Sat, Apr 4, 2020 at 1:53 PM Jan Hubicka <hubi...@ucw.cz> wrote:
>
> Hi,
> thinking a bit of the problem, I guess we could match in addition to
> DECL_CONTEXT the whole inline stack of both statements and see if there
> are inlined new/delete operators and if so if they are always in
> matching pairs.
>
> The inline stack is available as
> for (tree block = gimple_block (call); block && TREE_CODE (block) == BLOCK; 
> block = BLOCK_SUPERCONTEXT (block))
>   {
>     tree fn = block_ultimate_origin (block);
>     if (fn != NULL && TREE_CODE (fn) == FUNCTION_DECL)
>       do the checking htere.
>   }
>
> But I do not understand what C++ promises here and in what conditions
> the new/delete pair can be removed.

But if the inline stack matches in pairs then the ultimate new/delete
call should also
match, no?  When there's a mismatch in inlining we can't DCE since we
can't remove
the extra inlined stmts.

Your failing testcase suggests we never can remove new/delete pairs though
unless the DECL_CONTEXT is 'final'.  Also the user could have chosen to
"inline" the side-effect of the new operation manually but not the
delete one, so

operator delete() { count-- }

  ptr = new A;
  count++;
  delete ptr;

is it valid to elide the new/delete pair here?

Richard.

> Honza

Reply via email to