aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2021-06-09 10:49:17 +0700
committerSerge Pavlov <sepavloff@gmail.com>2021-06-10 11:57:51 +0700
commit8ff36aab69ece2cc91ba30f82847d19fe877a7ab (patch)
tree35d96787e99dbc037adaad057938cf2361e1fe8a /llvm/lib
parentb6f983dd842e773cf045a96744f595aa5ce7af9d (diff)
downloadllvm-8ff36aab69ece2cc91ba30f82847d19fe877a7ab.zip
llvm-8ff36aab69ece2cc91ba30f82847d19fe877a7ab.tar.gz
llvm-8ff36aab69ece2cc91ba30f82847d19fe877a7ab.tar.bz2
[ConstantFolding] Enable folding of min/max/copysign for all floats
Previously such folding was enabled for half, float and double values only. With this change it is allowed for other floating point values also. Differential Revision: https://reviews.llvm.org/D103956
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 85aab19..3508e3c 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2362,7 +2362,7 @@ static Constant *ConstantFoldScalarCall2(StringRef Name,
}
if (auto *Op1 = dyn_cast<ConstantFP>(Operands[0])) {
- if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
+ if (!Ty->isFloatingPointTy())
return nullptr;
APFloat Op1V = Op1->getValueAPF();
@@ -2374,8 +2374,6 @@ static Constant *ConstantFoldScalarCall2(StringRef Name,
switch (IntrinsicID) {
default:
break;
- case Intrinsic::pow:
- return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
case Intrinsic::copysign:
return ConstantFP::get(Ty->getContext(), APFloat::copySign(Op1V, Op2V));
case Intrinsic::minnum:
@@ -2386,6 +2384,16 @@ static Constant *ConstantFoldScalarCall2(StringRef Name,
return ConstantFP::get(Ty->getContext(), minimum(Op1V, Op2V));
case Intrinsic::maximum:
return ConstantFP::get(Ty->getContext(), maximum(Op1V, Op2V));
+ }
+
+ if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
+ return nullptr;
+
+ switch (IntrinsicID) {
+ default:
+ break;
+ case Intrinsic::pow:
+ return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
case Intrinsic::amdgcn_fmul_legacy:
// The legacy behaviour is that multiplying +/- 0.0 by anything, even
// NaN or infinity, gives +0.0.