This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR 16660, attribute((aligned)) doesn't work for variables on the stack for greater than required alignment
- From: Dorit Nuzman <DORIT at il dot ibm dot com>
- To: "Andrew Pinski" <pinskia at gmail dot com>
- Cc: "Andrew_Pinski at playstation dot sony dot com" <Andrew_Pinski at playstation dot sony dot com>, gcc-patches at gcc dot gnu dot org, "Richard Henderson" <rth at redhat dot com>, Russell_Olsen at playstation dot sony dot com, trevor_smigiel at playstation dot sony dot com
- Date: Tue, 9 Oct 2007 17:10:10 -0800
- Subject: Re: [PATCH] Fix PR 16660, attribute((aligned)) doesn't work for variables on the stack for greater than required alignment
Andrew,
Will this patch solve PR32893? (please see
http://gcc.gnu.org/ml/gcc-patches/2007-10/msg00202.html)
thanks,
dorit
> Ping?
>
> On 9/17/07, Andrew Pinski <pinskia@gmail.com> wrote:
> > Ping?
> >
> > On 8/28/07, Andrew Pinski <pinskia@gmail.com> wrote:
> > > Ping?
> > >
> > > On 8/4/07, Andrew Pinski <pinskia@gmail.com> wrote:
> > > > Ping?
> > > >
> > > > On 7/2/07, Andrew Pinski <pinskia@gmail.com> wrote:
> > > > > Ping?
> > > > >
> > > > > On 5/18/07, Andrew_Pinski@playstation.sony.com
> > > > > <Andrew_Pinski@playstation.sony.com> wrote:
> > > > > > Trevor Smigiel/R&D/SCEA@Playstation wrote on 05/17/2007
04:49:53 PM:
> > > > > >
> > > > > > > Andrew,
> > > > > > >
> > > > > > > It seems you missed merging a change that I made in our
> local tree.
> > > > > > >
> > > > > > > In cfgexpand.c, you removed this code:
> > > > > > >
> > > > > > > - /* Set alignment we actually gave this decl. */
> > > > > > > - offset -= frame_phase;
> > > > > > > - align = offset & -offset;
> > > > > > > - align *= BITS_PER_UNIT;
> > > > > > > - if (align > STACK_BOUNDARY || align == 0)
> > > > > > > - align = STACK_BOUNDARY;
> > > > > > > - DECL_ALIGN (decl) = align;
> > > > > > > - DECL_USER_ALIGN (decl) = 0;
> > > > > > >
> > > > > > > In our local tree that code is conditioned on
> > > > > > > if (!DECL_USER_ALIGN (decl))
> > > > > > > (Which could be done more precisely. Consider the case
> where a user
> > > > > > > specified alignment is smaller than the decl's actual
> alignment on the
> > > > > > > stack.)
> > > > > > >
> > > > > > > Without it less efficient code can be generated because
higher
> > > > > > > alignments are not propagated. At least, that's the
> behaviour on 4.1.1.
> > > > > >
> > > > > > Here is the new patch which fixes that problem and we get
> the get the
> > > > > > correct alignment on the variables now that we were
> getting a smaller
> > > > > > alignment on with my older version of the patch. It adds
> a testcase which
> > > > > > verifies this is the case too (I only check on
> ia32/x86_64, powerpc* and
> > > > > > spu as those are the only targets which I know the normal
> alignment of
> > > > > > stack is and the only targets I could test the testcase on).
> > > > > >
> > > > > > OK? Bootstrapped and tested on i686-linux-gnu with no
regressions.
> > > > > >
> > > > > > Thanks,
> > > > > > Andrew Pinski
> > > > > >
> > > > > > ChangeLog:
> > > > > >
> > > > > > * expr.h (allocate_dynamic_stack_space_1): New
function
> > > > > > prototype.
> > > > > > * functionc.c (assign_temp): Take into account
thealignment
> > > > > > of the temp if it is greater than the target's
preferred
> > > > > > alignment.
> > > > > > * cfgexpand.c: Include optabs.h.
> > > > > > (get_decl_align_unit): Update comment and don't lower
the
> > > > > > alignment
> > > > > > if it is greater than the target's preferred alignment.
> > > > > > (alloc_stack_frame_space): Take an unsigned
> HOST_WIDE_INT for
> > > > > > align.
> > > > > > Take into account the variable's alignment if it
> is greater than
> > > > > > the target's preferred alignment.
> > > > > > (expand_one_stack_var_at): Likewise. Only reset
> the alignment of
> > > > > > the decl to given
> > > > > > alignment if the alignment is less than the
> target's preferred
> > > > > > alignment.
> > > > > > * explow.c (allocate_dynamic_stack_space_1): Split out
from
> > > > > > allocate_dynamic_stack_space and take into acount
> the required
> > > > > > alignment. Use AND opcode instead of shifting
> left and shifting
> > > > > > back right.
> > > > > > (allocate_dynamic_stack_space): Call
> > > > > > allocate_dynamic_stack_space_1.
> > > > > > * Makefile.in (cfgexpand.o): Update dependecies.
> > > > > > * stmt.c (expand_decl): Take into account the
alignment
> > > > > > of the variable if it is greater than the
target'spreferred
> > > > > > alignment.
> > > > > > * config/i386/i386.c (ix86_compute_frame_layout):
> Don't assert
> > > > > > that preferred alignment is greater than the
> normal preferred
> > > > > > alignment. Don't assert that the stack alignment
needed is
> > > > > > greater
> > > > > > than the normal preferred alignment.
> > > > > >
> > > > > > * gcc.c-torture/execute/pr16660-1.c: New testcase.
> > > > > > * gcc.c-torture/execute/pr16660-2.c: New testcase.
> > > > > > * gcc.dg/pr16660-1.c: New testcase.
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
> [attachment "fixpr16660.diff.txt" deleted by Dorit Nuzman/Haifa/IBM]