fast-math: fix a bug related to square roots of negatives

Friedman, Eli via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 6 09:31:30 PST 2016


On 11/4/2016 11:15 AM, Octav Zlatior via llvm-commits wrote:
>
> Hi,
>
> I have noticed the following behaviour while running the SPEC 
> benchmark suite (built with llvm, of course). One of the tests was 
> failing (Xalanc) with a segfault (because of stack overflow) because 
> the terminating condition for a recursion involved NaN.
>
> I've checked a little further and I have noticed that, with fast-math, 
> the square roots of negative numbers will sometimes be replaced with 
> "return undef". But only sometimes, and only the square roots (for 
> example, log(x) does not manifest this behaviour).
>
> It turns out a rather common way of getting the value of NaN in code 
> is to assign it the return value of sqrt(<negative number>). Because 
> of this bug, any such assignments will basically result undefined values.
>
> These two patches should provide a fix for this. The first is a test 
> to illustrate the situation (the negative functions will be replaced 
> with return undef in the IR), while the other is a fix for this bug.
>

Your patch specifically says that "sqrt(-1)" should be lowered to NaN, 
but "float x = -1.f; sqrt(x)" should be lowered to the intrinsic, which 
has undefined behavior according to LangRef.  This seems dubious; 
changing the semantics of sqrt() based on the syntactic form of the 
source is likely to cause problems.  For example, writing a trivial 
wrapper for sqrt (like the one in libcxx for sqrtf) breaks your check.

Maybe we should just kill off this transform completely?  The optimizer 
knows how to handle a regular sqrt() call anyway.

-Eli

-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project



More information about the llvm-commits mailing list