<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;}
@font-face
        {font-family:"Book Antiqua";
        panose-1:2 4 6 2 5 3 5 3 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Book Antiqua",serif;
        color:#1F497D;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
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-IE link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>Hi Mehdi,<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>The ISO C specification does permit the math functions to modify ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’, but I thought that the ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>-fno-math-errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’  option was to tell the optimiser to assume that ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ is not modified by the math functions.  Explicitly providing ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>-fno-math-errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ is not restoring the elision optimisation that was performed by LLVM v3.8, and this is really only a driver option, with ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>-fmath-errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ passed onto CC1 if ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>MathErrno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ is true, and omitted if false.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>I certainly agree that if ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>MathErrno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ is true, then the compiler should not elide the call as it has to assume that there are memory write side-effects.  It already models the math functions as built-ins and determine the expected answer when the arguments are constants, and elides the tests in the simple example below - all this is good, and when I use ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>-fno-builtin</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ it stops correctly disabled this optimisation.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>I modified my sources to force ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>readnone</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ and even tried ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>setDoesNotAccessMemory()</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ on the math functions, but this still results in one call occurring and the code generated is effectively:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>(void)exp(1.0);<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>return 0;<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>This is better, but still not as optimal as it was in v3.8.  With this change, compiling with ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>-fmath-errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ reverts to inserting two calls.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>While calling these functions with constants is not terribly common in C code (mostly contrived test cases), it is a lot more common in real C++ code via template expansions and inlining.  With ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>-O3 -S -emit-llvm -fno-math-errno</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ plus my change to call ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>setDoesNotAccessMemory()</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’, the IR generated is as follows:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; ModuleID = 'src/mathElisions.c'<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>source_filename = "src/mathElisions.c"<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>target datalayout = "e-m:e-p:32:32-f64:64-i64:64-v128:64-v64:64-v32:32-v16:16-n8:16:32-S64"<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>target triple = "shave"<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; Function Attrs: nounwind readnone<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>define i32 @useMathName() local_unnamed_addr #0 {<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  %1 = tail call float @exp(float 1.000000e+00)<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  ret i32 0<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>}<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; Function Attrs: readnone<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>declare float @exp(float) local_unnamed_addr #1<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; Function Attrs: nounwind<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>define i32 @useOtherName() local_unnamed_addr #2 {<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  %1 = tail call float @foo(float 1.000000e+00) #4<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  %2 = fcmp olt float %1, 0x4005AE1480000000<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  br i1 %2, label %7, label %3<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; <label>:3:                                      ; preds = %0<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  %4 = tail call float @foo(float 1.000000e+00) #4<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  %5 = fcmp ogt float %4, 0x4005C28F60000000<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  br i1 %5, label %7, label %6<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; <label>:6:                                      ; preds = %3<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  br label %7<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>; <label>:7:                                      ; preds = %0, %3, %6<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  %8 = phi i32 [ 0, %6 ], [ -1, %3 ], [ -1, %0 ]<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>  ret i32 %8<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>}<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>declare float @foo(float) local_unnamed_addr #3<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>attributes #0 = { nounwind readnone "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="myriad2.2" "unsafe-fp-math"="false" "use-soft-float"="false" }<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>attributes #1 = { readnone "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="myriad2.2" "unsafe-fp-math"="false" "use-soft-float"="false" }<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>attributes #2 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="myriad2.2" "unsafe-fp-math"="false" "use-soft-float"="false" }<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>attributes #3 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="myriad2.2" "unsafe-fp-math"="false" "use-soft-float"="false" }<o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-size:10.0pt;font-family:"Courier New";color:black;mso-fareast-language:EN-US'>attributes #4 = { nounwind }<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>Our implementation has C ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>float</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ and ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>double</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ as 32-bit IEEE Single-Precision and ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>long double</span><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>’ as 64-bit IEEE Double-Precision.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'>            MartinO<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#1F497D;mso-fareast-language:EN-US'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif'> <a href="mailto:mehdi.amini@apple.com">mehdi.amini@apple.com</a> [<a href="mailto:mehdi.amini@apple.com">mailto:mehdi.amini@apple.com</a>] <br><b>Sent:</b> 16 September 2016 21:16<br><br><o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal>On Sep 16, 2016, at 1:30 AM, Martin J. O'Riordan via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'>A little while ago I asked a question on CFE-Dev about a change in the behaviour of programs using the ISO C math functions, although that question should have been put to LLVM-Dev.  But I got excellent clarification of the problem anyway.  However, since then I have been trying to adapt our out-of-tree implementation to get the previous behaviour.  The problem is that something like:</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>#include <math.h></span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>extern double foo(double);</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>int useMathName() {</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>  if ((exp(1.0) < 2.71) || (exp(1.0) > 2.72))</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>    return -1;</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>  return 0;</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>}</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>int useOtherName() {</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>  if ((foo(1.0) < 2.71) || (foo(1.0) > 2.72))</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>    return -1;</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>  return 0;</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span style='font-family:"Courier New"'>}</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'>With v3.8.0 the compiler elided both the calls to ‘</span><span lang=EN-GB style='font-family:"Courier New"'>exp</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ and the tests, so the function ‘</span><span lang=EN-GB style='font-family:"Courier New"'>useMathName</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ reduced to simply:</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span lang=EN-GB style='font-family:"Courier New"'>return 0;</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'>But this was not correct as it ignored the possibility that the math functions could have the side-effect of changing ‘</span><span lang=EN-GB style='font-family:"Courier New"'>errno</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’, and this was fixed in v3.9.0, and the calls are no longer elided, though using the “as-if” rule, the tests are still eliminated and ‘</span><span lang=EN-GB style='font-family:"Courier New"'>useMathName</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ becomes:</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span lang=EN-GB style='font-family:"Courier New"'>(void)exp(1.0);</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div style='margin-left:36.0pt'><p class=MsoNormal><span lang=EN-GB style='font-family:"Courier New"'>(void)exp(1.0);</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div></div></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>o me: isn’t the spec saying that errno shall be set on underflow and overflow. The constant folding should be able to detect this and fold if it does not happen?<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Also, because we don’t really model errno, we don’t constant fold these call anymore :(<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><div><div style='margin-left:36.0pt'><p class=MsoNormal><span lang=EN-GB style='font-family:"Courier New"'>return 0;</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'>So I changed our implementation so that ‘</span><span lang=EN-GB style='font-family:"Courier New"'>-fno-math-errno</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ is the default for the tool-chain, and the ‘</span><span lang=EN-GB style='font-family:"Courier New"'>-fmath-errno</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ option is not passed on to the CC1 phase.  I expected that this would allow the compiler to elide the calls, but it is not doing so.  I don’t want to use ‘</span><span lang=EN-GB style='font-family:"Courier New"'>-ffast-math</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ as this has lots of FP issues, and I don’t want to make it the default.</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'> </span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div><div><p class=MsoNormal><span lang=EN-GB style='font-family:"Book Antiqua",serif'>Any idea why the math functions are not elided?  I am using ‘</span><span lang=EN-GB style='font-family:"Courier New"'>-O3</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ and implying ‘</span><span lang=EN-GB style='font-family:"Courier New"'>-fno-math-errno</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’.  I have verified that our Toolchain implements ‘</span><span lang=EN-GB style='font-family:"Courier New"'>IsMathErrnoDefault</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ and returns ‘</span><span lang=EN-GB style='font-family:"Courier New"'>false</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’, and that the option ‘</span><span lang=EN-GB style='font-family:"Courier New"'>-fmath-errno</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’ is not being passed to the CC1 stage.  Since our math function implementation does not in fact change ‘</span><span lang=EN-GB style='font-family:"Courier New"'>errno</span><span lang=EN-GB style='font-family:"Book Antiqua",serif'>’, it is very desirable that this elision occurs in an FP safe way.</span><span style='font-size:11.0pt;font-family:"Calibri",sans-serif'><o:p></o:p></span></p></div></div></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>You can check that clang when emitting the IR is adding the attribute "readnone” on the declaration of exp(). If it does not then it assumes errno.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>As a starting point, have you tried to pass -fno-math-errno?<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>— <o:p></o:p></p></div><div><p class=MsoNormal>Mehdi<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div></div></div></body></html>