http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60092
--- Comment #9 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 #8 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > (In reply to Richard Biener from comment #7) > > According to the specification this is wrong. Note that changing errno > > is hindering optimization. For example > > > > int foo (int *p) > > { > > *p = 1; > > malloc (4); > > return *p; > > } > > > > cannot CSE *p because p may point to errno. (works for float *p and > > works when using posix_memalign with my patch) > > Well, e.g. > http://pubs.opengroup.org/onlinepubs/007904975/functions/posix_memalign.html > says nothing about errno, I think only functions which explicitly document not > to clobber errno may not, all other functions may, but it's value is undefined > after the call. For calls that are documented to change errno in some cases, > it is again defined only if those calls return a particular value (e.g. -1), > otherwise errno is still undefined. Ok, my manpage says RETURN VALUE aligned_alloc(), memalign(), valloc(), and pvalloc() return a pointer to the allocated memory, or NULL if the request fails. posix_memalign() returns zero on success, or one of the error values listed in the next section on failure. Note that errno is not set. so that must be incorrect. If the value of errno is undefined after posix_memalign that doesn't help us as we then still cannot CSE.