On Wed, Feb 12, 2014 at 10:30:01AM +0100, Richard Biener wrote: > Bah. I am testing the following.
But then there is no guarantee that ptr is aligned after the call. char buf[32] __attribute__((aligned (32))); int foo (void) { void *ptr = buf + 1; posix_memalign (&ptr, 32, -1); /* Assume posix_memalign has failed. */ return ((__UINTPTR_TYPE__)ptr) & 31; } This should return 1, but supposedly doesn't with the optimization. So, either we need to revert the lowering, or perhaps do it only if the original posix_memalign has a lhs and do it like: void *tmp; int res = posix_memalign (&tmp, align, size); if (!res) ptr = __builtin_assume_aligned (tmp, align); or so (no need to initialize tmp and copy it back for the failure case, but perhaps it would result in better code). Jakub