diff options
author | Sanjay Patel <spatel@rotateright.com> | 2020-05-05 16:02:45 -0400 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2020-05-05 16:04:59 -0400 |
commit | a954b8a363adae382e076ba0ef1d39910778a02d (patch) | |
tree | 0a89c01340c504f5611c631381fed7aebe528bd3 /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 4e9a7c8f5c527e7493394ab7869f38ca7c6b8903 (diff) | |
download | llvm-a954b8a363adae382e076ba0ef1d39910778a02d.zip llvm-a954b8a363adae382e076ba0ef1d39910778a02d.tar.gz llvm-a954b8a363adae382e076ba0ef1d39910778a02d.tar.bz2 |
[ValueTracking] fix CannotBeNegativeZero() to disregard 'nsz' FMF
The 'nsz' flag is different than 'nnan' or 'ninf' in that it does not create poison.
Make that explicit in the LangRef and fix ValueTracking analysis that misinterpreted
the definition.
This manifests as bugs in InstSimplify shown in the test diffs and as discussed in
PR45778:
https://bugs.llvm.org/show_bug.cgi?id=45778
Differential Revision: https://reviews.llvm.org/D79422
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 3d1e627..b02a4d2 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3202,6 +3202,9 @@ Intrinsic::ID llvm::getIntrinsicForCallSite(const CallBase &CB, /// Return true if we can prove that the specified FP value is never equal to /// -0.0. +/// NOTE: Do not check 'nsz' here because that fast-math-flag does not guarantee +/// that a value is not -0.0. It only guarantees that -0.0 may be treated +/// the same as +0.0 in floating-point ops. /// /// NOTE: this function will need to be revisited when we support non-default /// rounding modes! @@ -3218,11 +3221,6 @@ bool llvm::CannotBeNegativeZero(const Value *V, const TargetLibraryInfo *TLI, if (!Op) return false; - // Check if the nsz fast-math flag is set. - if (auto *FPO = dyn_cast<FPMathOperator>(Op)) - if (FPO->hasNoSignedZeros()) - return true; - // (fadd x, 0.0) is guaranteed to return +0.0, not -0.0. if (match(Op, m_FAdd(m_Value(), m_PosZeroFP()))) return true; |