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
29 std::optional<bool> SignBitValue;
30
31 /// Floating-point classes the value could be one of.
33
35
36 /// std::nullopt if the sign bit is unknown, true if the sign bit is
37 /// definitely set or false if the sign bit is definitely unset.
38 std::optional<bool> getSignBit() const { return SignBitValue; }
39
40 void setSignBit(std::optional<bool> Sign) { SignBitValue = Sign; }
41
42 KnownFPClass(FPClassTest Known = fcAllFlags, std::optional<bool> Sign = {})
44 LLVM_ABI KnownFPClass(const APFloat &C);
45
47 return getKnownFPClasses() == Other.getKnownFPClasses() &&
48 getSignBit() == Other.getSignBit();
49 }
50
51 /// Return true if it's known this can never be one of the mask entries.
52 bool isKnownNever(FPClassTest Mask) const {
53 return (getKnownFPClasses() & Mask) == fcNone;
54 }
55
56 bool isKnownAlways(FPClassTest Mask) const { return isKnownNever(~Mask); }
57
58 bool isUnknown() const {
59 return getKnownFPClasses() == fcAllFlags && !getSignBit();
60 }
61
62 /// Return true if it's known this can never be a nan.
63 bool isKnownNeverNaN() const { return isKnownNever(fcNan); }
64
65 /// Return true if it's known this must always be a nan.
66 bool isKnownAlwaysNaN() const { return isKnownAlways(fcNan); }
67
68 /// Return true if it's known this can never be an infinity.
69 bool isKnownNeverInfinity() const { return isKnownNever(fcInf); }
70
71 /// Return true if it's known this can never be an infinity or nan
72 bool isKnownNeverInfOrNaN() const { return isKnownNever(fcInf | fcNan); }
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 -infinity.
79
80 /// Return true if it's known this can never be a subnormal
82
83 /// Return true if it's known this can never be a positive subnormal
85
86 /// Return true if it's known this can never be a negative subnormal
88
89 /// Return true if it's known this can never be a zero. This means a literal
90 /// [+-]0, and does not include denormal inputs implicitly treated as [+-]0.
91 bool isKnownNeverZero() const { return isKnownNever(fcZero); }
92
93 /// Return true if it's known this can never be a literal positive zero.
94 bool isKnownNeverPosZero() const { return isKnownNever(fcPosZero); }
95
96 /// Return true if it's known this can never be a negative zero. This means a
97 /// literal -0 and does not include denormal inputs implicitly treated as -0.
98 bool isKnownNeverNegZero() const { return isKnownNever(fcNegZero); }
99
100 /// Return true if it's known this can never be interpreted as a zero. This
101 /// extends isKnownNeverZero to cover the case where the assumed
102 /// floating-point mode for the function interprets denormals as zero.
104
105 /// Return true if it's known this can never be interpreted as a negative
106 /// zero.
108
109 /// Return true if it's known this can never be interpreted as a positive
110 /// zero.
112
117
118 /// Return true if we can prove that the analyzed floating-point value is
119 /// either NaN or never less than -0.0.
120 ///
121 /// NaN --> true
122 /// +0 --> true
123 /// -0 --> true
124 /// x > +0 --> true
125 /// x < -0 --> false
129
130 /// Return true if we can prove that the analyzed floating-point value is
131 /// either NaN or never greater than -0.0.
132 /// NaN --> true
133 /// +0 --> true
134 /// -0 --> true
135 /// x > +0 --> false
136 /// x < -0 --> true
140
141 /// Return true if it's known this can never be a positive value or a logical
142 /// 0.
143 ///
144 /// NaN --> true
145 /// x <= +0 --> false
146 /// psub --> true if mode is ieee, false otherwise.
147 /// x > +0 --> true
151
152 /// Return true if it's know this can never be a negative value or a logical
153 /// 0.
154 ///
155 /// NaN --> true
156 /// x >= -0 --> false
157 /// nsub --> true if mode is ieee, false otherwise.
158 /// x < -0 --> true
162
164 return KnownFPClass(getKnownFPClasses() | RHS.getKnownFPClasses(),
165 getSignBit() == RHS.getSignBit() ? getSignBit()
166 : std::nullopt);
167 }
168
170 std::optional<bool> MergedSignBit;
171 if (getSignBit() && !RHS.getSignBit())
172 MergedSignBit = getSignBit();
173 else if (!getSignBit() && RHS.getSignBit())
174 MergedSignBit = RHS.getSignBit();
175
176 return KnownFPClass(getKnownFPClasses() & RHS.getKnownFPClasses(),
177 MergedSignBit);
178 }
179
181 setKnownFPClasses(getKnownFPClasses() | RHS.getKnownFPClasses());
182
183 if (getSignBit() != RHS.getSignBit())
184 setSignBit(std::nullopt);
185 return *this;
186 }
187
188 void knownNot(FPClassTest RuleOut) {
190 if (isKnownNever(fcNan) && !getSignBit()) {
192 setSignBit(false);
193 else if (isKnownNever(fcPositive))
194 setSignBit(true);
195 }
196 }
197
198 void fneg() {
200 if (std::optional<bool> Sign = getSignBit())
201 setSignBit(!*Sign);
202 }
203
204 static KnownFPClass fneg(const KnownFPClass &Src) {
205 KnownFPClass Known = Src;
206 Known.fneg();
207 return Known;
208 }
209
225
226 static KnownFPClass fabs(const KnownFPClass &Src) {
227 KnownFPClass Known = Src;
228 Known.fabs();
229 return Known;
230 }
231
232 // Enum of min/max intrinsics to avoid dependency on IR.
241
245
246 /// Apply the canonicalize intrinsic to this value. This is essentially a
247 /// stronger form of propagateCanonicalizingSrc.
249 canonicalize(const KnownFPClass &Src,
251
252 /// Report known values for a bitcast into a float with provided semantics.
253 LLVM_ABI static KnownFPClass bitcast(const fltSemantics &FltSemantics,
254 const KnownBits &Bits);
255
256 /// Report known bits for a float with provided semantics.
257 LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const;
258
259 /// Report known values for fadd
261 fadd(const KnownFPClass &LHS, const KnownFPClass &RHS,
263
264 /// Report known values for fadd x, x
266 fadd_self(const KnownFPClass &Src,
268
269 /// Report known values for fsub
271 fsub(const KnownFPClass &LHS, const KnownFPClass &RHS,
273
274 /// Report known values for fmul
276 fmul(const KnownFPClass &LHS, const KnownFPClass &RHS,
278
279 // Special case of fmul x, x.
282 KnownFPClass Known = fmul(Src, Src, Mode);
283
284 // X * X is always non-negative or a NaN.
285 Known.knownNot(fcNegative);
286 Known.propagateNonNaN(Src);
287 return Known;
288 }
289
291 fmul(const KnownFPClass &LHS, const APFloat &RHS,
293
294 /// Report known values for fdiv
296 fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS,
298
299 /// Report known values for fdiv x, x
301 fdiv_self(const KnownFPClass &Src,
303
304 /// Report known values for frem
306 frem(const KnownFPClass &LHS, const KnownFPClass &RHS,
308
309 /// Report known values for frem x, x
311 frem_self(const KnownFPClass &Src,
313
314 /// Report known values for fma
316 fma(const KnownFPClass &LHS, const KnownFPClass &RHS,
317 const KnownFPClass &Addend,
319
320 /// Report known values for fma squared, squared, addend
322 fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend,
324
325 /// Propagate known class for sqrt
328
329 /// Propagate known class for log/log2/log10
332
333 /// Report known values for exp, exp2 and exp10
334 LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
335
336 /// Report known values for sin
337 LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
338
339 /// Report known values for cos
340 LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
341
342 /// Report known values for tan
343 LLVM_ABI static KnownFPClass tan(const KnownFPClass &Src);
344
345 /// Report known values for sinh
346 LLVM_ABI static KnownFPClass sinh(const KnownFPClass &Src);
347
348 /// Report known values for cosh
349 LLVM_ABI static KnownFPClass cosh(const KnownFPClass &Src);
350
351 /// Report known values for tanh
352 LLVM_ABI static KnownFPClass tanh(const KnownFPClass &Src);
353
354 /// Report known values for asin
355 LLVM_ABI static KnownFPClass asin(const KnownFPClass &Src);
356
357 /// Report known values for acos
358 LLVM_ABI static KnownFPClass acos(const KnownFPClass &Src);
359
360 /// Report known values for atan
361 LLVM_ABI static KnownFPClass atan(const KnownFPClass &Src);
362
363 /// Report known values for atan2
365 atan2(const KnownFPClass &LHS, const KnownFPClass &RHS,
367
368 /// Return true if the sign bit must be 0, ignoring the sign of nans.
370
371 /// Assume the sign bit is zero.
376
377 /// Assume the sign bit is one.
382
383 void copysign(const KnownFPClass &Sign) {
384 // Don't know anything about the sign of the source. Expand the possible set
385 // to its opposite sign pair.
392 if (getKnownFPClasses() & fcInf)
394
395 // Sign bit is exactly preserved even for nans.
396 setSignBit(Sign.getSignBit());
397
398 // Clear sign bits based on the input sign mask.
399 if (Sign.isKnownNever(fcPositive | fcNan) ||
400 (getSignBit() && *getSignBit()))
402 if (Sign.isKnownNever(fcNegative | fcNan) ||
403 (getSignBit() && !*getSignBit()))
405 }
406
407 static KnownFPClass copysign(const KnownFPClass &KnownMag,
408 const KnownFPClass &KnownSign) {
409 KnownFPClass Known = KnownMag;
410 Known.copysign(KnownSign);
411 return Known;
412 }
413
414 // Propagate knowledge that an operation cannot introduce a signaling NaN.
416 if (Src.isKnownNever(fcSNan))
418 }
419
420 // Propagate knowledge that an operation cannot introduce a signaling NaN.
422 if (LHS.isKnownNever(fcSNan) && RHS.isKnownNever(fcSNan))
424 }
425
426 // Propagate knowledge that a non-NaN source implies the result can also not
427 // be a NaN. For unconstrained operations, signaling nans are not guaranteed
428 // to be quieted but cannot be introduced.
429 void propagateNonNaN(const KnownFPClass &Src) {
430 propagateNonSNaN(Src);
431 if (Src.isKnownNever(fcNan))
433 }
434
437 if (LHS.isKnownNeverNaN() && RHS.isKnownNeverNaN())
439 }
440
441 // Propagate knowledge for operations whose result sign is the xor of the
442 // operand signs, such as multiply and divide. This only rules out possible
443 // non-NaN sign classes. NaNs do not have a constrained sign class here.
445 if ((LHS.isKnownNever(fcNegative) && RHS.isKnownNever(fcNegative)) ||
446 (LHS.isKnownNever(fcPositive) && RHS.isKnownNever(fcPositive)))
448
449 if ((LHS.isKnownNever(fcPositive) && RHS.isKnownNever(fcNegative)) ||
450 (LHS.isKnownNever(fcNegative) && RHS.isKnownNever(fcPositive)))
452 }
453
454 /// Propagate knowledge from a source value that could be a denormal or
455 /// zero. We have to be conservative since output flushing is not guaranteed,
456 /// so known-never-zero may not hold.
457 ///
458 /// This assumes a copy-like operation and will replace any currently known
459 /// information.
461
462 /// Report known classes if \p Src is evaluated through a potentially
463 /// canonicalizing operation. We can assume signaling nans will not be
464 /// introduced, but cannot assume a denormal will be flushed under FTZ/DAZ.
465 ///
466 /// This assumes a copy-like operation and will replace any currently known
467 /// information.
470
471 /// Propagate known class for fpext.
472 LLVM_ABI static KnownFPClass fpext(const KnownFPClass &KnownSrc,
473 const fltSemantics &DstTy,
474 const fltSemantics &SrcTy);
475
476 /// Propagate known class for fptrunc.
477 LLVM_ABI static KnownFPClass fptrunc(const KnownFPClass &KnownSrc);
478
479 /// Propagate known class for rounding intrinsics (trunc, floor, ceil, rint,
480 /// nearbyint, round, roundeven). This is trunc if \p IsTrunc. \p
481 /// IsMultiUnitFPType if this is for a multi-unit floating-point type.
483 bool IsTrunc,
484 bool IsMultiUnitFPType);
485
486 /// Propagate known class for mantissa component of frexp
488 frexp_mant(const KnownFPClass &Src,
490
491 /// Propagate known class for ldexp, assuming the exponent is known to be
492 /// within [\p ConstantRangeMin, \p ConstantRangeMax]
493 ///
494 // TODO: This really ought to use ConstantRange, but it's in IR not Support.
496 ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin,
497 const APInt &ConstantRangeMax, const fltSemantics &Flt,
500 ldexp(const KnownFPClass &Src, const KnownBits &ExpBits,
501 const fltSemantics &Flt,
503
504 /// Propagate known class for pow
506 const KnownFPClass &RHS);
507
508 /// Propagate known class for powi
509 LLVM_ABI static KnownFPClass powi(const KnownFPClass &Src,
510 const KnownBits &N);
511
512 void resetAll() { *this = KnownFPClass(); }
513};
514
516 LHS |= RHS;
517 return LHS;
518}
519
521 RHS |= LHS;
522 return std::move(RHS);
523}
524
525} // namespace llvm
526
527#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.
void setKnownFPClasses(FPClassTest Classes)
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
FPClassTest KnownFPClassesValue
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)
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 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.