From f19f58a9360927f8ef50b9a029e8efb780d3d8a8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 30 Mar 2008 18:02:00 +0000 Subject: [PATCH] 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 --- lib/Analysis/ConstantFolding.cpp | 46 ++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index e29b2dba86c..0e8435fcaca 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"))