[LLVMdev] Inlining sqrt library function in X86

Chris Lattner clattner at apple.com
Fri May 17 15:36:51 PDT 2013


On May 17, 2013, at 3:33 PM, "Gurd, Preston" <preston.gurd at intel.com> wrote:

> Using the following example program
>  
> #include <math.h>
>  
> double f(double d){
>   return sqrt(d);
> }
>  
> and compiling it with “clang –O3 …”, I was trying to determine what it would take to get the X86 code generator to replace the call to sqrt with a sqrtsd instruction inline.
>  
> It turns out that it could do exactly that, were it not for the fact that in the function visitUnaryFloatCall() at line 5514 in SelectionDAGBuilder.cpp, the result of
>  
> !I.onlyReadsMemory()
>  
> Is true, so the code is unable to replace the function call with an ISD::FSQRT SDNode. If I remove the above test, then the compiler will emit a sqrtsd instruction.
>  
> I am hoping that someone might be able to comment on what onlyReadsMemory is supposed to do be doing in general and why it is returning false in this case.
>  

The compiler is being conservative about errno (which sqrt in libm can set, but "sqrtss" doesn't).  Try building with -fno-math-errno.

-Chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130517/2074c7c2/attachment.html>


More information about the llvm-dev mailing list