https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110035

--- Comment #13 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 6 Jun 2023, ptk.prasertsuk at gmail dot com wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110035
> 
> --- Comment #11 from Pontakorn Prasertsuk <ptk.prasertsuk at gmail dot com> 
> ---
> (In reply to rguent...@suse.de from comment #10)
> > On Mon, 5 Jun 2023, ptk.prasertsuk at gmail dot com wrote:
> > 
> > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110035
> > > 
> > > --- Comment #9 from Pontakorn Prasertsuk <ptk.prasertsuk at gmail dot 
> > > com> ---
> > > (In reply to Richard Biener from comment #8)
> > > > (In reply to Pontakorn Prasertsuk from comment #7)
> > > > > For the LLVM IR code of the snippet I provided, Clang's alias 
> > > > > analysis can
> > > > > prove that `new` call has no side effect to other memory location. 
> > > > > This is
> > > > > indicated by `noalias` keyword at the return value of the `new` call 
> > > > > (_Znwm).
> > > > > 
> > > > > According to Clang's Language Reference:
> > > > > "On function return values, the noalias attribute indicates that the
> > > > > function acts like a system memory allocation function, returning a 
> > > > > pointer
> > > > > to allocated storage disjoint from the storage for any other object
> > > > > accessible to the caller."
> > > > > 
> > > > > Is this possible for GCC alias analysis pass?
> > > > 
> > > > >   MyClass c = a;
> > > > >   MyClass *b = new MyClass;
> > > > >   *b = c;
> > > > 
> > > > the point is that 'new' can alter the value of 'a', GCC already knows 
> > > > that
> > > > 'b' is distinct from c and a but that's not the relevant thing.  It 
> > > > looks
> > > > like LLVM creates wrong-code here.
> > > 
> > > In what case can 'new' alter 'a'? I thought memory allocation functions 
> > > such as
> > > 'malloc, 'calloc' and 'new' cannot alias other memory locations than its 
> > > return
> > > value.
> > 
> > 'new' can be overridden by the user, you can declare your own 
> > implementation that does fancy stuff behind the scenes, including
> > in the above case altering 'a'.  Welcome to C++ ...
> 
> I assume you are referring to this case: https://godbolt.org/z/z4Y7YdxWE
> 
> Clang indeed assumes that 'new' is non-alias and this feature can be turned 
> off
> by using -fno-assume-sane-operator-new
> 
> However, can we safely assume that 'malloc' and 'calloc' are non-alias as 
> well?

Well, we do.  For the C++ new case we did and it did break real world
programs.

Reply via email to