This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PING PATCH, PR 57748] Set mode of structures with zero sized arrays to be BLK
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Wed, 28 Aug 2013 10:17:52 +0200 (CEST)
- Subject: Re: [PING PATCH, PR 57748] Set mode of structures with zero sized arrays to be BLK
- Authentication-results: sourceware.org; auth=none
- References: <20130802114531 dot GE2728 at virgil dot suse> <20130823151122 dot GC32344 at virgil dot suse> <20130823152923 dot GN1814 at tucnak dot redhat dot com> <20130827140342 dot GA3564 at virgil dot suse> <20130827140906 dot GI21876 at tucnak dot zalov dot cz> <alpine dot LNX dot 2 dot 00 dot 1308280959200 dot 20077 at zhemvz dot fhfr dot qr>
On Wed, 28 Aug 2013, Richard Biener wrote:
> On Tue, 27 Aug 2013, Jakub Jelinek wrote:
>
> > On Tue, Aug 27, 2013 at 04:03:42PM +0200, Martin Jambor wrote:
> > > On Fri, Aug 23, 2013 at 05:29:23PM +0200, Jakub Jelinek wrote:
> > > > On Fri, Aug 23, 2013 at 05:11:22PM +0200, Martin Jambor wrote:
> > > > > Hi Jakub and/or Joseph,
> > > > >
> > > > > the reporter of this bug seems to be very anxious to have it fixed in
> > > > > the repository. While Richi is away, do you think you could have a
> > > > > look? It is very small.
> > > >
> > > > Isn't this ABI incompatible change (at least potential on various targets)?
> > > > If so, then it shouldn't be applied to release branches, because it would
> > > > create (potential?) ABI incompatibility between 4.8.[01] and 4.8.2.
> > > >
> > >
> > > I don't know. I did a few attempts to observe a change in the calling
> > > convention of a function accepting a zero sized array terminated
> > > structure by value (on x86_64) but I did not succeed. On the other
> > > hand, I assume there are many other ways how a mode can influence ABI.
> > > So I'll try to have a look whether we can hack around this situation
> > > in 4.8's expr.c instead.
> >
> > All I remember that e.g. the number of regressions from PR20020 was big,
> > and any kind of TYPE_MODE changes are just extremely risky.
> > Perhaps x86_64 in the ABI decisions never uses mode, but we have tons of
> > other targets and it would surprise me if none of those were affected.
> >
> > > Nevertheless, is this patch ok for trunk?
> >
> > I'll defer that to Richard now that he is back ;)
>
> Eh ... :/
>
> I'm extremely nervous about this change. I also believe the change
> is unrelated to the issue in the bugreport (even if it happens to
> fix the ICE).
>
> Let me have a (short) look.
Everything looks ok up until
if (offset != 0)
{
enum machine_mode address_mode;
where we are supposed to factor in offset into the memory address.
This code doesn't handle the movmisalign path which has the memory
in 'mem' instead of in to_rtx.
And indeed a hack like
Index: gcc/expr.c
===================================================================
--- gcc/expr.c (revision 202043)
+++ gcc/expr.c (working copy)
@@ -4753,6 +4753,9 @@ expand_assignment (tree to, tree from, b
{
enum machine_mode address_mode;
rtx offset_rtx;
+ rtx saved_to_rtx = to_rtx;
+ if (misalignp)
+ to_rtx = mem;
if (!MEM_P (to_rtx))
{
@@ -4785,6 +4788,11 @@ expand_assignment (tree to, tree from, b
to_rtx = offset_address (to_rtx, offset_rtx,
highest_pow2_factor_for_target (to,
offset));
+ if (misalignp)
+ {
+ mem = to_rtx;
+ to_rtx = saved_to_rtx;
+ }
}
/* No action is needed if the target is not a memory and the field
fixes the testcase and results in (at -O)
foo:
.LFB1:
.cfi_startproc
pushq %rbx
.cfi_def_cfa_offset 16
.cfi_offset 3, -16
movq %rdi, %rbx
call get_i
cltq
addq $1, %rax
salq $4, %rax
movdqa .LC0(%rip), %xmm0
movdqu %xmm0, (%rbx,%rax)
popq %rbx
.cfi_def_cfa_offset 8
ret
exactly what is expected.
Martin, do you want to audit the (few) places we do the movmisalign
game for the same problem or shall I put it on my TODO? The audit
should look for all MEM_P (to_rtx) tests which really should look
at 'mem' for the unaligned move case (I see a volatile bitfiled
case for example ...).
Still need to figure a "nice" way to restructure the code ...
Any ideas?
Thanks,
Richard.