<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<div class="">I posted a review with a simple fix to this transform:</div>
<a href="https://reviews.llvm.org/D31182" class="">https://reviews.llvm.org/D31182</a>
<div class=""><br class="">
</div>
<div class="">Artur<br class="">
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div class="">On 20 Mar 2017, at 19:49, Artur Pilipenko via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
It looks like we already have a bug filed for this problem:
<div class=""><br class="">
</div>
<div class=""><a href="https://bugs.llvm.org//show_bug.cgi?id=27036" class="">https://bugs.llvm.org//show_bug.cgi?id=27036</a></div>
<div class=""><br class="">
</div>
<div class="">Artur</div>
<div class=""><br class="">
<div class="">
<blockquote type="cite" class="">
<div class="">On 20 Mar 2017, at 19:14, Stephen Canon <<a href="mailto:scanon@apple.com" class="">scanon@apple.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<div class="">I agree. There’s implementation-defined behavior on the conversion of (arg*58) to int, but that shouldn’t be at issue here. The transform of (float)x + 1 => (float)(x + 1) is bogus.</div>
<br class="">
<div class="">
<blockquote type="cite" class="">
<div class="">On Mar 20, 2017, at 10:41 AM, Sanjay Patel via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div dir="ltr" class="">
<div class="">Looks broken to me; I don't think there's UB in the original program.<br class="">
<br class="">
</div>
The fold in visitFAdd() should check if the sitofp is guaranteed to produce an exact result? Ie, if the int value input to the sitofp could possibly be different when converted back using fptosi, then the transform does not work.<br class="">
<br class="">
define float @test(i32 %x) {<br class="">
  %mul = mul i32 %x, 58<br class="">
  %conv = sitofp i32 %mul to float<br class="">
  %add = fadd float %conv, 1.0<br class="">
  ret float %add<br class="">
}<br class="">
<br class="">
</div>
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Mon, Mar 20, 2017 at 4:25 AM, Artur Pilipenko <span dir="ltr" class="">
<<a href="mailto:apilipenko@azul.com" target="_blank" class="">apilipenko@azul.com</a>></span> wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This C program produces different results with -O0 and -O3 optimization levels.<br class="">
<br class="">
#include <stdio.h><br class="">
float test(unsigned int arg) {<br class="">
    return (float)((int)(arg * 58)) + 1;<br class="">
}<br class="">
int main() {<br class="">
    printf("%d\n", (int)test((unsigned int)-831710640));<br class="">
}<br class="">
<br class="">
O0 result is -994576896<br class="">
O3 result is -994576832<br class="">
<br class="">
It happens because LLVM (specifically instcombine) does the following transformation:<br class="">
(float)x + 1.0 => (float)(x + 1)<br class="">
<br class="">
For some values the expression before and after yield different results:<br class="">
                  x = -994576864<br class="">
         (float)x = -994576896.000000<br class="">
(float)x + 1.0 = -994576896.000000<br class="">
(float)(x + 1) = -994576832.000000<br class="">
<br class="">
I’m curious if this is a correct transformation and why.<br class="">
<span class="HOEnZb"><font color="#888888" class=""><br class="">
Artur<br class="">
<br class="">
</font></span></blockquote>
</div>
<br class="">
</div>
_______________________________________________<br class="">
LLVM Developers mailing list<br class="">
<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br class="">
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
_______________________________________________<br class="">
LLVM Developers mailing list<br class="">
<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class="">
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</body>
</html>