diff options
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index b28a0d6..4a943a1 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -1579,9 +1579,10 @@ bool llvm::canConstantFoldCallTo(const CallBase *Call, const Function *F) { return !Call->isStrictFP(); // Sign operations are actually bitwise operations, they do not raise - // exceptions even for SNANs. + // exceptions even for SNANs. The same applies to classification functions. case Intrinsic::fabs: case Intrinsic::copysign: + case Intrinsic::isnan: // Non-constrained variants of rounding operations means default FP // environment, they can be folded in any case. case Intrinsic::ceil: @@ -2002,6 +2003,9 @@ static Constant *ConstantFoldScalarCall1(StringRef Name, return ConstantInt::get(Ty, Int); } + if (IntrinsicID == Intrinsic::isnan) + return ConstantInt::get(Ty, U.isNaN()); + if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy()) return nullptr; |