On Mon, Jul 7, 2025 at 11:33 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> On Tue, Jul 8, 2025 at 5:02 AM H.J. Lu <hjl.to...@gmail.com> wrote:
> >
> > On Mon, Jul 7, 2025 at 11:08 PM Jason Merrill <ja...@redhat.com> wrote:
> > >
> > > On 7/1/25 5:36 PM, H.J. Lu wrote:
> > > > On Tue, Jul 1, 2025 at 9:37 PM Jason Merrill <ja...@redhat.com> wrote:
> > > >>
> > > >> On 6/30/25 7:03 PM, H.J. Lu wrote:
> > > >>> On Mon, Jun 30, 2025 at 10:36 PM Jason Merrill <ja...@redhat.com> 
> > > >>> wrote:
> > > >>>>
> > > >>>> On 6/28/25 7:00 AM, H.J. Lu wrote:
> > > >>>>> Since a backend may ignore user type alignment for arguments passed 
> > > >>>>> on
> > > >>>>> stack, check backend for argument alignment on stack when evaluating
> > > >>>>> __alignof.
> > > >>>>
> > > >>>> I assume that's reflected in DECL_ALIGN, so could we just add 
> > > >>>> PARM_DECL to
> > > >>>
> > > >>> No.  targetm.calls.function_arg_boundary may have special handling 
> > > >>> for it.
> > > >>
> > > >> Why wouldn't we adjust DECL_ALIGN of the PARM_DECL to reflect the 
> > > >> actual
> > > >> alignment of the argument?  Are you saying it could be different from
> > > >> one call to another?
> > > >
> > > > Function argument alignment is different from other places in memory if
> > > > the main variant type alignment is different:
> > >
> > > Yes, I understand that function parameter alignment can be different
> > > from other objects of that type.
> > >
> > > But since we have a PARM_DECL to represent that particular function
> > > parameter, it seems natural to represent that difference in the
> > > DECL_ALIGN of the PARM_DECL.  If you don't, its DECL_ALIGN is wrong.
> > >
> >
> > __alignof returns TYPE_ALIGN, not DECL_ALIGN.  For PARM_DECL,
> > TYPE_ALIGN may not be the same as DECL_ALIGN.
> >
>
> How about this patch?
>
> Since a backend may ignore type alignment for arguments passed on stack,
> call targetm.calls.function_arg_boundary to set DECL_ALIGN for PARM_DECL
> and change __alignof to return DECL_ALIGN, instead of TYPE_ALIGN, for
> PARM_DECL.

I don't think this will work out correctness-wise.  You'd have to patch up
all places.  Also we might turn a reference to the PARM_DECL into
a dereference of its address.  So we rely on the fact that TYPE_ALIGN
is always more conservative than DECL_ALIGN which is not the case
you are caring about.

So no, I don't think this is good design.  Get the missed copy working instead.

Richard.

> gcc/
>
> PR target/120839
> * stor-layout.cc (do_type_align): Call
> targetm.calls.function_arg_boundary to set DECL_ALIGN for
> PARM_DECL.
>
> gcc/c-family/
>
> PR target/120839
> * c-common.cc (c_alignof_expr): Return DECL_ALIGN for PARM_DECL.
>
> gcc/testsuite/
>
> PR target/120839
> * gcc.target/i386/pr120839-1.c: New test.
> * gcc.target/i386/pr120839-2.c: Likewise.
>
> --
> H.J.

Reply via email to