[llvm] [ValueTracking] Compute knownbits from known fp classes (PR #86409)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 22 01:28:53 PDT 2024


================
@@ -1111,6 +1111,60 @@ static void computeKnownBitsFromOperator(const Operator *I,
       break;
     }
 
+    const Value *V;
+    // Handle bitcast from floating point to integer.
+    if (match(I, m_ElementWiseBitCast(m_Value(V))) &&
+        V->getType()->isFPOrFPVectorTy()) {
+      Type *FPType = V->getType()->getScalarType();
+      KnownFPClass Result = computeKnownFPClass(V, fcAllFlags, Depth + 1, Q);
+      FPClassTest FPClasses = Result.KnownFPClasses;
+
+      if (Result.isKnownNever(fcNormal | fcSubnormal)) {
+        Known.Zero.setAllBits();
+        Known.One.setAllBits();
+
+        if (FPClasses & fcSNan) {
+          APInt Payload = APInt::getAllOnes(FPType->getScalarSizeInBits());
+          Known = Known.intersectWith(KnownBits::makeConstant(
+              APFloat::getSNaN(FPType->getFltSemantics()).bitcastToAPInt()));
+          Known = Known.intersectWith(KnownBits::makeConstant(
+              APFloat::getSNaN(FPType->getFltSemantics(), &Payload)
+                  .bitcastToAPInt()));
+        }
+
+        if (FPClasses & fcQNan) {
+          APInt Payload = APInt::getAllOnes(FPType->getScalarSizeInBits());
+          Known = Known.intersectWith(KnownBits::makeConstant(
+              APFloat::getQNaN(FPType->getFltSemantics()).bitcastToAPInt()));
+          Known = Known.intersectWith(KnownBits::makeConstant(
+              APFloat::getQNaN(FPType->getFltSemantics(), &Payload)
+                  .bitcastToAPInt()));
+        }
----------------
arsenm wrote:

I don't think the logic for signaling nans and quiet nans can be the same. Assuming 2008 nans, any non-0 bit in the significant indicates quietness 

Can you add more tests for the quiet bit set in non-standard positions?

https://github.com/llvm/llvm-project/pull/86409


More information about the llvm-commits mailing list