[LLVMdev] ConstantFold 'undef xor undef'

Jianzhou Zhao
Wed, 07 Jul 2010 02:07:52 -0000

On Tue, Jul 6, 2010 at 8:34 PM, Chris Lattner <clattner at apple.com>
wrote:
>
> On Jul 6, 2010, at 3:37 PM, Jianzhou Zhao wrote:
>
>> Which semantics is better? I guess both are fine because if we assume
>> these two def's are same, then it is 0 as
>> 'ConstantFoldBinaryInstruction', while if we assume they are
different
>> then it is equal to undef. But the second case seems to include the
>> first one. If we let undef xor undef to be undef, later we can use
>> this undef as 0, but also other values w.r.t contexts. Is there any
>> reason that ConstantFoldBinaryInstruction uses the first assumption?
>
> The right answer is that undef ^ undef = undef.  Folding it to 0 is a
conservatively correct approximation of undef.  This is done because
(annoyingly) a lot of people write things like this:
>
> int x;
> x = x^x;
>
> As a "clever" way of clearing out x, particularly for vectors
which don't have a convenient 0 literal.  This is nonsense, but common
enough to try to not completely break.

Does this also apply to two different variables? say
   int z x y;
   z = x ^ y;
If ConstantFoldBinaryInstruction also folds x ^ y into z, should this
pass (which uses ConstantFold) also initialize x and y with a same
initial value? Otherwise at runtime z may not be 0.

>
> -Chris



--
Jianzhou