> 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 > > 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. > > 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. Honza