I need a sanity check here.

Given this code:

> typedef union { long double value; unsigned int word[4]; } memory_long_double;
> static unsigned int ored_words[4];
> static void add_to_ored_words (long double x)
> {
>   memory_long_double m;
>   size_t i;
>   memset (&m, 0, sizeof (m));
>   m.value = x;
>   for (i = 0; i < 4; i++)
>     {
>       ored_words[i] |= m.word[i];
>     }
> }
> 

DSE is removing the memset as it thinks the assignment to m.value is
going to set the entire union.

But when we translate that into RTL we use XFmode:

> ;; m.value ={v} x_6(D);
> 
> (insn 7 6 0 (set (mem/v/j/c:XF (plus:DI (reg/f:DI 77 virtual-stack-vars)
>                 (const_int -16 [0xfffffffffffffff0])) [2 m.value+0 S16 A128])
>         (reg/v:XF 86 [ x ])) "j.c":13:11 -1
>      (nil))
> 

That (of course) only writes 80 bits of data because of XFmode, leaving
48 bits uninitialized.  We then read those bits, or-ing the
uninitialized data into ored_words and all hell breaks loose later.

Am I losing my mind?  ISTM that dse and the expander have to agree on
how much data is written by the store to m.value.

Jeff

Reply via email to