[llvm-commits] [llvm] r114148 - in /llvm/trunk: lib/Analysis/ConstantFolding.cpp test/Transforms/InstCombine/fold-calls.ll

Daniel Dunbar daniel at zuster.org
Mon Sep 20 09:38:06 PDT 2010


Hi Dan,

This change doesn't seem right to me. It is introducing a host ==
target dependency of sorts. Somehow this information should be coming
from the Target definitions or information in the IR file, not from
the host's fenv() implementation.

 - Daniel

On Thu, Sep 16, 2010 at 6:38 PM, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Thu Sep 16 20:38:06 2010
> New Revision: 114148
>
> URL: http://llvm.org/viewvc/llvm-project?rev=114148&view=rev
> Log:
> Fix the folding of floating-point math library calls, like sin(infinity),
> so that it detects errors on platforms where libm doesn't set errno.
> It's still subject to host libm details though.
>
> Added:
>    llvm/trunk/test/Transforms/InstCombine/fold-calls.ll
> Modified:
>    llvm/trunk/lib/Analysis/ConstantFolding.cpp
>
> Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=114148&r1=114147&r2=114148&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
> +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Thu Sep 16 20:38:06 2010
> @@ -32,6 +32,7 @@
>  #include "llvm/Support/MathExtras.h"
>  #include <cerrno>
>  #include <cmath>
> +#include <fenv.h>
>  using namespace llvm;
>
>  //===----------------------------------------------------------------------===//
> @@ -1039,9 +1040,12 @@
>
>  static Constant *ConstantFoldFP(double (*NativeFP)(double), double V,
>                                 const Type *Ty) {
> +  feclearexcept(FE_ALL_EXCEPT);
>   errno = 0;
>   V = NativeFP(V);
> -  if (errno != 0) {
> +  if (errno != 0 ||
> +      fetestexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)) {
> +    feclearexcept(FE_ALL_EXCEPT);
>     errno = 0;
>     return 0;
>   }
> @@ -1056,9 +1060,12 @@
>
>  static Constant *ConstantFoldBinaryFP(double (*NativeFP)(double, double),
>                                       double V, double W, const Type *Ty) {
> +  feclearexcept(FE_ALL_EXCEPT);
>   errno = 0;
>   V = NativeFP(V, W);
> -  if (errno != 0) {
> +  if (errno != 0 ||
> +      fetestexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)) {
> +    feclearexcept(FE_ALL_EXCEPT);
>     errno = 0;
>     return 0;
>   }
>
> Added: llvm/trunk/test/Transforms/InstCombine/fold-calls.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fold-calls.ll?rev=114148&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/fold-calls.ll (added)
> +++ llvm/trunk/test/Transforms/InstCombine/fold-calls.ll Thu Sep 16 20:38:06 2010
> @@ -0,0 +1,19 @@
> +; RUN: opt -instcombine -S < %s | FileCheck %s
> +
> +; This shouldn't fold, because sin(inf) is invalid.
> +; CHECK: @foo
> +; CHECK:   %t = call double @sin(double 0x7FF0000000000000)
> +define double @foo() {
> +  %t = call double @sin(double 0x7FF0000000000000)
> +  ret double %t
> +}
> +
> +; This should fold.
> +; CHECK: @bar
> +; CHECK:   ret double 0x3FDA6026360C2F91
> +define double @bar() {
> +  %t = call double @sin(double 9.0)
> +  ret double %t
> +}
> +
> +declare double @sin(double)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list