On December 20, 2019 3:20:40 AM GMT+01:00, Jeff Law <l...@redhat.com> wrote:
>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.

It looks like MEM_SIZE is wrong here, so you need to figure how we arrive at 
this (I guess TYPE_SIZE vs. MODE_SIZE mismatch is biting us here?)

That is, either the MEM should have BLKmode or the mode size should match
MEM_SIZE. Maybe DSE can avoid looking at MEM_SIZE for non-BLKmode MEMs? 

Richard. 

>
>Jeff

Reply via email to