On Thu, Jul 21, 2011 at 10:00 PM, H.J. Lu <[email protected]> wrote:
>> /* Represents viewing something of one type as being of a second type.
>> This corresponds to an "Unchecked Conversion" in Ada and roughly to
>> the idiom *(type2 *)&X in C. The only operand is the value to be
>> viewed as being of another type. **It is undefined if the type of the
>> input and of the expression have different sizes.**
>>
>> ...
>> DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", tcc_reference, 1)
>>
>> We have:
>>
>> <bb 2>:
>> D.2709_8 = VIEW_CONVERT_EXPR<double>(&xxxx);
>> D.2702_1 = u.d;
>> D.2704_3 = D.2702_1 == D.2709_8;
>> D.2701_4 = (int) D.2704_3;
>> return D.2701_4;
>>
>> Where
>>
>> sizeof (double) = 64
>> sizeof (ptr_type) = 32.
>>
>
> Are you sure that you used -mx32? I couldn't reproduce it.
> It looks like an x86 backend bug to me.
Hm, can't reproduce it anymore... x32 -O2 looks OK:
<bb 2>:
v = {};
v.m = &xxxx;
D.2702_1 = u.d;
D.2703_2 = v.d;
D.2704_3 = D.2702_1 == D.2703_2;
D.2701_4 = (int) D.2704_3;
return D.2701_4;
}
Expand generates:
(insn 8 6 9 (set (reg:SI 68)
(symbol_ref:SI ("xxxx") [flags 0x40] <var_decl 0x7fccc360b140 xxxx>)) p
r49798.c:12 -1
(nil))
(insn 9 8 10 (set (reg:DI 67)
(zero_extend:DI (reg:SI 68))) pr49798.c:12 -1
(nil))
I don't know if this is OK to be transformed to DImode load.
Uros.