diff options
author | Chris Lattner <sabre@nondot.org> | 2004-06-11 06:16:23 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-06-11 06:16:23 +0000 |
commit | ec941f7abbc83330d321ee47bb594c462e6e1bc4 (patch) | |
tree | 5ef0394df50cd5411e6f715c9e9d6b9d12e4e9fd /llvm/lib/Transforms | |
parent | b82f707e30ad8b6c6e21eb1d90bcf1c07c284b36 (diff) | |
download | bcm5719-llvm-ec941f7abbc83330d321ee47bb594c462e6e1bc4.tar.gz bcm5719-llvm-ec941f7abbc83330d321ee47bb594c462e6e1bc4.zip |
Constant fold the isnan intrinsic
llvm-svn: 14150
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 256ddfdbccb..9d3338ffb77 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -15,6 +15,7 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/Constants.h" #include "llvm/Instructions.h" +#include "llvm/Intrinsics.h" #include <cerrno> #include <cmath> using namespace llvm; @@ -234,6 +235,12 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB) { /// the specified function. bool llvm::canConstantFoldCallTo(Function *F) { const std::string &Name = F->getName(); + + switch (F->getIntrinsicID()) { + case Intrinsic::isnan: return true; + default: break; + } + return Name == "sin" || Name == "cos" || Name == "tan" || Name == "sqrt" || Name == "log" || Name == "log10" || Name == "exp" || Name == "pow" || Name == "acos" || Name == "asin" || Name == "atan" || Name == "fmod"; @@ -258,7 +265,9 @@ Constant *llvm::ConstantFoldCall(Function *F, if (Operands.size() == 1) { if (ConstantFP *Op = dyn_cast<ConstantFP>(Operands[0])) { double V = Op->getValue(); - if (Name == "sin") + if (Name == "llvm.isnan") + return ConstantBool::get(isnan(V)); + else if (Name == "sin") return ConstantFP::get(Ty, sin(V)); else if (Name == "cos") return ConstantFP::get(Ty, cos(V)); |