[llvm-dev] Need help in understanding llvm optimization

Craig Topper via llvm-dev
Sat, 11 Aug 2018 20:06:34 -0000

Neither 1e16 or 1e16+1 can be accurately represented in a double. The
largest integer than be accurately represented is 2^53. As the number gets
larger floating sacrifices precision in the lower digits. Because of this
1e16 and 1e16+1 end up having the same representation. So the result of
subtracting them is 0.0.

On Sat, Aug 11, 2018 at 12:30 PM SANGEETA CHOWDHARY via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi,
>
> I have below code in C -
>
> int main() {
>
>   double x,y;
>
>   x = 1e16;
>
>   y = (x + 1) - x;
>
>   printf("y:%e\n", y);
>
>   return 0;
>
> }
>
> llvm bitcode looks like this for this function -
>
>
> ; Function Attrs: nounwind uwtable
>
> define dso_local i32 @main() local_unnamed_addr #0 {
>
> entry:
>
>   %call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4
> x i8], [4 x i8]* @.str, i64 0, i64 0), double 0.000000e+00)
>
>   ret i32 0
>
> }
>
> I am not able to understand how addition and subtraction are performed in
> this code. There is no fadd or fsub instruction. How llvm knows that result
> of y is 0?
>
> Is there any way to disable this in llvm?
>
>
> Any help would be much appreciated.
>
>
> Regards,
>
> Sangeeta
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
--
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20180811/4b1b85ed/attachment.html>