42 Known.setSignBit(std::nullopt);
49 Known.setSignBit(std::nullopt);
62 switch (Mode.Output) {
75 Known.setSignBit(std::nullopt);
82 Known.setSignBit(std::nullopt);
146 !
Known.isKnownNeverSubnormal()) {
151 if (
Known.isKnownNeverNaN()) {
155 Known.signBitMustBeOne();
157 Known.signBitMustBeZero();
174 Known.signBitMustBeZero();
178 Known.signBitMustBeOne();
240 "Bitcast operand has incorrect bit width");
244 if (Bits.hasConflict())
261 if (!IsSupported(FltSemantics))
265 if (Bits.isNonNegative())
266 Known.signBitMustBeZero();
267 else if (Bits.isNegative())
268 Known.signBitMustBeOne();
276 const unsigned MantissaBits = FltSemantics.
precision - 1;
279 const APInt MantissaMask =
282 const bool ExponentKnownAllZeros =
283 (Bits.Zero & ExponentMask) == ExponentMask;
284 const bool ExponentKnownAllOnes = (Bits.One & ExponentMask) == ExponentMask;
285 const bool ExponentKnownNotAllZeros = !(Bits.One & ExponentMask).
isZero();
286 const bool ExponentKnownNotAllOnes = !(Bits.Zero & ExponentMask).
isZero();
288 const bool MantissaKnownAllZeros =
289 (Bits.Zero & MantissaMask) == MantissaMask;
290 const bool MantissaKnownNotAllZeros = !(Bits.One & MantissaMask).
isZero();
293 if (ExponentKnownNotAllZeros)
297 if (ExponentKnownNotAllOnes)
301 if (ExponentKnownAllZeros || ExponentKnownAllOnes)
305 if (MantissaKnownNotAllZeros)
309 if (MantissaKnownAllZeros)
312 const bool QuietBitKnownSet = Bits.One[MantissaBits - 1];
313 const bool QuietBitKnownClear = Bits.Zero[MantissaBits - 1];
315 if (QuietBitKnownSet)
317 else if (QuietBitKnownClear)
331 constexpr unsigned FractionBits = 63;
332 constexpr unsigned IntegerBitIndex = FractionBits;
334 const APInt ExponentMask =
337 const bool ExponentKnownAllZeros =
338 (Bits.Zero & ExponentMask) == ExponentMask;
339 const bool ExponentKnownAllOnes = (Bits.One & ExponentMask) == ExponentMask;
340 const bool ExponentKnownNotAllZeros = !(Bits.One & ExponentMask).
isZero();
341 const bool ExponentKnownNotAllOnes = !(Bits.Zero & ExponentMask).
isZero();
342 const bool FractionKnownAllZeros =
343 (Bits.Zero & FractionMask) == FractionMask;
344 const bool FractionKnownNotAllZeros = !(Bits.One & FractionMask).
isZero();
345 const bool IntegerBitKnownSet = Bits.One[IntegerBitIndex];
346 const bool IntegerBitKnownClear = Bits.Zero[IntegerBitIndex];
350 if (ExponentKnownNotAllZeros || IntegerBitKnownSet)
354 if (FractionKnownNotAllZeros)
359 if (ExponentKnownNotAllOnes || IntegerBitKnownClear ||
360 FractionKnownNotAllZeros)
366 if (IntegerBitKnownClear || ExponentKnownAllOnes)
371 if (FractionKnownAllZeros)
376 if (ExponentKnownAllZeros ||
377 (IntegerBitKnownSet &&
378 (ExponentKnownNotAllOnes || FractionKnownAllZeros)))
381 const bool QuietBitKnownSet = Bits.One[FractionBits - 1];
382 const bool QuietBitKnownClear = Bits.Zero[FractionBits - 1];
384 if (QuietBitKnownSet)
386 else if (QuietBitKnownClear)
420 if (!IsSupported(FltSemantics))
433 Known.setAllConflict();
436 const unsigned MantissaBits = FltSemantics.
precision - 1;
437 const unsigned ExponentBits =
BitWidth - MantissaBits - 1;
443 const unsigned QuietBitIndex = MantissaBits - 1;
444 APInt PayloadMask = MantissaMask;
445 PayloadMask.
clearBit(QuietBitIndex);
447 if (FPClasses &
fcNan) {
449 Known.Zero &= ~ExponentMask;
451 Known.Zero &= ~PayloadMask;
452 Known.One &= ~PayloadMask;
455 Known.Zero.clearBit(QuietBitIndex);
457 Known.One.clearBit(QuietBitIndex);
459 if (FPClasses &
fcInf) {
461 Known.Zero &= ~ExponentMask;
463 Known.One &= ~MantissaMask;
467 Known.One &= ~ExponentMask;
469 Known.One &= ~MantissaMask;
470 Known.Zero &= ~MantissaMask;
474 Known.One &= ~ExponentMask;
476 Known.One &= ~MantissaMask;
485 Known.setAllConflict();
487 if (FPClasses &
fcInf)
501 Known.Zero.clearSignBit();
502 Known.One.clearSignBit();
503 if (std::optional<bool> Sign =
getSignBit()) {
505 Known.makeNegative();
507 Known.makeNonNegative();
561 Known.propagateNonSNaN(KnownLHS, KnownRHS);
585 return fadd(KnownLHS,
fneg(KnownRHS), Mode);
596 Known.propagateNonSNaN(KnownLHS, KnownRHS);
636 const int MantissaBits = Precision - 1;
638 int MinKnownExponent =
ilogb(CRHS);
639 bool CannotBeSubnormal = (MinKnownExponent >= MantissaBits);
642 if (CannotBeSubnormal)
647 if (MinKnownExponent < 0)
665 Known.propagateNonSNaN(KnownLHS, KnownRHS);
714 Known.propagateNonSNaN(KnownSrc);
731 Known.propagateNonSNaN(KnownLHS, KnownRHS);
753 (!Mode.outputsMayBePositiveZero() ||
765 Known.propagateNonSNaN(KnownSrc);
817 Known.propagateNonSNaN(KnownSquared, KnownAddend);
826 Known.propagateNonNaN(KnownSrc);
847 bool IsMultiUnitFPType) {
852 if (!IsMultiUnitFPType)
855 Known.propagateNonSNaN(KnownSrc);
877 Known.propagateNonSNaN(KnownSrc);
897 Known.propagateNonSNaN(KnownSrc);
908 return sin(KnownSrc);
917 Known.propagateNonSNaN(KnownSrc);
939 Known.propagateNonNaN(KnownSrc);
951 Known.propagateNonNaN(KnownSrc);
976 Known.propagateNonNaN(KnownSrc);
987 Known.propagateNonSNaN(KnownSrc);
1012 Known.propagateNonSNaN(KnownSrc);
1039 Known.propagateNonNaN(KnownSrc);
1059 Known.propagateNonNaN(KnownY, KnownX);
1092 if (!
Known.isKnownNeverNaN())
1093 Known.setSignBit(std::nullopt);
1106 Known.propagateNonNaN(KnownSrc);
1113 bool MayBeMultiUnitFPType,
1120 Known.propagateNonNaN(KnownSrc);
1123 if (!MayBeMultiUnitFPType) {
1143 !Mode.inputsMayBePositiveZero()))
1190 Known.propagateNonNaN(KnownSrc);
1216 const APInt &ConstantRangeExpMin,
1217 const APInt &ConstantRangeExpMax,
1223 if (ConstantRangeExpMin.
isZero() && ConstantRangeExpMax.
isZero()) {
1227 Known.propagateNonNaN(KnownSrc);
1231 Known.propagateNonNaN(KnownSrc);
1247 const int MantissaBits = Precision - 1;
1248 if (ConstantRangeExpMin.
sge(MantissaBits))
1284 Known.propagateNonSNaN(KnownLHS, KnownRHS);
1325 Known.propagateNonNaN(KnownSrc);
1327 if (ExponentKnownBits.
isZero()) {
1355 const bool IsKnownNeverOddPositive = ExponentKnownBits.
isNegative();
1356 const bool IsKnownNeverOddNegative = ExponentKnownBits.
isNonNegative();
1395 bool MayAbsExpGT1 = MinExp.
slt(-1) || MaxExp.
sgt(1);
1396 bool MayFiniteOverflow = MayFinite && MayAbsExpGT1;
1399 bool MayBeNegOne = ExponentKnownBits.
Zero.
isZero();
1402 if (!MayInfSrc && !MayDivByZero && !MayFiniteOverflow && !MaySubnormInv)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static KnownFPClass fadd_impl(const KnownFPClass &KnownLHS, const KnownFPClass &KnownRHS, DenormalMode Mode)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
static LLVM_ABI bool isRepresentableAsNormalIn(const fltSemantics &Src, const fltSemantics &Dst)
static const fltSemantics & PPCDoubleDouble()
cmpResult compareAbsoluteValue(const APFloat &RHS) const
const fltSemantics & getSemantics() const
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Class for arbitrary precision integers.
void clearBit(unsigned BitPosition)
Set a given bit to 0.
bool sgt(const APInt &RHS) const
Signed greater than comparison.
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
bool isNegative() const
Determine sign of this APInt.
bool isNonPositive() const
Determine if this APInt Value is non-positive (<= 0).
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
bool slt(const APInt &RHS) const
Signed less than comparison.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
@ Known
Known to have no common set bits.
LLVM_ABI FPClassTest orderedStrictlyGreater(FPClassTest Mask, bool OrderedZeroSign=false)
Returns all FPClasses which are greater than all values in Mask That is, return all classes for which...
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
LLVM_ABI FPClassTest orderedStrictlyLess(FPClassTest Mask, bool OrderedZeroSign=false)
Returns all FPClasses which are less than all values in Mask That is, return all classes for which th...
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
@ Mul
Product of integers.
constexpr unsigned BitWidth
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind Input
Denormal treatment kind for floating point instruction inputs in the default floating-point environme...
constexpr bool outputsAreZero() const
Return true if output denormals should be flushed to 0.
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ IEEE
IEEE-754 denormal numbers preserved.
constexpr bool inputsAreZero() const
Return true if input denormals must be implicitly treated as 0.
static constexpr DenormalMode getPreserveSign()
DenormalModeKind Output
Denormal flushing mode for floating point instruction results in the default floating point environme...
static constexpr DenormalMode getIEEE()
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
bool isNonNegative() const
Returns true if this value is known to be non-negative.
bool isZero() const
Returns true if value is all zero.
APInt getSignedMaxValue() const
Return the maximal signed value possible given these KnownBits.
bool isEven() const
Return if the value is known even (the low bit is 0).
bool isNegative() const
Returns true if this value is known to be negative.
APInt getSignedMinValue() const
Return the minimal signed value possible given these KnownBits.
bool isKnownNeverInfOrNaN() const
Return true if it's known this can never be an infinity or nan.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
KnownFPClass(FPClassTest Known=fcAllFlags, std::optional< bool > Sign={})
static LLVM_ABI KnownFPClass applyOutputDenormalMode(const KnownFPClass &Src, DenormalMode Mode)
Return the known classes of Src after producing an output that may flush subnormals to zero according...
bool cannotBeOrderedGreaterThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never greater tha...
static LLVM_ABI KnownFPClass sin(const KnownFPClass &Src)
Report known values for sin.
static LLVM_ABI KnownFPClass frem(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem.
static LLVM_ABI KnownFPClass fdiv_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv x, x.
static constexpr FPClassTest OrderedGreaterThanZeroMask
static constexpr FPClassTest OrderedLessThanZeroMask
FPClassTest KnownFPClassesValue
static LLVM_ABI KnownFPClass applyInputDenormalMode(const KnownFPClass &Src, DenormalMode Mode)
Return the known classes of Src after passing through an input that may flush subnormals to zero acco...
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmul.
static LLVM_ABI KnownFPClass ceil(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ceil.
static LLVM_ABI KnownFPClass fadd_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd x, x.
bool isKnownNeverZero() const
Return true if it's known this can never be a zero.
static KnownFPClass square(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
static LLVM_ABI KnownFPClass fsub(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fsub.
bool isKnownNeverSubnormal() const
Return true if it's known this can never be a subnormal.
bool isKnownAlways(FPClassTest Mask) const
static LLVM_ABI KnownFPClass canonicalize(const KnownFPClass &Src, DenormalMode DenormMode=DenormalMode::getDynamic())
Apply the canonicalize intrinsic to this value.
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
static LLVM_ABI KnownFPClass atan2(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for atan2.
static LLVM_ABI KnownFPClass atan(const KnownFPClass &Src)
Report known values for atan.
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
static LLVM_ABI KnownFPClass cos(const KnownFPClass &Src)
Report known values for cos.
static LLVM_ABI KnownFPClass cosh(const KnownFPClass &Src)
Report known values for cosh.
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode DenormMode=DenormalMode::getDynamic())
bool isKnownNeverNegInfinity() const
Return true if it's known this can never be -infinity.
bool isKnownNeverNegSubnormal() const
Return true if it's known this can never be a negative subnormal.
bool isKnownNeverPosZero() const
Return true if it's known this can never be a literal positive zero.
static LLVM_ABI KnownFPClass exp(const KnownFPClass &Src)
Report known values for exp, exp2 and exp10.
static LLVM_ABI KnownFPClass frexp_mant(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for mantissa component of frexp.
static LLVM_ABI KnownFPClass asin(const KnownFPClass &Src)
Report known values for asin.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
std::optional< bool > getSignBit() const
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy)
Propagate known class for fpext.
FPClassTest getKnownFPClasses() const
Floating-point classes the value could be one of.
bool isKnownNeverNegZero() const
Return true if it's known this can never be a negative zero.
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for rounding intrinsics (rint, nearbyint, round, roundeven).
static LLVM_ABI KnownFPClass fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma.
static LLVM_ABI KnownFPClass tan(const KnownFPClass &Src)
Report known values for tan.
LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const
Report known bits for a float with provided semantics.
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc)
Propagate known class for fptrunc.
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
static LLVM_ABI KnownFPClass sqrt(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for sqrt.
LLVM_ABI bool isKnownNeverLogicalPosZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a positive zero.
bool isKnownNeverPosInfinity() const
Return true if it's known this can never be +infinity.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
static LLVM_ABI KnownFPClass trunc(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for trunc.
LLVM_ABI bool isKnownNeverLogicalNegZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a negative zero.
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fma squared, squared, addend.
static LLVM_ABI KnownFPClass acos(const KnownFPClass &Src)
Report known values for acos.
static LLVM_ABI KnownFPClass log(const KnownFPClass &Src, DenormalMode Mode, bool IsMultiUnitFPType)
Propagate known class for log/log2/log10.
static LLVM_ABI KnownFPClass frem_self(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for frem x, x.
static LLVM_ABI KnownFPClass powi(const KnownFPClass &Src, const KnownBits &N)
Propagate known class for powi.
static LLVM_ABI KnownFPClass floor(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for floor.
static LLVM_ABI KnownFPClass pow(const KnownFPClass &LHS, const KnownFPClass &RHS)
Propagate known class for pow.
static LLVM_ABI KnownFPClass ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin, const APInt &ConstantRangeMax, const fltSemantics &Flt, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for ldexp, assuming the exponent is known to be within [ConstantRangeMin,...
void setSignBit(std::optional< bool > Sign)
static LLVM_ABI KnownFPClass sinh(const KnownFPClass &Src)
Report known values for sinh.
bool isKnownNeverPosSubnormal() const
Return true if it's known this can never be a positive subnormal.
static LLVM_ABI KnownFPClass tanh(const KnownFPClass &Src)
Report known values for tanh.