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
20#include <optional>
21
22namespace llvm {
23class APFloat;
24class APInt;
25struct fltSemantics;
26struct KnownBits;
27
65
68
69 static constexpr FPClassMask toFPClassMask(FPClassTest Classes) {
71
72 if (Classes & fcQNan)
74 if (Classes & fcSNan)
76 if (Classes & fcNegInf)
78 if (Classes & fcNegNormal)
80 if (Classes & fcNegSubnormal)
82 if (Classes & fcNegZero)
84 if (Classes & fcPosZero)
86 if (Classes & fcPosSubnormal)
88 if (Classes & fcPosNormal)
90 if (Classes & fcPosInf)
92
93 return Mask;
94 }
95
96 static constexpr FPClassMask toFPClassMask(FPClassTest Classes,
97 bool SignBit) {
98 FPClassMask Mask = toFPClassMask(Classes);
99
100 // This is the only way to generate a NaN with a specific sign from
101 // FPClassTest. SignBit must agree with the input classes.
102 if (!SignBit) {
104 // If the SignBit is false, then we should not have any negative classes.
106 return Mask;
107 } else {
109 // If the SignBit is true, then we should not have any positive classes.
111 return Mask;
112 }
113
114 // SignBit is unknown or inconsistent with the input classes. Expand the
115 // possible set to its opposite sign pair.
116 if (Classes & fcQNan)
117 Mask |= FPClassMask::kfcQNan;
118 if (Classes & fcSNan)
119 Mask |= FPClassMask::kfcSNan;
120 if (Classes & fcInf)
121 Mask |= FPClassMask::kfcInf;
122 if (Classes & fcNormal)
124 if (Classes & fcSubnormal)
126 if (Classes & fcZero)
127 Mask |= FPClassMask::kfcZero;
128
129 return Mask;
130 }
131
132 static constexpr FPClassTest toFPClassTest(FPClassMask Mask) {
133 FPClassTest Classes = fcNone;
134
135 // Sign of qNaN and sNaN are lost in the conversion.
137 Classes |= fcQNan;
139 Classes |= fcSNan;
140
142 Classes |= fcNegInf;
144 Classes |= fcNegNormal;
146 Classes |= fcNegSubnormal;
148 Classes |= fcNegZero;
150 Classes |= fcPosZero;
152 Classes |= fcPosSubnormal;
154 Classes |= fcPosNormal;
156 Classes |= fcPosInf;
157
158 return Classes;
159 }
160
161public:
162 /// Floating-point classes the value could be one of.
163 FPClassTest getKnownFPClasses() const { return toFPClassTest(KnownFPMask); }
164
166 KnownFPMask = toFPClassMask(Classes);
167 }
168
169 /// std::nullopt if the sign bit is unknown, true if the sign bit is
170 /// definitely set or false if the sign bit is definitely unset.
171 /// By convention, returns false for kfcNone/poison.
172 std::optional<bool> getSignBit() const {
173 if (KnownFPMask == FPClassMask::kfcNone)
174 return false;
175
176 if ((KnownFPMask & FPClassMask::kfcPosSignBit) == KnownFPMask)
177 return false;
178 if ((KnownFPMask & FPClassMask::kfcNegSignBit) == KnownFPMask)
179 return true;
180
181 return std::nullopt;
182 }
183
184 void setSignBit(std::optional<bool> Sign) {
185 if (Sign && !*Sign) {
186 KnownFPMask &= FPClassMask::kfcPosSignBit;
187 return;
188 }
189 if (Sign && *Sign) {
190 KnownFPMask &= FPClassMask::kfcNegSignBit;
191 return;
192 }
193 // Set sign to unknown.
194 if ((KnownFPMask & FPClassMask::kfcQNan) != FPClassMask::kfcNone)
195 KnownFPMask |= FPClassMask::kfcQNan;
196 if ((KnownFPMask & FPClassMask::kfcSNan) != FPClassMask::kfcNone)
197 KnownFPMask |= FPClassMask::kfcSNan;
198 if ((KnownFPMask & FPClassMask::kfcInf) != FPClassMask::kfcNone)
199 KnownFPMask |= FPClassMask::kfcInf;
200 if ((KnownFPMask & FPClassMask::kfcNormal) != FPClassMask::kfcNone)
201 KnownFPMask |= FPClassMask::kfcNormal;
202 if ((KnownFPMask & FPClassMask::kfcSubnormal) != FPClassMask::kfcNone)
203 KnownFPMask |= FPClassMask::kfcSubnormal;
204 if ((KnownFPMask & FPClassMask::kfcZero) != FPClassMask::kfcNone)
205 KnownFPMask |= FPClassMask::kfcZero;
206 }
207
210 KnownFPClass(FPClassTest Known) : KnownFPMask(toFPClassMask(Known)) {}
212 : KnownFPMask(toFPClassMask(Known, Sign)) {}
214
216
218 return KnownFPMask == Other.KnownFPMask;
219 }
220
221 /// Return true if it's known this can never be one of the mask entries.
222 bool isKnownNever(FPClassMask Mask) const {
223 return (KnownFPMask & Mask) == FPClassMask::kfcNone;
224 }
225
226 /// Return true if it's known this can never be one of the mask entries.
227 bool isKnownNever(FPClassTest Mask) const {
228 return isKnownNever(toFPClassMask(Mask));
229 }
230
231 bool isKnownAlways(FPClassMask Mask) const { return isKnownNever(~Mask); }
232
233 bool isKnownAlways(FPClassTest Mask) const {
234 return isKnownAlways(toFPClassMask(Mask));
235 }
236
237 bool isUnknown() const { return KnownFPMask == FPClassMask::kfcAllFlags; }
238
239 /// Return true if it's known this can never be a nan.
240 bool isKnownNeverNaN() const { return isKnownNever(fcNan); }
241
242 /// Return true if it's known this must always be a nan.
243 bool isKnownAlwaysNaN() const { return isKnownAlways(fcNan); }
244
245 /// Return true if it's known this can never be an infinity.
246 bool isKnownNeverInfinity() const { return isKnownNever(fcInf); }
247
248 /// Return true if it's known this can never be an infinity or nan
249 bool isKnownNeverInfOrNaN() const { return isKnownNever(fcInf | fcNan); }
250
251 /// Return true if it's known this can never be +infinity.
253
254 /// Return true if it's known this can never be -infinity.
256
257 /// Return true if it's known this can never be a subnormal
259
260 /// Return true if it's known this can never be a positive subnormal
262
263 /// Return true if it's known this can never be a negative subnormal
265
266 /// Return true if it's known this can never be interpreted as a zero. This
267 /// extends isKnownNever(fcZero) to cover the case where the assumed
268 /// floating-point mode for the function interprets denormals as zero.
270
271 /// Return true if it's known this can never be interpreted as a negative
272 /// zero.
274
275 /// Return true if it's known this can never be interpreted as a positive
276 /// zero.
278
283
284 /// Return true if we can prove that the analyzed floating-point value is
285 /// either NaN or never less than -0.0.
286 ///
287 /// NaN --> true
288 /// +0 --> true
289 /// -0 --> true
290 /// x > +0 --> true
291 /// x < -0 --> false
295
296 /// Return true if we can prove that the analyzed floating-point value is
297 /// either NaN or never greater than -0.0.
298 /// NaN --> true
299 /// +0 --> true
300 /// -0 --> true
301 /// x > +0 --> false
302 /// x < -0 --> true
306
307 /// Return true if it's known this can never be a positive value or a logical
308 /// 0.
309 ///
310 /// NaN --> true
311 /// x <= +0 --> false
312 /// psub --> true if mode is ieee, false otherwise.
313 /// x > +0 --> true
317
318 /// Return true if it's know this can never be a negative value or a logical
319 /// 0.
320 ///
321 /// NaN --> true
322 /// x >= -0 --> false
323 /// nsub --> true if mode is ieee, false otherwise.
324 /// x < -0 --> true
328
329 /// Return the known classes of \p Src after passing through an input that
330 /// may flush subnormals to zero according to \p Mode.
333
334 /// Return the known classes of \p Src after producing an output that may
335 /// flush subnormals to zero according to \p Mode.
338
340 return KnownFPClass(KnownFPMask | RHS.KnownFPMask);
341 }
342
344 return KnownFPClass(KnownFPMask & RHS.KnownFPMask);
345 }
346
348 KnownFPMask |= RHS.KnownFPMask;
349 return *this;
350 }
351
352 void knownNot(FPClassMask RuleOut) { KnownFPMask &= ~RuleOut; }
353
354 void knownNot(FPClassTest RuleOut) { knownNot(toFPClassMask(RuleOut)); }
355
386
387 static KnownFPClass fneg(const KnownFPClass &Src) {
388 KnownFPClass Known = Src;
389 Known.fneg();
390 return Known;
391 }
392
411
412 static KnownFPClass fabs(const KnownFPClass &Src) {
413 KnownFPClass Known = Src;
414 Known.fabs();
415 return Known;
416 }
417
418 // Enum of min/max intrinsics to avoid dependency on IR.
427
431
432 /// Apply the canonicalize intrinsic to this value.
434 canonicalize(const KnownFPClass &Src,
436
437 /// Report known values for a bitcast into a float with provided semantics.
438 LLVM_ABI static KnownFPClass bitcast(const fltSemantics &FltSemantics,
439 const KnownBits &Bits);
440
441 /// Report known bits for a float with provided semantics.
442 LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const;
443
444 /// Report known values for fadd
446 fadd(const KnownFPClass &LHS, const KnownFPClass &RHS,
448
449 /// Report known values for fadd x, x
451 fadd_self(const KnownFPClass &Src,
453
454 /// Report known values for fsub
456 fsub(const KnownFPClass &LHS, const KnownFPClass &RHS,
458
459 /// Report known values for fmul
461 fmul(const KnownFPClass &LHS, const KnownFPClass &RHS,
463
464 // Special case of fmul x, x.
467 KnownFPClass Known = fmul(Src, Src, Mode);
468
469 // X * X is always non-negative or a NaN.
470 Known.knownNot(fcNegative);
471 Known.propagateNonNaN(Src);
472 return Known;
473 }
474
476 fmul(const KnownFPClass &LHS, const APFloat &RHS,
478
479 /// Report known values for fdiv
481 fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS,
483
484 /// Report known values for fdiv x, x
486 fdiv_self(const KnownFPClass &Src,
488
489 /// Report known values for frem
491 frem(const KnownFPClass &LHS, const KnownFPClass &RHS,
493
494 /// Report known values for frem x, x
496 frem_self(const KnownFPClass &Src,
498
499 /// Report known values for fma
501 fma(const KnownFPClass &LHS, const KnownFPClass &RHS,
502 const KnownFPClass &Addend,
504
505 /// Report known values for fmuladd
507 fmuladd(const KnownFPClass &LHS, const KnownFPClass &RHS,
508 const KnownFPClass &Addend,
510
511 /// Report known values for fma squared, squared, addend
513 fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend,
515
516 /// Report known values for fmuladd squared, squared, addend
518 fmuladd_square(const KnownFPClass &Squared, const KnownFPClass &Addend,
520
521 /// Propagate known class for sqrt
524
525 /// Propagate known class for log/log2/log10
526 ///
527 /// \p IsMultiUnitFPType if this is for a multi-unit floating-point type.
529 bool IsMultiUnitFPType);
530
531 /// Report known values for exp, exp2 and exp10.
532 /// This function assumes that exp10(-1.0) = +0.1 and exp10(+1.0) = +10.0 are
533 /// both finite normal values, which holds for formats with a corresponding
534 /// LLVM IR type (e.g. does not hold for Float4E2M1FN).
535 LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
536
537 /// Report known values for sin
538 LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
539
540 /// Report known values for cos
541 LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
542
543 /// Report known values for tan
544 LLVM_ABI static KnownFPClass tan(const KnownFPClass &Src);
545
546 /// Report known values for sinh
547 LLVM_ABI static KnownFPClass sinh(const KnownFPClass &Src);
548
549 /// Report known values for cosh
550 LLVM_ABI static KnownFPClass cosh(const KnownFPClass &Src);
551
552 /// Report known values for tanh
553 LLVM_ABI static KnownFPClass tanh(const KnownFPClass &Src);
554
555 /// Report known values for asin
556 LLVM_ABI static KnownFPClass asin(const KnownFPClass &Src);
557
558 /// Report known values for acos
559 LLVM_ABI static KnownFPClass acos(const KnownFPClass &Src);
560
561 /// Report known values for atan
562 LLVM_ABI static KnownFPClass atan(const KnownFPClass &Src);
563
564 /// Report known values for atan2
566 atan2(const KnownFPClass &LHS, const KnownFPClass &RHS,
568
569 /// Return true if the sign bit must be 0, ignoring the sign of nans.
571
572 /// Assume the sign bit is zero.
574
575 /// Assume the sign bit is one.
577
578 void copysign(const KnownFPClass &Sign) {
579 // Don't know anything about the sign of the source. Expand the possible set
580 // to its opposite sign pair.
581
582 if ((KnownFPMask & FPClassMask::kfcQNan) != FPClassMask::kfcNone)
583 KnownFPMask |= FPClassMask::kfcQNan;
584 if ((KnownFPMask & FPClassMask::kfcSNan) != FPClassMask::kfcNone)
585 KnownFPMask |= FPClassMask::kfcSNan;
586 if ((KnownFPMask & FPClassMask::kfcInf) != FPClassMask::kfcNone)
587 KnownFPMask |= FPClassMask::kfcInf;
588 if ((KnownFPMask & FPClassMask::kfcNormal) != FPClassMask::kfcNone)
589 KnownFPMask |= FPClassMask::kfcNormal;
590 if ((KnownFPMask & FPClassMask::kfcSubnormal) != FPClassMask::kfcNone)
591 KnownFPMask |= FPClassMask::kfcSubnormal;
592 if ((KnownFPMask & FPClassMask::kfcZero) != FPClassMask::kfcNone)
593 KnownFPMask |= FPClassMask::kfcZero;
594
595 if (Sign.getSignBit() && !*Sign.getSignBit())
596 KnownFPMask &= FPClassMask::kfcPosSignBit;
597 if (Sign.getSignBit() && *Sign.getSignBit())
598 KnownFPMask &= FPClassMask::kfcNegSignBit;
599 }
600
601 static KnownFPClass copysign(const KnownFPClass &KnownMag,
602 const KnownFPClass &KnownSign) {
603 KnownFPClass Known = KnownMag;
604 Known.copysign(KnownSign);
605 return Known;
606 }
607
608 // Propagate knowledge that an operation cannot introduce a signaling NaN.
610 if (Src.isKnownNever(fcSNan))
612 }
613
614 // Propagate knowledge that an operation cannot introduce a signaling NaN.
616 if (LHS.isKnownNever(fcSNan) && RHS.isKnownNever(fcSNan))
618 }
619
620 // Propagate knowledge that a non-NaN source implies the result can also not
621 // be a NaN. For unconstrained operations, signaling nans are not guaranteed
622 // to be quieted but cannot be introduced.
623 void propagateNonNaN(const KnownFPClass &Src) {
624 propagateNonSNaN(Src);
625 if (Src.isKnownNever(fcNan))
627 }
628
631 if (LHS.isKnownNeverNaN() && RHS.isKnownNeverNaN())
633 }
634
635 /// Propagate known class for fpext. \p DstMode and \p SrcMode are the
636 /// denormal modes of the destination and source types.
638 fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy,
639 const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode);
640
641 /// Propagate known class for fptrunc and fptrunc_round. \p DstMode and
642 /// \p SrcMode are the denormal modes of the destination and source types.
643 LLVM_ABI static KnownFPClass fptrunc(const KnownFPClass &KnownSrc,
644 const fltSemantics &DstTy,
645 const fltSemantics &SrcTy,
646 DenormalMode DstMode,
647 DenormalMode SrcMode);
648
649 /// Propagate known class for rounding intrinsics (rint, nearbyint, round,
650 /// roundeven). \p IsMultiUnitFPType if this is for a multi-unit
651 /// floating-point type.
653 roundToIntegral(const KnownFPClass &Src, bool IsMultiUnitFPType,
655
656 /// Propagate known class for trunc.
658 trunc(const KnownFPClass &Src,
660
661 /// Propagate known class for floor. \p IsMultiUnitFPType if this is for a
662 /// multi-unit floating-point type.
664 floor(const KnownFPClass &Src, bool IsMultiUnitFPType,
666
667 /// Propagate known class for ceil. \p IsMultiUnitFPType if this is for a
668 /// multi-unit floating-point type.
670 ceil(const KnownFPClass &Src, bool IsMultiUnitFPType,
672
673 /// Propagate known class for mantissa component of frexp
675 frexp_mant(const KnownFPClass &Src,
677
678 /// Propagate known class for ldexp, assuming the exponent is known to be
679 /// within [\p ConstantRangeMin, \p ConstantRangeMax]
680 ///
681 // TODO: This really ought to use ConstantRange, but it's in IR not Support.
683 ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin,
684 const APInt &ConstantRangeMax, const fltSemantics &Flt,
687 ldexp(const KnownFPClass &Src, const KnownBits &ExpBits,
688 const fltSemantics &Flt,
690
691 /// Propagate known class for pow
693 const KnownFPClass &RHS);
694
695 /// Propagate known class for powi
696 LLVM_ABI static KnownFPClass powi(const KnownFPClass &Src,
697 const KnownBits &N);
698
699 void resetAll() { *this = KnownFPClass(); }
700};
701
703 LHS |= RHS;
704 return LHS;
705}
706
708 RHS |= LHS;
709 return std::move(RHS);
710}
711
712} // namespace llvm
713
714#endif
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_ABI
Definition Compiler.h:211
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
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.
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
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.
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)
KnownFPClass(FPClassMask Known=FPClassMask::kfcAllFlags)
KnownFPClass(FPClassTest Known, bool Sign)
static KnownFPClass fneg(const KnownFPClass &Src)
static LLVM_ABI KnownFPClass fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode)
Propagate known class for fpext.
static LLVM_ABI KnownFPClass cos(const KnownFPClass &Src)
Report known values for cos.
static LLVM_ABI KnownFPClass fptrunc(const KnownFPClass &KnownSrc, const fltSemantics &DstTy, const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode)
Propagate known class for fptrunc and fptrunc_round.
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.
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.
void knownNot(FPClassMask RuleOut)
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 KnownFPClass copysign(const KnownFPClass &KnownMag, const KnownFPClass &KnownSign)
FPClassTest getKnownFPClasses() const
Floating-point classes the value could be one of.
KnownFPClass(FPClassTest Known)
static KnownFPClass getEmpty()
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.
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.
bool isKnownAlways(FPClassMask Mask) const
LLVM_ABI bool isKnownNeverLogicalPosZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a positive zero.
bool isKnownNever(FPClassMask Mask) const
Return true if it's known this can never be one of the mask entries.
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)
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.
This is an optimization pass for GlobalISel generic memory operations.
@ Known
Known to have no common set bits.
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()