LLVM 24.0.0git
KnownFPClass.h
Go to the documentation of this file.
1//===- llvm/Support/KnownFPClass.h - Stores known fpclass -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains a class for representing known fpclasses used by
10// computeKnownFPClass.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_SUPPORT_KNOWNFPCLASS_H
15#define LLVM_SUPPORT_KNOWNFPCLASS_H
16
19#include <optional>
20
21namespace llvm {
22class APFloat;
23class APInt;
24struct fltSemantics;
25struct KnownBits;
26
28 /// Floating-point classes the value could be one of.
30
31 std::optional<bool> SignBitValue;
32
33 /// std::nullopt if the sign bit is unknown, true if the sign bit is
34 /// definitely set or false if the sign bit is definitely unset.
35 std::optional<bool> getSignBit() const { return SignBitValue; }
36
37 void setSignBit(std::optional<bool> Sign) { SignBitValue = Sign; }
38
39 KnownFPClass(FPClassTest Known = fcAllFlags, std::optional<bool> Sign = {})
41 LLVM_ABI KnownFPClass(const APFloat &C);
42
44 return KnownFPClasses == Other.KnownFPClasses &&
45 getSignBit() == Other.getSignBit();
46 }
47
48 /// Return true if it's known this can never be one of the mask entries.
49 bool isKnownNever(FPClassTest Mask) const {
50 return (KnownFPClasses & Mask) == fcNone;
51 }
52
53 bool isKnownAlways(FPClassTest Mask) const { return isKnownNever(~Mask); }
54
55 bool isUnknown() const {
56 return KnownFPClasses == fcAllFlags && !getSignBit();
57 }
58
59 /// Return true if it's known this can never be a nan.
60 bool isKnownNeverNaN() const { return isKnownNever(fcNan); }
61
62 /// Return true if it's known this must always be a nan.
63 bool isKnownAlwaysNaN() const { return isKnownAlways(fcNan); }
64
65 /// Return true if it's known this can never be an infinity.
66 bool isKnownNeverInfinity() const { return isKnownNever(fcInf); }
67
68 /// Return true if it's known this can never be an infinity or nan
69 bool isKnownNeverInfOrNaN() const { return isKnownNever(fcInf | fcNan); }
70
71 /// Return true if it's known this can never be +infinity.
73
74 /// Return true if it's known this can never be -infinity.
76
77 /// Return true if it's known this can never be a subnormal
79
80 /// Return true if it's known this can never be a positive subnormal
82
83 /// Return true if it's known this can never be a negative subnormal
85
86 /// Return true if it's known this can never be a zero. This means a literal
87 /// [+-]0, and does not include denormal inputs implicitly treated as [+-]0.
88 bool isKnownNeverZero() const { return isKnownNever(fcZero); }
89
90 /// Return true if it's known this can never be a literal positive zero.
91 bool isKnownNeverPosZero() const { return isKnownNever(fcPosZero); }
92
93 /// Return true if it's known this can never be a negative zero. This means a
94 /// literal -0 and does not include denormal inputs implicitly treated as -0.
95 bool isKnownNeverNegZero() const { return isKnownNever(fcNegZero); }
96
97 /// Return true if it's known this can never be interpreted as a zero. This
98 /// extends isKnownNeverZero to cover the case where the assumed
99 /// floating-point mode for the function interprets denormals as zero.
101
102 /// Return true if it's known this can never be interpreted as a negative
103 /// zero.
105
106 /// Return true if it's known this can never be interpreted as a positive
107 /// zero.
109
114
115 /// Return true if we can prove that the analyzed floating-point value is
116 /// either NaN or never less than -0.0.
117 ///
118 /// NaN --> true
119 /// +0 --> true
120 /// -0 --> true
121 /// x > +0 --> true
122 /// x < -0 --> false
126
127 /// Return true if we can prove that the analyzed floating-point value is
128 /// either NaN or never greater than -0.0.
129 /// NaN --> true
130 /// +0 --> true
131 /// -0 --> true
132 /// x > +0 --> false
133 /// x < -0 --> true
137
138 /// Return true if it's known this can never be a positive value or a logical
139 /// 0.
140 ///
141 /// NaN --> true
142 /// x <= +0 --> false
143 /// psub --> true if mode is ieee, false otherwise.
144 /// x > +0 --> true
148
149 /// Return true if it's know this can never be a negative value or a logical
150 /// 0.
151 ///
152 /// NaN --> true
153 /// x >= -0 --> false
154 /// nsub --> true if mode is ieee, false otherwise.
155 /// x < -0 --> true
159
161 return KnownFPClass(KnownFPClasses | RHS.KnownFPClasses,
162 getSignBit() == RHS.getSignBit() ? getSignBit()
163 : std::nullopt);
164 }
165
167 std::optional<bool> MergedSignBit;
168 if (getSignBit() && !RHS.getSignBit())
169 MergedSignBit = getSignBit();
170 else if (!getSignBit() && RHS.getSignBit())
171 MergedSignBit = RHS.getSignBit();
172
173 return KnownFPClass(KnownFPClasses & RHS.KnownFPClasses, MergedSignBit);
174 }
175
177 KnownFPClasses = KnownFPClasses | RHS.KnownFPClasses;
178
179 if (getSignBit() != RHS.getSignBit())
180 setSignBit(std::nullopt);
181 return *this;
182 }
183
184 void knownNot(FPClassTest RuleOut) {
185 KnownFPClasses = KnownFPClasses & ~RuleOut;
186 if (isKnownNever(fcNan) && !getSignBit()) {
188 setSignBit(false);
189 else if (isKnownNever(fcPositive))
190 setSignBit(true);
191 }
192 }
193
194 void fneg() {
196 if (std::optional<bool> Sign = getSignBit())
197 setSignBit(!*Sign);
198 }
199
200 static KnownFPClass fneg(const KnownFPClass &Src) {
201 KnownFPClass Known = Src;
202 Known.fneg();
203 return Known;
204 }
205
221
222 static KnownFPClass fabs(const KnownFPClass &Src) {
223 KnownFPClass Known = Src;
224 Known.fabs();
225 return Known;
226 }
227
228 // Enum of min/max intrinsics to avoid dependency on IR.
237
241
242 /// Apply the canonicalize intrinsic to this value. This is essentially a
243 /// stronger form of propagateCanonicalizingSrc.
245 canonicalize(const KnownFPClass &Src,
247
248 /// Report known values for a bitcast into a float with provided semantics.
249 LLVM_ABI static KnownFPClass bitcast(const fltSemantics &FltSemantics,
250 const KnownBits &Bits);
251
252 /// Report known bits for a float with provided semantics.
253 LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const;
254
255 /// Report known values for fadd
257 fadd(const KnownFPClass &LHS, const KnownFPClass &RHS,
259
260 /// Report known values for fadd x, x
262 fadd_self(const KnownFPClass &Src,
264
265 /// Report known values for fsub
267 fsub(const KnownFPClass &LHS, const KnownFPClass &RHS,
269
270 /// Report known values for fmul
272 fmul(const KnownFPClass &LHS, const KnownFPClass &RHS,
274
275 // Special case of fmul x, x.
278 KnownFPClass Known = fmul(Src, Src, Mode);
279
280 // X * X is always non-negative or a NaN.
281 Known.knownNot(fcNegative);
282 Known.propagateNonNaN(Src);
283 return Known;
284 }
285
287 fmul(const KnownFPClass &LHS, const APFloat &RHS,
289
290 /// Report known values for fdiv
292 fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS,
294
295 /// Report known values for fdiv x, x
297 fdiv_self(const KnownFPClass &Src,
299
300 /// Report known values for frem
302 frem(const KnownFPClass &LHS, const KnownFPClass &RHS,
304
305 /// Report known values for frem x, x
307 frem_self(const KnownFPClass &Src,
309
310 /// Report known values for fma
312 fma(const KnownFPClass &LHS, const KnownFPClass &RHS,
313 const KnownFPClass &Addend,
315
316 /// Report known values for fma squared, squared, addend
318 fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend,
320
321 /// Propagate known class for sqrt
324
325 /// Propagate known class for log/log2/log10
328
329 /// Report known values for exp, exp2 and exp10
330 LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
331
332 /// Report known values for sin
333 LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
334
335 /// Report known values for cos
336 LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
337
338 /// Report known values for tan
339 LLVM_ABI static KnownFPClass tan(const KnownFPClass &Src);
340
341 /// Report known values for sinh
342 LLVM_ABI static KnownFPClass sinh(const KnownFPClass &Src);
343
344 /// Report known values for cosh
345 LLVM_ABI static KnownFPClass cosh(const KnownFPClass &Src);
346
347 /// Report known values for tanh
348 LLVM_ABI static KnownFPClass tanh(const KnownFPClass &Src);
349
350 /// Report known values for asin
351 LLVM_ABI static KnownFPClass asin(const KnownFPClass &Src);
352
353 /// Report known values for acos
354 LLVM_ABI static KnownFPClass acos(const KnownFPClass &Src);
355
356 /// Report known values for atan
357 LLVM_ABI static KnownFPClass atan(const KnownFPClass &Src);
358
359 /// Report known values for atan2
361 atan2(const KnownFPClass &LHS, const KnownFPClass &RHS,
363
364 /// Return true if the sign bit must be 0, ignoring the sign of nans.
366
367 /// Assume the sign bit is zero.
370 setSignBit(false);
371 }
372
373 /// Assume the sign bit is one.
376 setSignBit(true);
377 }
378
379 void copysign(const KnownFPClass &Sign) {
380 // Don't know anything about the sign of the source. Expand the possible set
381 // to its opposite sign pair.
388 if (KnownFPClasses & fcInf)
390
391 // Sign bit is exactly preserved even for nans.
392 setSignBit(Sign.getSignBit());
393
394 // Clear sign bits based on the input sign mask.
395 if (Sign.isKnownNever(fcPositive | fcNan) ||
396 (getSignBit() && *getSignBit()))
398 if (Sign.isKnownNever(fcNegative | fcNan) ||
399 (getSignBit() && !*getSignBit()))
401 }
402
403 static KnownFPClass copysign(const KnownFPClass &KnownMag,
404 const KnownFPClass &KnownSign) {
405 KnownFPClass Known = KnownMag;
406 Known.copysign(KnownSign);
407 return Known;
408 }
409
410 // Propagate knowledge that an operation cannot introduce a signaling NaN.
412 if (Src.isKnownNever(fcSNan))
414 }
415
416 // Propagate knowledge that an operation cannot introduce a signaling NaN.
418 if (LHS.isKnownNever(fcSNan) && RHS.isKnownNever(fcSNan))
420 }
421
422 // Propagate knowledge that a non-NaN source implies the result can also not
423 // be a NaN. For unconstrained operations, signaling nans are not guaranteed
424 // to be quieted but cannot be introduced.
425 void propagateNonNaN(const KnownFPClass &Src) {
426 propagateNonSNaN(Src);
427 if (Src.isKnownNever(fcNan))
429 }
430
433 if (LHS.isKnownNeverNaN() && RHS.isKnownNeverNaN())
435 }
436
437 // Propagate knowledge for operations whose result sign is the xor of the
438 // operand signs, such as multiply and divide. This only rules out possible
439 // non-NaN sign classes. NaNs do not have a constrained sign class here.
441 if ((LHS.isKnownNever(fcNegative) && RHS.isKnownNever(fcNegative)) ||
442 (LHS.isKnownNever(fcPositive) && RHS.isKnownNever(fcPositive)))
444
445 if ((LHS.isKnownNever(fcPositive) && RHS.isKnownNever(fcNegative)) ||
446 (LHS.isKnownNever(fcNegative) && RHS.isKnownNever(fcPositive)))
448 }
449
450 /// Propagate knowledge from a source value that could be a denormal or
451 /// zero. We have to be conservative since output flushing is not guaranteed,
452 /// so known-never-zero may not hold.
453 ///
454 /// This assumes a copy-like operation and will replace any currently known
455 /// information.
457
458 /// Report known classes if \p Src is evaluated through a potentially
459 /// canonicalizing operation. We can assume signaling nans will not be
460 /// introduced, but cannot assume a denormal will be flushed under FTZ/DAZ.
461 ///
462 /// This assumes a copy-like operation and will replace any currently known
463 /// information.
466
467 /// Propagate known class for fpext.
468 LLVM_ABI static KnownFPClass fpext(const KnownFPClass &KnownSrc,
469 const fltSemantics &DstTy,
470 const fltSemantics &SrcTy);
471
472 /// Propagate known class for fptrunc.
473 LLVM_ABI static KnownFPClass fptrunc(const KnownFPClass &KnownSrc);
474
475 /// Propagate known class for rounding intrinsics (trunc, floor, ceil, rint,
476 /// nearbyint, round, roundeven). This is trunc if \p IsTrunc. \p
477 /// IsMultiUnitFPType if this is for a multi-unit floating-point type.
479 bool IsTrunc,
480 bool IsMultiUnitFPType);
481
482 /// Propagate known class for mantissa component of frexp
484 frexp_mant(const KnownFPClass &Src,
486
487 /// Propagate known class for ldexp, assuming the exponent is known to be
488 /// within [\p ConstantRangeMin, \p ConstantRangeMax]
489 ///
490 // TODO: This really ought to use ConstantRange, but it's in IR not Support.
492 ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin,
493 const APInt &ConstantRangeMax, const fltSemantics &Flt,
496 ldexp(const KnownFPClass &Src, const KnownBits &ExpBits,
497 const fltSemantics &Flt,
499
500 /// Propagate known class for pow
502 const KnownFPClass &RHS);
503
504 /// Propagate known class for powi
505 LLVM_ABI static KnownFPClass powi(const KnownFPClass &Src,
506 const KnownBits &N);
507
508 void resetAll() { *this = KnownFPClass(); }
509};
510
512 LHS |= RHS;
513 return LHS;
514}
515
517 RHS |= LHS;
518 return std::move(RHS);
519}
520
521} // namespace llvm
522
523#endif
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_ABI
Definition Compiler.h:215
Utilities for dealing with flags related to floating point properties and mode controls.
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")))
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
This is an optimization pass for GlobalISel generic memory operations.
@ Known
Known to have no common set bits.
LLVM_ABI FPClassTest fneg(FPClassTest Mask)
Return the test mask which returns true if the value's sign bit is flipped.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
@ Other
Any other memory.
Definition ModRef.h:68
APInt operator|(APInt a, const APInt &b)
Definition APInt.h:2170
#define N
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getDynamic()
void propagateNonSNaN(const KnownFPClass &LHS, const KnownFPClass &RHS)
bool isKnownNeverInfOrNaN() const
Return true if it's known this can never be an infinity or nan.
bool isKnownAlwaysNaN() const
Return true if it's known this must always be a nan.
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
bool isKnownNeverInfinity() const
Return true if it's known this can never be an infinity.
KnownFPClass(FPClassTest Known=fcAllFlags, std::optional< bool > Sign={})
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
void knownNot(FPClassTest RuleOut)
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmul.
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.
void copysign(const KnownFPClass &Sign)
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
void propagateNonNaN(const KnownFPClass &LHS, const KnownFPClass &RHS)
KnownFPClass unionWith(const KnownFPClass &RHS) const
void propagateXorSign(const KnownFPClass &LHS, const KnownFPClass &RHS)
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 log(const KnownFPClass &Src, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for log/log2/log10.
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.
LLVM_ABI void propagateDenormal(const KnownFPClass &Src, DenormalMode Mode)
Propagate knowledge from a source value that could be a denormal or zero.
bool cannotBeOrderedLessEqZero(DenormalMode Mode) const
Return true if it's known this can never be a positive value or a logical 0.
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fdiv.
KnownFPClass & operator|=(const KnownFPClass &RHS)
static KnownFPClass fneg(const KnownFPClass &Src)
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsTrunc, bool IsMultiUnitFPType)
Propagate known class for rounding intrinsics (trunc, floor, ceil, rint, nearbyint,...
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 isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
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.
static KnownFPClass copysign(const KnownFPClass &KnownMag, const KnownFPClass &KnownSign)
bool isKnownNeverNegZero() const
Return true if it's known this can never be a negative zero.
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.
void propagateNonSNaN(const KnownFPClass &Src)
bool cannotBeOrderedLessThanZero() const
Return true if we can prove that the analyzed floating-point value is either NaN or never less than -...
void signBitMustBeOne()
Assume the sign bit is one.
LLVM_ABI void propagateCanonicalizingSrc(const KnownFPClass &Src, DenormalMode Mode)
Report known classes if Src is evaluated through a potentially canonicalizing operation.
void signBitMustBeZero()
Assume the sign bit is zero.
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.
bool cannotBeOrderedGreaterEqZero(DenormalMode Mode) const
Return true if it's know this can never be a negative value or a logical 0.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fadd.
static KnownFPClass fabs(const KnownFPClass &Src)
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.
bool operator==(KnownFPClass Other) const
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.
void propagateNonNaN(const KnownFPClass &Src)
std::optional< bool > SignBitValue
static LLVM_ABI KnownFPClass pow(const KnownFPClass &LHS, const KnownFPClass &RHS)
Propagate known class for pow.
bool signBitIsZeroOrNaN() const
Return true if the sign bit must be 0, ignoring the sign of nans.
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.