> 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.  I'd also delete 
the confusing macro MEM_SET_IN_STRUCT_P altogether and replace its only other 
use (in assign_stack_temp_for_type) with the manual equivalent, as is already 
done in set_mem_attributes_minus_bitpos.

-- 
Eric Botcazou

Reply via email to