[llvm-dev] undef * 0
Sanjoy Das via llvm-dev
llvm-dev at lists.llvm.org
Tue Sep 13 10:27:34 PDT 2016
Soham Chakraborty wrote:
> As a result, the transformation ' ((a& (~b)) |((~a)& b)) ~> xor a b '
> is unsound. LLVM presently performs this transformation.
This transform looks fine to me.
For simplicity let's look at an `i1` expression. Since these are
bitwise ops we can extend the reasoning below to iN.
Transform: ((A & (~B)) | ((~A) & B)) ~> A ^ B
Neither A nor B are undef:
Transform is correct by normal boolean algebra
Both A and B are undef:
LHS = (undef & undef) | (undef & undef) = undef // Since ~undef = undef
RHS = undef
Thus transform is correct.
A is undef but B is not undef:
LHS = ((undef & (~B)) | (undef & B)) // Since ~undef = undef
Now, by choosing 0 for undef in LHS, we can make LHS be equal to 0,
and by choosing 1 for undef in LHS, we can make LHS be equal to 1.
LHS = undef
RHS = undef ^ B = undef
Thus the transform is correct.
A is not undef but B is undef:
Similar reasoning follows.
More information about the llvm-dev