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
163 /// Return the known classes of \p Src after passing through an input that
164 /// may flush subnormals to zero according to \p Mode.
167
168 /// Return the known classes of \p Src after producing an output that may
169 /// flush subnormals to zero according to \p Mode.
172
174 return KnownFPClass(getKnownFPClasses() | RHS.getKnownFPClasses(),
175 getSignBit() == RHS.getSignBit() ? getSignBit()
176 : std::nullopt);
177 }
178
180 std::optional<bool> MergedSignBit;
181 if (getSignBit() && !RHS.getSignBit())
182 MergedSignBit = getSignBit();
183 else if (!getSignBit() && RHS.getSignBit())
184 MergedSignBit = RHS.getSignBit();
185
186 return KnownFPClass(getKnownFPClasses() & RHS.getKnownFPClasses(),
187 MergedSignBit);
188 }
189
191 setKnownFPClasses(getKnownFPClasses() | RHS.getKnownFPClasses());
192
193 if (getSignBit() != RHS.getSignBit())
194 setSignBit(std::nullopt);
195 return *this;
196 }
197
198 void knownNot(FPClassTest RuleOut) {
200 if (isKnownNever(fcNan) && !getSignBit()) {
202 setSignBit(false);
203 else if (isKnownNever(fcPositive))
204 setSignBit(true);
205 }
206 }
207
208 void fneg() {
210 if (std::optional<bool> Sign = getSignBit())
211 setSignBit(!*Sign);
212 }
213
214 static KnownFPClass fneg(const KnownFPClass &Src) {
215 KnownFPClass Known = Src;
216 Known.fneg();
217 return Known;
218 }
219
235
236 static KnownFPClass fabs(const KnownFPClass &Src) {
237 KnownFPClass Known = Src;
238 Known.fabs();
239 return Known;
240 }
241
242 // Enum of min/max intrinsics to avoid dependency on IR.
251
255
256 /// Apply the canonicalize intrinsic to this value.
258 canonicalize(const KnownFPClass &Src,
260
261 /// Report known values for a bitcast into a float with provided semantics.
262 LLVM_ABI static KnownFPClass bitcast(const fltSemantics &FltSemantics,
263 const KnownBits &Bits);
264
265 /// Report known bits for a float with provided semantics.
266 LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const;
267
268 /// Report known values for fadd
270 fadd(const KnownFPClass &LHS, const KnownFPClass &RHS,
272
273 /// Report known values for fadd x, x
275 fadd_self(const KnownFPClass &Src,
277
278 /// Report known values for fsub
280 fsub(const KnownFPClass &LHS, const KnownFPClass &RHS,
282
283 /// Report known values for fmul
285 fmul(const KnownFPClass &LHS, const KnownFPClass &RHS,
287
288 // Special case of fmul x, x.
291 KnownFPClass Known = fmul(Src, Src, Mode);
292
293 // X * X is always non-negative or a NaN.
294 Known.knownNot(fcNegative);
295 Known.propagateNonNaN(Src);
296 return Known;
297 }
298
300 fmul(const KnownFPClass &LHS, const APFloat &RHS,
302
303 /// Report known values for fdiv
305 fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS,
307
308 /// Report known values for fdiv x, x
310 fdiv_self(const KnownFPClass &Src,
312
313 /// Report known values for frem
315 frem(const KnownFPClass &LHS, const KnownFPClass &RHS,
317
318 /// Report known values for frem x, x
320 frem_self(const KnownFPClass &Src,
322
323 /// Report known values for fma
325 fma(const KnownFPClass &LHS, const KnownFPClass &RHS,
326 const KnownFPClass &Addend,
328
329 /// Report known values for fmuladd
331 fmuladd(const KnownFPClass &LHS, const KnownFPClass &RHS,
332 const KnownFPClass &Addend,
334
335 /// Report known values for fma squared, squared, addend
337 fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend,
339
340 /// Report known values for fmuladd squared, squared, addend
342 fmuladd_square(const KnownFPClass &Squared, const KnownFPClass &Addend,
344
345 /// Propagate known class for sqrt
348
349 /// Propagate known class for log/log2/log10
350 ///
351 /// \p IsMultiUnitFPType if this is for a multi-unit floating-point type.
353 bool IsMultiUnitFPType);
354
355 /// Report known values for exp, exp2 and exp10.
356 /// This function assumes that exp10(-1.0) = +0.1 and exp10(+1.0) = +10.0 are
357 /// both finite normal values, which holds for formats with a corresponding
358 /// LLVM IR type (e.g. does not hold for Float4E2M1FN).
359 LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
360
361 /// Report known values for sin
362 LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
363
364 /// Report known values for cos
365 LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
366
367 /// Report known values for tan
368 LLVM_ABI static KnownFPClass tan(const KnownFPClass &Src);
369
370 /// Report known values for sinh
371 LLVM_ABI static KnownFPClass sinh(const KnownFPClass &Src);
372
373 /// Report known values for cosh
374 LLVM_ABI static KnownFPClass cosh(const KnownFPClass &Src);
375
376 /// Report known values for tanh
377 LLVM_ABI static KnownFPClass tanh(const KnownFPClass &Src);
378
379 /// Report known values for asin
380 LLVM_ABI static KnownFPClass asin(const KnownFPClass &Src);
381
382 /// Report known values for acos
383 LLVM_ABI static KnownFPClass acos(const KnownFPClass &Src);
384
385 /// Report known values for atan
386 LLVM_ABI static KnownFPClass atan(const KnownFPClass &Src);
387
388 /// Report known values for atan2
390 atan2(const KnownFPClass &LHS, const KnownFPClass &RHS,
392
393 /// Return true if the sign bit must be 0, ignoring the sign of nans.
395
396 /// Assume the sign bit is zero.
401
402 /// Assume the sign bit is one.
407
408 void copysign(const KnownFPClass &Sign) {
409 // Don't know anything about the sign of the source. Expand the possible set
410 // to its opposite sign pair.
417 if (getKnownFPClasses() & fcInf)
419
420 // Sign bit is exactly preserved even for nans.
421 setSignBit(Sign.getSignBit());
422
423 // Clear sign bits based on the input sign mask.
424 if (Sign.isKnownNever(fcPositive | fcNan) ||
425 (getSignBit() && *getSignBit()))
427 if (Sign.isKnownNever(fcNegative | fcNan) ||
428 (getSignBit() && !*getSignBit()))
430 }
431
432 static KnownFPClass copysign(const KnownFPClass &KnownMag,
433 const KnownFPClass &KnownSign) {
434 KnownFPClass Known = KnownMag;
435 Known.copysign(KnownSign);
436 return Known;
437 }
438
439 // Propagate knowledge that an operation cannot introduce a signaling NaN.
441 if (Src.isKnownNever(fcSNan))
443 }
444
445 // Propagate knowledge that an operation cannot introduce a signaling NaN.
447 if (LHS.isKnownNever(fcSNan) && RHS.isKnownNever(fcSNan))
449 }
450
451 // Propagate knowledge that a non-NaN source implies the result can also not
452 // be a NaN. For unconstrained operations, signaling nans are not guaranteed
453 // to be quieted but cannot be introduced.
454 void propagateNonNaN(const KnownFPClass &Src) {
455 propagateNonSNaN(Src);
456 if (Src.isKnownNever(fcNan))
458 }
459
462 if (LHS.isKnownNeverNaN() && RHS.isKnownNeverNaN())
464 }
465
466 /// Propagate known class for fpext.
467 LLVM_ABI static KnownFPClass fpext(const KnownFPClass &KnownSrc,
468 const fltSemantics &DstTy,
469 const fltSemantics &SrcTy);
470
471 /// Propagate known class for fptrunc.
472 LLVM_ABI static KnownFPClass fptrunc(const KnownFPClass &KnownSrc);
473
474 /// Propagate known class for rounding intrinsics (rint, nearbyint, round,
475 /// roundeven). \p IsMultiUnitFPType if this is for a multi-unit
476 /// floating-point type.
478 roundToIntegral(const KnownFPClass &Src, bool IsMultiUnitFPType,
480
481 /// Propagate known class for trunc.
483 trunc(const KnownFPClass &Src,
485
486 /// Propagate known class for floor. \p IsMultiUnitFPType if this is for a
487 /// multi-unit floating-point type.
489 floor(const KnownFPClass &Src, bool IsMultiUnitFPType,
491
492 /// Propagate known class for ceil. \p IsMultiUnitFPType if this is for a
493 /// multi-unit floating-point type.
495 ceil(const KnownFPClass &Src, bool IsMultiUnitFPType,
497
498 /// Propagate known class for mantissa component of frexp
500 frexp_mant(const KnownFPClass &Src,
502
503 /// Propagate known class for ldexp, assuming the exponent is known to be
504 /// within [\p ConstantRangeMin, \p ConstantRangeMax]
505 ///
506 // TODO: This really ought to use ConstantRange, but it's in IR not Support.
508 ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin,
509 const APInt &ConstantRangeMax, const fltSemantics &Flt,
512 ldexp(const KnownFPClass &Src, const KnownBits &ExpBits,
513 const fltSemantics &Flt,
515
516 /// Propagate known class for pow
518 const KnownFPClass &RHS);
519
520 /// Propagate known class for powi
521 LLVM_ABI static KnownFPClass powi(const KnownFPClass &Src,
522 const KnownBits &N);
523
524 void resetAll() { *this = KnownFPClass(); }
525};
526
528 LHS |= RHS;
529 return LHS;
530}
531
533 RHS |= LHS;
534 return std::move(RHS);
535}
536
537} // namespace llvm
538
539#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:2169
#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={})
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
void knownNot(FPClassTest RuleOut)
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 LLVM_ABI KnownFPClass fmuladd(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmuladd.
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
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.
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 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())
static LLVM_ABI KnownFPClass fmuladd_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode=DenormalMode::getDynamic())
Report known values for fmuladd squared, squared, addend.
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 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.
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.
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)
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.
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.
static LLVM_ABI KnownFPClass floor(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode=DenormalMode::getDynamic())
Propagate known class for floor.
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.