<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi Akash,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This isn’t well-documented in most references, but the C99 and C11 standards say that you can only modify the floating point environment (as fesetround does) when access to the environment is enabled by #pragma STDC FENV_ACCESS ON. Some
 compilers provide other ways to control this, but the basic idea is that unless you’ve told the compiler that you’re changing the environment the compiler is free to assume the default environment. This fact is mentioned here (<a href="https://en.cppreference.com/w/c/numeric/fenv">https://en.cppreference.com/w/c/numeric/fenv</a>)
 but not in the corresponding documentation for fesetround.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Support for this is a work-in-progress in clang. Currently, you can enable fenv access using the “-ffp-model=strict” option. The -frounding-math option also works correctly now, but this was only recently enabled.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If you use one of these options, we will generate a call to llvm.experimental.constrained.rint for the code you cited and this will not get constant folded.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Andy<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b>From:</b> llvm-dev <llvm-dev-bounces@lists.llvm.org> <b>On Behalf Of
</b>Akash Banerjee via llvm-dev<br>
<b>Sent:</b> Thursday, January 30, 2020 3:43 AM<br>
<b>To:</b> llvm-dev <llvm-dev@lists.llvm.org><br>
<b>Subject:</b> [llvm-dev] Possibly incorrect transformation<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi,<o:p></o:p></p>
<div>
<p class="MsoNormal">Please consider the following C code snippet taken from the latest SVComp(Software Verification) Benchmark:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><b><span style="font-family:"Courier New"">#include <fenv.h><br>
#include <math.h><br>
int main(void) {<br>
fesetround(FE_DOWNWARD);<br>
assert(rint(12.9) == 12.);<br>
assert(rint(-12.1) == -13.);<br>
return 0;<br>
}</span></b><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">The above code is marked as SAFE by the svcomp benchmark, ie, the assert can never fail.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">The corresponding LLVM-IR for the above code is:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">define dso_local i32 @main() #0 {<br>
<b><span style="font-family:"Courier New"">entry:<br>
  %retval = alloca i32, align 4<br>
  store i32 0, i32* %retval, align 4<br>
  %call = call i32 @fesetround(i32 1024) #4<br>
  %0 = call double @llvm.rint.f64(double 1.290000e+01)<br>
  %cmp = fcmp oeq double %0, 1.200000e+01<br>
  %conv = zext i1 %cmp to i32<br>
  %call1 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %conv)<br>
  %1 = call double @llvm.rint.f64(double -1.210000e+01)<br>
  %cmp2 = fcmp oeq double %1, -1.300000e+01<br>
  %conv3 = zext i1 %cmp2 to i32<br>
  %call4 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %conv3)<br>
  ret i32 0<br>
},</span></b><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Arial",sans-serif">however on applying the
<i>-ipsccp -dce, </i>optimization passes, the transformed IR is:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><b><span style="font-family:"Courier New"">define dso_local i32 @main() #0 {<br>
entry:<br>
  %retval = alloca i32, align 4<br>
  store i32 0, i32* %retval, align 4<br>
  %call = call i32 @fesetround(i32 1024) #4<br>
  %call1 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 0)<br>
  %call4 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 0)<br>
  ret i32 0<br>
}</span></b><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">, where the assert calls have been made false.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Akash.<o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>