On Fri, Jul 4, 2025 at 10:33 AM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> On Fri, Jul 4, 2025 at 4:28 PM Richard Biener
> <richard.guent...@gmail.com> wrote:
> >
> > On Fri, Jul 4, 2025 at 10:21 AM H.J. Lu <hjl.to...@gmail.com> wrote:
> > >
> > > On Fri, Jul 4, 2025 at 4:10 PM H.J. Lu <hjl.to...@gmail.com> wrote:
> > > >
> > > > On Fri, Jul 4, 2025 at 4:09 PM H.J. Lu <hjl.to...@gmail.com> wrote:
> > > > >
> > > > > On Fri, Jul 4, 2025 at 4:02 PM Richard Biener
> > > > > <richard.guent...@gmail.com> wrote:
> > >
> > > > > >
> > > > >
> > > > >   /* If we can't trust the parm stack slot to be aligned enough for 
> > > > > its
> > > > >      ultimate type, don't use that slot after entry.  We'll make 
> > > > > another
> > > > >      stack slot, if we need one.  */
> > > > >   if (stack_parm
> > > > >       && ((GET_MODE_ALIGNMENT (data->nominal_mode) > MEM_ALIGN 
> > > > > (stack_parm)
> > > > >            && ((optab_handler (movmisalign_optab, data->nominal_mode)
> > > > >                 != CODE_FOR_nothing)
> > > > >                || targetm.slow_unaligned_access (data->nominal_mode,
> > > > >                                                  MEM_ALIGN 
> > > > > (stack_parm))))
> > > > >           || (data->nominal_type
> > > > >               && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN 
> > > > > (stack_parm)
> > >
> > > This is true.
> > >
> > > > >               && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))
> > >
> > > This is false as both are 16 bytes.  This means that we only make a copy 
> > > if the
> > > argument alignment < 16 bytes and the desired alignment > the argument
> > > alignment.
> > > It isn't the case here.
> >
> > I don't know the exact history of this code (I just was aware we have
> > such code), nor
> > the reasoning for this exception.  IMO this is a correctness issue, I
> > could understand
> > < BIGGEST_ALIGNMENT or so (no possible move insn could require bigger
> > alignment),
> > but even then the GIMPLE optimizers could have taken advantage of
> > bigger alignment
> > (for example the vectorizer happily will, emitting aligned moves).
> >
> > Having a copy is less than ideal, of course.  If the alignment on the
> > type is never
> > too big (see test coverage in my other mail) then we could argue to ignore
> > DECL_ALIGN on PARM_DECLs and instead set that to what the target thinks
> > in the first place when creating the decl.
> >
>
> Or we can change the C frontend to behave like the C++ frontend,
> regarding the alignment attribute.  With the change at:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120900#c10
>
> I got the following regressions:
>
> FAIL: c-c++-common/builtin-has-attribute-7.c  -Wc++-compat  (test for
> excess errors)
> FAIL: gcc.dg/sso-4.c  (test for errors, line 18)
> FAIL: gcc.dg/sso-4.c  (test for errors, line 19)
>
> with the change above.

struct S { long i; long j; };
typedef long v2di __attribute__((vector_size(16)));
void foo (struct S a __attribute__((aligned(16))), long *q)
{
  *(v2di *)q = *(v2di *) &a;
}

is rejected for both the C and the C++ frontend with

t.c:3:20: error: alignment may not be specified for ‘a’

so IMO it is inconsistent to have DECL_USER_ALIGN on a PARM_DECL
(or DECL_ALIGN not matching that of its type).

Richard.

>
> --
> H.J.

Reply via email to