On Sun, 18 Sep 2016, Jan Hubicka wrote:

> > Hi,
> > 
> >  > when expanding code for
> >  > struct a {short a,b,c,d;} *a;
> >  > a->c;
> >  >
> >  > we first produce correct BLKmode MEM rtx representing the whole
> >  > structure *a,
> >  > then we use adjust_address to turn it into HImode MEM and finally
> >  > extract_bitfield is used to offset it by 32 bits to get correct value.
> > 
> > I tried to create a test case as follows and stepped thru the code.
> > 
> > cat test.c
> > struct a {short a,b,c,d;};
> > void foo (struct a *a)
> > {
> >    a->c = 1;
> > }
> > 
> > 
> > First I get a DImode MEM rtx not BLKmode:
> > 
> > (mem:DI (reg/f:DI 87) [2 *a_2(D)+0 S8 A16])
> > 
> > and adjust_address does not clear the MEM_EXPR

it's only cleared when later offsetted

> > thus to_rtx = adjust_address (to_rtx, mode1, 0) returns:
> > 
> > (mem:HI (reg/f:DI 87) [2 *a_2(D)+0 S2 A16])
> > 
> > and then set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos) does:
> > 
> > (mem:HI (reg/f:DI 87) [3 a_2(D)->c+-4 S6 A16])
> > 
> > which looks perfectly OK.

Sure you quoted the correct RTL?  MEM_SIZE == 6 looks wrong.  Note
we don't do set_mem_attributes_minus_bitpos when we go the bitfield
extraction path.

> > 
> > But with your patch the RTX looks different:
> > 
> > (mem:DI (reg/f:DI 87) [3 a_2(D)->c+-4 S6 A16])
> > 
> > which looks inconsistent, and not like an improvement.
> 
> Hmm,
> the memory reference does point to a_2(D)->c+-4 so I would say it is OK.  The
> memory refernece is not adjusted yet to be reg87+4 and this is where memory
> attributes got lost for me (because the pointer becames out of range of 
> (mem:HI
> (reg87))).  I see this does not happen on x86_64, I will try to see why
> tomorrow.

I think if you don't go the bitfield path nothing ends up chaning the
mode.  The inconsistency is for MEM_SIZE vs. GET_MODE of the MEM.

mem:DI certainly looks wrong for a HImode access.

Richard.

Reply via email to