On Wed, Mar 9, 2011 at 10:58 AM, Jakub Jelinek <ja...@redhat.com> wrote: > On Wed, Mar 09, 2011 at 10:55:39AM +0100, Richard Guenther wrote: >> On Wed, Mar 9, 2011 at 9:40 AM, Eric Botcazou <ebotca...@adacore.com> wrote: >> >> and as t isn't AGGREGATE_TYPE nor COMPLEX_TYPE and is a decl, >> >> it is marked MEM_SCALAR_P and e.g. set_mem_attributes_minus_bitpos >> >> once MEM_SCALAR_P is set doesn't change it to MEM_IN_STRUCT_P >> >> because of BIT_FIELD_REF etc. The BIT_FIELD_REF <t, 32, *> = 1 >> >> stores are done through store_field though, and for some reason >> >> the code sets MEM_IN_STRUCT_P in that codepath unconditionally. >> > >> > The irony of marking something scalar when its type is VECTOR_TYPE... >> > >> >> Changing this fixes the testcase, bootstrapped/regtested on x86_64-linux >> >> and i686-linux. I'll try to test this on ia64-linux tomorrow. >> >> >> >> 2011-03-08 Jakub Jelinek <ja...@redhat.com> >> >> >> >> PR rtl-optimization/47866 >> >> * expr.c (store_field): If MEM_SCALAR_P (target), don't use >> >> MEM_SET_IN_STRUCT_P (to_rtx, 1), just set MEM_IN_STRUCT_P (to_rtx) >> >> if target wasn't scalar. >> > >> > I cannot formally approve, but I think it's the way to go. >> >> Yes, this is ok. > > In the posted form or in the proposed. ia64-linux base regtest is still > pending, once it finishes will bootstrap/regtest whatever patch you prefer.
The patch below is ok. Thanks, Richard. > 2011-03-09 Jakub Jelinek <ja...@redhat.com> > > PR rtl-optimization/47866 > * expr.c (store_field): If MEM_SCALAR_P (target), don't use > MEM_SET_IN_STRUCT_P (to_rtx, 1), just set MEM_IN_STRUCT_P (to_rtx) > if target wasn't scalar. > * function.c (assign_stack_temp_for_type): Assert that neither > MEM_SCALAR_P nor MEM_IN_STRUCT_P is set previously, set either > MEM_IN_STRUCT_P or MEM_SCALAR_P instead of using MEM_SET_IN_STRUCT_P > macro. > * rtl.h (MEM_SET_IN_STRUCT_P): Removed. > > --- gcc/expr.c.jj 2011-02-04 16:45:02.000000000 +0100 > +++ gcc/expr.c 2011-03-08 20:49:19.531545778 +0100 > @@ -5924,7 +5924,8 @@ store_field (rtx target, HOST_WIDE_INT b > if (to_rtx == target) > to_rtx = copy_rtx (to_rtx); > > - MEM_SET_IN_STRUCT_P (to_rtx, 1); > + if (!MEM_SCALAR_P (to_rtx)) > + MEM_IN_STRUCT_P (to_rtx) = 1; > if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0) > set_mem_alias_set (to_rtx, alias_set); > > --- gcc/function.c.jj 2011-03-04 19:39:17.000000000 +0100 > +++ gcc/function.c 2011-03-09 09:52:47.428670935 +0100 > @@ -942,8 +942,11 @@ assign_stack_temp_for_type (enum machine > if (type != 0) > { > MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type); > - MEM_SET_IN_STRUCT_P (slot, (AGGREGATE_TYPE_P (type) > - || TREE_CODE (type) == COMPLEX_TYPE)); > + gcc_checking_assert (!MEM_SCALAR_P (slot) && !MEM_IN_STRUCT_P (slot)); > + if (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE) > + MEM_IN_STRUCT_P (slot) = 1; > + else > + MEM_SCALAR_P (slot) = 1; > } > MEM_NOTRAP_P (slot) = 1; > > --- gcc/rtl.h.jj 2011-02-28 18:02:20.000000000 +0100 > +++ gcc/rtl.h 2011-03-09 09:48:58.858400436 +0100 > @@ -1279,24 +1279,6 @@ do { > \ > #define MEM_NOTRAP_P(RTX) \ > (RTL_FLAG_CHECK1("MEM_NOTRAP_P", (RTX), MEM)->call) > > -/* If VAL is nonzero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in > - RTX. Otherwise, vice versa. Use this macro only when you are > - *sure* that you know that the MEM is in a structure, or is a > - scalar. VAL is evaluated only once. */ > -#define MEM_SET_IN_STRUCT_P(RTX, VAL) \ > -do { \ > - if (VAL) \ > - { \ > - MEM_IN_STRUCT_P (RTX) = 1; \ > - MEM_SCALAR_P (RTX) = 0; \ > - } \ > - else \ > - { \ > - MEM_IN_STRUCT_P (RTX) = 0; \ > - MEM_SCALAR_P (RTX) = 1; \ > - } \ > -} while (0) > - > /* The memory attribute block. We provide access macros for each value > in the block and provide defaults if none specified. */ > #define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1) > > > Jakub >