diff options
author | Chris Lattner <sabre@nondot.org> | 2008-03-30 18:02:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-03-30 18:02:00 +0000 |
commit | 6192ce0a0e5880e48729f9a70a71db52e329b231 (patch) | |
tree | 6841f8e182f770bfd33c19bc805976f715cd9b2b /lib/Analysis | |
parent | b917bc969c6c011942f09102e73ed5978fda650d (diff) | |
download | external_llvm-6192ce0a0e5880e48729f9a70a71db52e329b231.zip external_llvm-6192ce0a0e5880e48729f9a70a71db52e329b231.tar.gz external_llvm-6192ce0a0e5880e48729f9a70a71db52e329b231.tar.bz2 |
minor code cleanups, allow constant folding sinf/cosf.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48961 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/ConstantFolding.cpp | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index e29b2db..0e8435f 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -569,7 +569,8 @@ llvm::canConstantFoldCallTo(const Function *F) { if (Len == 3) return !strcmp(Str, "sin"); if (Len == 4) - return !strcmp(Str, "sinh") || !strcmp(Str, "sqrt"); + return !strcmp(Str, "sinh") || !strcmp(Str, "sqrt") || + !strcmp(Str, "sinf"); if (Len == 5) return !strcmp(Str, "sqrtf"); return false; @@ -586,16 +587,17 @@ static Constant *ConstantFoldFP(double (*NativeFP)(double), double V, const Type *Ty) { errno = 0; V = NativeFP(V); - if (errno == 0) { - if (Ty==Type::FloatTy) - return ConstantFP::get(Ty, APFloat((float)V)); - else if (Ty==Type::DoubleTy) - return ConstantFP::get(Ty, APFloat(V)); - else - assert(0); + if (errno != 0) { + errno = 0; + return 0; } - errno = 0; - return 0; + + if (Ty == Type::FloatTy) + return ConstantFP::get(Ty, APFloat((float)V)); + + if (Ty == Type::DoubleTy) + return ConstantFP::get(Ty, APFloat(V)); + assert(0 && "Can only constant fold float/double"); } static Constant *ConstantFoldBinaryFP(double (*NativeFP)(double, double), @@ -603,16 +605,16 @@ static Constant *ConstantFoldBinaryFP(double (*NativeFP)(double, double), const Type *Ty) { errno = 0; V = NativeFP(V, W); - if (errno == 0) { - if (Ty==Type::FloatTy) - return ConstantFP::get(Ty, APFloat((float)V)); - else if (Ty==Type::DoubleTy) - return ConstantFP::get(Ty, APFloat(V)); - else - assert(0); + if (errno != 0) { + errno = 0; + return 0; } - errno = 0; - return 0; + + if (Ty == Type::FloatTy) + return ConstantFP::get(Ty, APFloat((float)V)); + if (Ty == Type::DoubleTy) + return ConstantFP::get(Ty, APFloat(V)); + assert(0 && "Can only constant fold float/double"); } /// ConstantFoldCall - Attempt to constant fold a call to the specified function @@ -653,6 +655,8 @@ llvm::ConstantFoldCall(Function *F, return ConstantFoldFP(cos, V, Ty); else if (Len == 4 && !strcmp(Str, "cosh")) return ConstantFoldFP(cosh, V, Ty); + else if (Len == 4 && !strcmp(Str, "cosf")) + return ConstantFoldFP(cos, V, Ty); break; case 'e': if (Len == 3 && !strcmp(Str, "exp")) @@ -675,7 +679,7 @@ llvm::ConstantFoldCall(Function *F, return ConstantFoldFP(sqrt, V, Ty); else // Undefined return ConstantFP::get(Ty, Ty==Type::FloatTy ? APFloat(0.0f) : - APFloat(0.0)); + APFloat(0.0)); } break; case 's': @@ -687,6 +691,8 @@ llvm::ConstantFoldCall(Function *F, return ConstantFoldFP(sqrt, V, Ty); else if (Len == 5 && !strcmp(Str, "sqrtf") && V >= 0) return ConstantFoldFP(sqrt, V, Ty); + else if (Len == 4 && !strcmp(Str, "sinf")) + return ConstantFoldFP(sin, V, Ty); break; case 't': if (Len == 3 && !strcmp(Str, "tan")) |