[Bug middle-end/60092] posix_memalign not recognized to derive alias and alignment info
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Thu Feb 6 15:03:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60092
--- Comment #14 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 6 Feb 2014, jakub at gcc dot gnu.org wrote:
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60092
>
> --- Comment #13 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to Richard Biener from comment #12)
> > (In reply to Andreas Schwab from comment #11)
> > > If a function is not allowed to change errno this must be explicitly
> > > documented.
> >
> > That means
> >
> > Index: gcc/tree-ssa-alias.c
> > ===================================================================
> > --- gcc/tree-ssa-alias.c.orig 2014-02-06 15:43:42.138266256 +0100
> > +++ gcc/tree-ssa-alias.c 2014-02-06 15:43:33.046266882 +0100
> > @@ -1847,7 +1847,9 @@ call_may_clobber_ref_p_1 (gimple call, a
> > ao_ref dref;
> > ao_ref_init_from_ptr_and_size (&dref, ptrptr,
> > TYPE_SIZE_UNIT (ptr_type_node));
> > - return refs_may_alias_p_1 (&dref, ref, false);
> > + return (refs_may_alias_p_1 (&dref, ref, false)
> > + || (flag_errno_math
> > + && targetm.ref_may_alias_errno (ref)));
> > }
> > /* Freeing memory kills the pointed-to memory. More importantly
> > the call has to serve as a barrier for moving loads and stores
> >
> > is necessary.
>
> For posix_memalign? I think errno can contain any value, except that library
> is not allowed to clear errno.
> So, IMHO *p = 1; posix_memalign (...); return *p; can be still optimized into
> return 1;, because if p = &errno; then *p after the call has undefined value
> (just known not to be zero).
But on allocation failure posix_memalign may set it to 2, no? So
for
errno = 0;
posix_memalign ()
errno = 0;
ptr = malloc ();
if (!ptr)
perror ();
we may not DSE the 2nd errno = 0 store.
Richard.
More information about the Gcc-bugs
mailing list