On Fri, Mar 22, 2013 at 11:06:53AM +0100, Richard Biener wrote: > This fixes PR56434 - the use of BIGGEST_ALIGNMENT to annotate > the pointer returned by malloc is wrong - BIGGEST_ALIGNMENT > has nothing to do with the alignment guaranteed by the ABI > for allocated memory. For example on x86_64 it depends on > -mavx and thus can result in wrong code being generated. > > The following patch fixes it to use what we use on the > GIMPLE level - MALLOC_ABI_ALIGNMENT. > > Ok for trunk?
IMHO the change should be accompanied by defining MALLOC_ABI_ALIGNMENT on at least a couple of popular targets. E.g. glibc will guarantee at least 2 * sizeof (void *) alignment on all architectures, and even if one uses some other malloc implementation, it should be better ISO C99 conforming on Linux (perhaps ignoring long double type (known to be non-conforming e.g. on ppc32) and _Decimal* types). So, at least for Linux I'd say MALLOC_ABI_ALIGNMENT should be defined as maximum alignment of long, long long, double and void *. Because, right now, MALLOC_ABI_ALIGNMENT is only defined to non-__alignof__(char) on VMS. > 2013-03-22 Richard Biener <rguent...@suse.de> > > PR middle-end/56434 > * calls.c (expand_call): Use MALLOC_ABI_ALIGNMENT to annotate > the pointer returned by calls with ECF_MALLOC set. > > Index: gcc/calls.c > =================================================================== > --- gcc/calls.c (revision 196899) > +++ gcc/calls.c (working copy) > @@ -3186,7 +3186,7 @@ expand_call (tree exp, rtx target, int i > > /* The return value from a malloc-like function is a pointer. */ > if (TREE_CODE (rettype) == POINTER_TYPE) > - mark_reg_pointer (temp, BIGGEST_ALIGNMENT); > + mark_reg_pointer (temp, MALLOC_ABI_ALIGNMENT); > > emit_move_insn (temp, valreg); > Jakub