[llvm-dev] undef * 0
soham chakraborty via llvm-dev
llvm-dev at lists.llvm.org
Tue Sep 13 02:14:13 PDT 2016
Thanks for your answers.
Another example of unsound transformation on Boolean algebra.
According to the LLVM documentation (
http://llvm.org/docs/LangRef.html#undefined-values) it is unsafe to
consider ' a & undef = undef ' and ' a | undef = undef ' but 'undef xor
undef = undef' is safe.
Now, given an expression ((a & (~b)) | ((~a) & b)) where a and b are undef
expressions, the value must be specialized to some constant (e.g. 0).
But, if the expression is transformed to $a xor b$ then it may return
'undef'.
As a result, the transformation ' ((a & (~b)) |((~a) & b)) ~> xor a b '
is unsound. LLVM presently performs this transformation.
Best Regards,
soham
source
----------
int foo(){
int a,b; // unintialized and 'undef'
return ((a & (~b)) |((~a) & b));
}
unoptimized IR // clang++ -emit-llvm udf.cpp -S
----------------------
define i32 @_Z3foov() #0 {
entry:
%a = alloca i32, align 4
%b = alloca i32, align 4
%0 = load i32, i32* %a, align 4
%1 = load i32, i32* %b, align 4
%neg = xor i32 %1, -1
%and = and i32 %0, %neg
%2 = load i32, i32* %a, align 4
%neg1 = xor i32 %2, -1
%3 = load i32, i32* %b, align 4
%and2 = and i32 %neg1, %3
%or = or i32 %and, %and2
ret i32 %or
}
Here %or must return some constant e.g. 0.
optimized IR // opt -O3 udf.ll -S
-------------------
define i32 @_Z3foov() #0 {
entry:
ret i32 undef
}
On Tue, Sep 13, 2016 at 7:39 AM, Sanjoy Das <sanjoy at playingwithpointers.com>
wrote:
> Sanjoy Das wrote:
> > Here is a simpler example of a similar issue: `X - X` is not
> > equivalent `0`, in that `0` cannot be replaced with `X - X`, even
> > though `X - X` can be folded to `0`.
>
> I forgot to state that `X` above is some unknown value which can
> potentially be `undef`. A full example would be:
>
> ```
> define i32 @f_0(i32 %x) {
> ret i32 0
> }
>
> define i32 @f_1(i32 %x) {
> %v = sub i32 %x, %x
> ret i32 %v
> }
> ```
>
> `@f_1` can be optimized to `@f_0` but not vice versa, unless you
> somehow know that `%x` cannot be `undef`.
>
> -- Sanjoy
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160913/bb2331bc/attachment.html>
More information about the llvm-dev
mailing list