aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ConstantFolding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp37
1 files changed, 19 insertions, 18 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 962880f..6c52091 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2754,27 +2754,28 @@ static Constant *ConstantFoldIntrinsicCall2(Intrinsic::ID IntrinsicID, Type *Ty,
((Mask & fcPosInf) && Op1V.isPosInfinity());
return ConstantInt::get(Ty, Result);
}
+ case Intrinsic::powi: {
+ int Exp = static_cast<int>(Op2C->getSExtValue());
+ switch (Ty->getTypeID()) {
+ case Type::HalfTyID:
+ case Type::FloatTyID: {
+ APFloat Res(std::pow(Op1V.convertToFloat(), Exp));
+ if (Ty->isHalfTy()) {
+ bool Unused;
+ Res.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
+ &Unused);
+ }
+ return ConstantFP::get(Ty->getContext(), Res);
+ }
+ case Type::DoubleTyID:
+ return ConstantFP::get(Ty, std::pow(Op1V.convertToDouble(), Exp));
+ default:
+ return nullptr;
+ }
+ }
default:
break;
}
-
- if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
- return nullptr;
- if (IntrinsicID == Intrinsic::powi && Ty->isHalfTy())
- return ConstantFP::get(
- Ty->getContext(),
- APFloat((float)std::pow((float)Op1V.convertToDouble(),
- (int)Op2C->getZExtValue())));
- if (IntrinsicID == Intrinsic::powi && Ty->isFloatTy())
- return ConstantFP::get(
- Ty->getContext(),
- APFloat((float)std::pow((float)Op1V.convertToDouble(),
- (int)Op2C->getZExtValue())));
- if (IntrinsicID == Intrinsic::powi && Ty->isDoubleTy())
- return ConstantFP::get(
- Ty->getContext(),
- APFloat((double)std::pow(Op1V.convertToDouble(),
- (int)Op2C->getZExtValue())));
}
return nullptr;
}