From: Jakob Stoklund Olesen Date: Mon, 27 Sep 2010 21:29:20 +0000 (+0000) Subject: Don't try to constant fold libm functions with non-finite arguments. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1f386c4ce1983c448320aecca8d3cd27d1497867;p=oota-llvm.git Don't try to constant fold libm functions with non-finite arguments. Usually we wouldn't do this anyway because llvm_fenv_testexcept would return an exception, but we have seen some cases where neither errno nor fenv detect an exception on arm-linux. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114893 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 96656a3c73f..d3596d1c86d 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -1094,6 +1094,13 @@ llvm::ConstantFoldCall(Function *F, if (!Ty->isFloatTy() && !Ty->isDoubleTy()) return 0; + + /// We only fold functions with finite arguments. Folding NaN and inf is + /// likely to be aborted with an exception anyway, and some host libms + /// have known errors raising exceptions. + if (Op->getValueAPF().isNaN() || Op->getValueAPF().isInfinity()) + return 0; + /// Currently APFloat versions of these functions do not exist, so we use /// the host native double versions. Float versions are not called /// directly but for all these it is true (float)(f((double)arg)) == diff --git a/test/Transforms/InstCombine/fold-calls.ll b/test/Transforms/InstCombine/fold-calls.ll index fbd09affcb5..504f874beae 100644 --- a/test/Transforms/InstCombine/fold-calls.ll +++ b/test/Transforms/InstCombine/fold-calls.ll @@ -1,10 +1,5 @@ ; RUN: opt -instcombine -S < %s | FileCheck %s -; This test is inexplicably still failing, which suggests a bug in the host -; libm. It appears that sin(inf) returns NaN without setting a floating point -; exception. -; XFAIL: arm-pc-linux-gnu - ; This shouldn't fold, because sin(inf) is invalid. ; CHECK: @foo ; CHECK: %t = call double @sin(double 0x7FF0000000000000)