summaryrefslogtreecommitdiff
path: root/llvm/include/llvm/Analysis/ValueTracking.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include/llvm/Analysis/ValueTracking.h')
-rw-r--r--llvm/include/llvm/Analysis/ValueTracking.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index b2716b264fdb..e6609f2e0073 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -393,6 +393,18 @@ struct KnownFPClass {
KnownFPClasses &= (fcPositive | fcNan);
}
+ // Propagate knowledge that a non-NaN source implies the result can also not
+ // be a NaN. For unconstrained operations, signaling nans are not guaranteed
+ // to be quieted but cannot be introduced.
+ void propagateNaN(const KnownFPClass &Src, bool PreserveSign = false) {
+ if (Src.isKnownNever(fcNan)) {
+ knownNot(fcNan);
+ if (PreserveSign)
+ SignBit = Src.SignBit;
+ } else if (Src.isKnownNever(fcSNan))
+ knownNot(fcSNan);
+ }
+
void resetAll() { *this = KnownFPClass(); }
};