<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=us-ascii">
<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;
text-align:justify;
font-size:10.5pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
span.EmailStyle19
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;}
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" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">It’s the same in the sense that “(float)log10((double)x))” is a legal implementation of “log10f(x)”. If you want to actually get the same result that libm would produce at runtime, you can’t constant-fold
at all. It’s impossible to predict what libm will produce: the specification is just “some value within a couple ulps of the mathematical result”.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">More in-depth discussion on </span>
<a href="https://bugs.llvm.org/show_bug.cgi?id=46376">https://bugs.llvm.org/show_bug.cgi?id=46376</a> .<span style="font-size:11.0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">-Eli<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left"><b><span style="font-size:11.0pt">From:</span></b><span style="font-size:11.0pt"> llvm-dev <llvm-dev-bounces@lists.llvm.org>
<b>On Behalf Of </b>jingduanyang via llvm-dev<br>
<b>Sent:</b> Tuesday, August 11, 2020 5:05 AM<br>
<b>To:</b> llvm-dev@lists.llvm.org<br>
<b>Cc:</b> Chengwei (Stephenia) <chen.chengwei@huawei.com><br>
<b>Subject:</b> [EXT] [llvm-dev] ConstantFoldFP always calls double version library functions<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">Hello,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">When llvm does constant folding on a math library function call with constant argument, it seems
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">the double version of library function is called no matter the original function is single or double
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">precision. Code can be found in lib/Analysis/ConstantFolding.cpp in various functions like ConstantFoldScalarCall1().
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">There is a comment that seems explaining why this choice was made:<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:teal;background:white;mso-highlight:white;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:teal;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">/// Currently APFloat versions of these functions do not exist, so we use<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:teal;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">/// the host native double versions. Float versions are not called<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:teal;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">/// directly but for all these it is true (float)(f((double)arg)) ==<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-size:10.0pt;font-family:"Courier New";color:teal;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">/// f(arg). Long double not supported yet.</span><span style="mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">However we do have a float version exposed by math.h? And the assumption that converting parameter
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">to double and then converting result back to float gives the same result is not always true. For example<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">the following code has different result under –O3 (ConstantFoldFP calls log10 at compile time) and –O0 –lm:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:#804000;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">#include <math.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:#804000;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">#include <stdio.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:#8000FF;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">int</span><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">
main</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">()</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">{</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN"> printf</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">(</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:gray;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">"%.7f\n"</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">,</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">
log10f</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">(</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:#FF8000;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">0.7177198578332612</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">));</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="margin-left:.5in;text-align:left;text-autospace:none">
<span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">
</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:blue;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">return</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">
</span><span style="font-size:10.0pt;font-family:"Courier New";color:#FF8000;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">0</span><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">;</span></b><span style="font-size:10.0pt;font-family:"Courier New";color:black;background:white;mso-highlight:white;mso-fareast-language:ZH-CN"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;background:white;mso-highlight:white;mso-fareast-language:ZH-CN">}</span></b><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;mso-fareast-language:ZH-CN"><o:p></o:p></span></b></p>
<p class="MsoNormal" style="margin-left:.5in"><b><span style="font-size:10.0pt;font-family:"Courier New";color:navy;mso-fareast-language:ZH-CN"><o:p> </o:p></span></b></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">Could someone explain to me the current implementation choices of folding library function calls?<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">Or if let me know if I misunderstood anything. Any help is appreciated.<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN"><o:p> </o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="mso-fareast-language:ZH-CN">Duanyang<o:p></o:p></span></p>
</div>
</body>
</html>