summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-01-15 06:27:37 +0000
committerChris Lattner <sabre@nondot.org>2007-01-15 06:27:37 +0000
commit26933ddb10ce7d8f16bfccd7ddc8e1bf61c3376b (patch)
treef4ce99f2378252d202da5dbeed0d4bfaa9cd9c36
parente76908ba81439441f1d0e104dc65ee7502509a5b (diff)
downloadbcm5719-llvm-26933ddb10ce7d8f16bfccd7ddc8e1bf61c3376b.tar.gz
bcm5719-llvm-26933ddb10ce7d8f16bfccd7ddc8e1bf61c3376b.zip
Constant fold llvm.powi.*. This speeds up tramp3d--v4 by 9.5%
llvm-svn: 33229
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index b4c41373cb8..46f9c577270 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -40,6 +40,8 @@ llvm::canConstantFoldCallTo(Function *F) {
case Intrinsic::bswap_i16:
case Intrinsic::bswap_i32:
case Intrinsic::bswap_i64:
+ case Intrinsic::powi_f32:
+ case Intrinsic::powi_f64:
// FIXME: these should be constant folded as well
//case Intrinsic::ctpop_i8:
//case Intrinsic::ctpop_i16:
@@ -186,8 +188,17 @@ llvm::ConstantFoldCall(Function *F, const std::vector<Constant*> &Operands) {
double V = fmod(Op1V, Op2V);
if (errno == 0)
return ConstantFP::get(Ty, V);
- } else if (Name == "atan2")
+ } else if (Name == "atan2") {
return ConstantFP::get(Ty, atan2(Op1V,Op2V));
+ }
+ } else if (ConstantInt *Op2C = dyn_cast<ConstantInt>(Operands[1])) {
+ if (Name == "llvm.powi.f32") {
+ return ConstantFP::get(Ty, std::pow((float)Op1V,
+ (int)Op2C->getZExtValue()));
+ } else if (Name == "llvm.powi.f64") {
+ return ConstantFP::get(Ty, std::pow((double)Op1V,
+ (int)Op2C->getZExtValue()));
+ }
}
}
}
OpenPOWER on IntegriCloud