[clang] [llvm] [ValueTracking] use KnownBits to compute fpclass from bitcast (PR #97762)
Yingwei Zheng via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 27 05:18:30 PDT 2024
================
@@ -5921,6 +5921,63 @@ 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);
+
+ // Build KnownBits representing Inf and check if it must be equal or
+ // unequal to this value.
+ auto InfKB = KnownBits::makeConstant(
+ APFloat::getInf(Ty->getFltSemantics(), false).bitcastToAPInt());
+ InfKB = InfKB.intersectWith(KnownBits::makeConstant(
+ APFloat::getInf(Ty->getFltSemantics(), true).bitcastToAPInt()));
+ if (const auto InfResult = KnownBits::eq(Bits, InfKB)) {
+ assert(!InfResult.value());
+ Known.knownNot(fcInf);
+ } else if (Bits == InfKB) {
+ Known.KnownFPClasses = fcInf;
+ }
+
+ // Build KnownBits representing Zero and check if it must be equal or
+ // unequal to this value.
+ auto ZeroKB = KnownBits::makeConstant(
+ APFloat::getZero(Ty->getFltSemantics(), false).bitcastToAPInt());
+ ZeroKB = ZeroKB.intersectWith(KnownBits::makeConstant(
+ APFloat::getZero(Ty->getFltSemantics(), true).bitcastToAPInt()));
----------------
dtcxzyw wrote:
```suggestion
ZeroKB.Zero.clearSignBit();
```
https://github.com/llvm/llvm-project/pull/97762
More information about the cfe-commits
mailing list