On Tue, 13 Oct 2015, Alexandre Oliva wrote: > On Oct 9, 2015, Jan Hubicka <hubi...@ucw.cz> wrote: > > > ... we initialize mode to be non-VOIDmode only if the field is not > > bitfield. I missed > > the flag while looking at the dump. Indeed the DECL_MODE if FIELD_DECL is > > SImode, > > but it is ignored. > > > Hmm, it seems that for CALL_EXPR the register is supposed to be non-BLKmode > > already. So I guess only what we need to do is to consider bifields when > > TEMP is blk mode and then we want to convert? what about this? > > How about using in store_bit_field the same logic you added to > store_expr_with_bounds to get input MEMs to have a compatible mode? > This patch was regstrapped on i686-linux-gnu and x86_64-linux-gnu. Ok > to install?
Ok. Thanks, Richard. > support BLKmode inputs for store_bit_field > > From: Alexandre Oliva <aol...@redhat.com> > > Revision 228586 changed useless_type_conversion_p and added mode > changes for MEM:BLKmode inputs in store_expr_with_bounds, but it > missed store_bit_field. This caused ada/rts/s-regpat.ads to fail > compilation on x86_64-linux-gnu. > > for gcc/ChangeLog > > * expmed.c (store_bit_field_1): Adjust mode of BLKmode inputs. > --- > gcc/expmed.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/gcc/expmed.c b/gcc/expmed.c > index 93cf508..69ea511 100644 > --- a/gcc/expmed.c > +++ b/gcc/expmed.c > @@ -757,6 +757,14 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT > bitsize, > } > } > > + /* We allow move between structures of same size but different mode. > + If source is in memory and the mode differs, simply change the memory. > */ > + if (GET_MODE (value) == BLKmode && GET_MODE (op0) != BLKmode) > + { > + gcc_assert (MEM_P (value)); > + value = adjust_address_nv (value, GET_MODE (op0), 0); > + } > + > /* Storing an lsb-aligned field in a register > can be done with a movstrict instruction. */ > > > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)