summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-06-11 06:16:23 +0000
committerChris Lattner <sabre@nondot.org>2004-06-11 06:16:23 +0000
commitec941f7abbc83330d321ee47bb594c462e6e1bc4 (patch)
tree5ef0394df50cd5411e6f715c9e9d6b9d12e4e9fd /llvm/lib/Transforms
parentb82f707e30ad8b6c6e21eb1d90bcf1c07c284b36 (diff)
downloadbcm5719-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.cpp11
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));
OpenPOWER on IntegriCloud