================ @@ -5805,6 +5805,37 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts, break; } + case Instruction::BitCast: { + const Value *Src; + if (!match(Op, m_ElementWiseBitCast(m_Value(Src))) || + !Src->getType()->isIntOrIntVectorTy()) + break; + + const Type *Ty = Op->getType()->getScalarType(); + KnownBits Bits(Ty->getScalarSizeInBits()); + computeKnownBits(Src, DemandedElts, Bits, Depth + 1, Q); + + // Transfer information from the sign bit. + if (Bits.isNonNegative()) + Known.signBitMustBeZero(); + else if (Bits.isNegative()) + Known.signBitMustBeOne(); + + if (Ty->isIEEE()) { + // IEEE floats are NaN when all bits of the exponent plus at least one of + // the fraction bits are 1. This means: + // - If we assume unknown bits are 0 and the value is NaN, it will + // always be NaN + // - If we assume unknown bits are 1 and the value is not NaN, it can + // never be NaN + if (APFloat(Ty->getFltSemantics(), Bits.One).isNaN()) + Known.KnownFPClasses = fcNan; + else if (!APFloat(Ty->getFltSemantics(), ~Bits.Zero).isNaN()) + Known.knownNot(fcNan); ---------------- arsenm wrote:
inf is simpler, but normal / subnormal would require knowing at least one bit of the mantissa is set and the exponent is not the maximum which is trickier https://github.com/llvm/llvm-project/pull/97762 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits