[LLVMdev] Optimize away sqrt in simple cases?

Reed Kotler rkotler at mips.com
Wed Apr 24 01:00:51 PDT 2013


On 04/23/2013 10:50 PM, Owen Anderson wrote:
>
> On Apr 23, 2013, at 7:15 PM, Stephen Lin <swlin at post.harvard.edu> wrote:
>
>>> This is not true.  The mathematically correct result for sqrt might not be a representable value in floating point, so rounding may occur between the two steps.  In that case, pow2(sqrt(x)) != x.
>>
>> I think what Christoph is saying is that x will always be at least as
>> accurate as pow2(sqrt(x)), so it's only unsafe in so far as one's code
>> is actually depending on an imprecise result.
>
> Giving more-than-expected precision can be just as bad for the user as less.  It tends to come up in situations where the optimization would break some symmetry, the same way that aggressively forming FMAs can break user code.  Consider this example:
>
> float foo(float a, float b) {
>    return pow2(a) - pow2(sqrt(b));
> }
>
> float bar(float c) {
>    return foo(sqrt(b), b);
> }
>
> The author *should* be able to assume that for any positive c, the only possible output values are Inf and zero.  However, if we apply the pow2/sqrt peephole, suddenly non-zero finite outputs are possible.  The equivalent example for FMA formation is x*x - x*x.  If we convert that to "fma x, x, (-x*x)", you can get a non-zero finite result.
>
> It boils down to the fact that giving excess precision in some-places-but-not-others can lead to bad behavior.
>
> --Owen
>
Not sure exactly what the C/C++ standard says here but usually it's 
allowed to give more precision.

It's also allowed for math to work as real math and not as limited 
precision math.

If your code is requiring otherwise, then therein is the problem.

Can't arcsin(sqrt(2)/2) == pi/4 ?

I think so.

When you are debugging a calculator that's what you want.
People spend a lot of time trying to get the math library to give the 
expected results when known equations combining various operations are 
used. That is part of the sanity check of making sure that you have a 
good math library implementation.

Scientists using the math library want the math to be as close to real 
math as possible.

That was part of the point of the IEEE floating point standard.

sin (n * pi) == 0 etc.

Back in the day I knew W. Kahan (IEEE FP inventor) and I know that this 
was his belief.









More information about the llvm-dev mailing list