diff options
author | Serge Pavlov <sepavloff@gmail.com> | 2021-06-09 10:49:17 +0700 |
---|---|---|
committer | Serge Pavlov <sepavloff@gmail.com> | 2021-06-10 11:57:51 +0700 |
commit | 8ff36aab69ece2cc91ba30f82847d19fe877a7ab (patch) | |
tree | 35d96787e99dbc037adaad057938cf2361e1fe8a /llvm/lib | |
parent | b6f983dd842e773cf045a96744f595aa5ce7af9d (diff) | |
download | llvm-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.cpp | 14 |
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. |