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
429 const KnownFPClass &RHS,
431
432 /// Apply the canonicalize intrinsic to this value.
435
436 /// Report known values for a bitcast into a float with provided semantics.
437 LLVM_ABI static KnownFPClass bitcast(const fltSemantics &FltSemantics,
438 const KnownBits &Bits);
439
440 /// Report known bits for a float with provided semantics.
441 LLVM_ABI KnownBits toKnownBits(const fltSemantics &FltSemantics) const;
442
443 /// Report known values for fadd
446
447 /// Report known values for fadd x, x
450
451 /// Report known values for fsub
454
455 /// Report known values for fmul
458
459 // Special case of fmul x, x.
461 KnownFPClass Known = fmul(Src, Src, Mode);
462
463 // X * X is always non-negative or a NaN.
464 Known.knownNot(fcNegative);
465 Known.propagateNonNaN(Src);
466 return Known;
467 }
468
469 LLVM_ABI static KnownFPClass fmul(const KnownFPClass &LHS, const APFloat &RHS,
471
472 /// Report known values for fdiv
475
476 /// Report known values for fdiv x, x
479
480 /// Report known values for frem
483
484 /// Report known values for frem x, x
487
488 /// Report known values for fma
490 const KnownFPClass &RHS,
491 const KnownFPClass &Addend,
493
494 /// Report known values for fmuladd
496 const KnownFPClass &RHS,
497 const KnownFPClass &Addend,
499
500 /// Report known values for fma squared, squared, addend
501 LLVM_ABI static KnownFPClass fma_square(const KnownFPClass &Squared,
502 const KnownFPClass &Addend,
504
505 /// Report known values for fmuladd squared, squared, addend
506 LLVM_ABI static KnownFPClass fmuladd_square(const KnownFPClass &Squared,
507 const KnownFPClass &Addend,
509
510 /// Propagate known class for sqrt
513
514 /// Propagate known class for log/log2/log10
515 ///
516 /// \p IsMultiUnitFPType if this is for a multi-unit floating-point type.
518 bool IsMultiUnitFPType);
519
520 /// Report known values for exp, exp2 and exp10.
521 /// This function assumes that exp10(-1.0) = +0.1 and exp10(+1.0) = +10.0 are
522 /// both finite normal values, which holds for formats with a corresponding
523 /// LLVM IR type (e.g. does not hold for Float4E2M1FN).
524 LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
525
526 /// Report known values for sin
527 LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
528
529 /// Report known values for cos
530 LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
531
532 /// Report known values for tan
533 LLVM_ABI static KnownFPClass tan(const KnownFPClass &Src);
534
535 /// Report known values for sinh
536 LLVM_ABI static KnownFPClass sinh(const KnownFPClass &Src);
537
538 /// Report known values for cosh
539 LLVM_ABI static KnownFPClass cosh(const KnownFPClass &Src);
540
541 /// Report known values for tanh
542 LLVM_ABI static KnownFPClass tanh(const KnownFPClass &Src);
543
544 /// Report known values for asin
545 LLVM_ABI static KnownFPClass asin(const KnownFPClass &Src);
546
547 /// Report known values for acos
548 LLVM_ABI static KnownFPClass acos(const KnownFPClass &Src);
549
550 /// Report known values for atan
551 LLVM_ABI static KnownFPClass atan(const KnownFPClass &Src);
552
553 /// Report known values for atan2
556
557 /// Return true if the sign bit must be 0, ignoring the sign of nans.
559
560 /// Assume the sign bit is zero.
562
563 /// Assume the sign bit is one.
565
567 // Don't know anything about the sign of the source. Expand the possible set
568 // to its opposite sign pair.
569
570 if ((KnownFPMask & FPClassMask::kfcQNan) != FPClassMask::kfcNone)
571 KnownFPMask |= FPClassMask::kfcQNan;
572 if ((KnownFPMask & FPClassMask::kfcSNan) != FPClassMask::kfcNone)
573 KnownFPMask |= FPClassMask::kfcSNan;
574 if ((KnownFPMask & FPClassMask::kfcInf) != FPClassMask::kfcNone)
575 KnownFPMask |= FPClassMask::kfcInf;
576 if ((KnownFPMask & FPClassMask::kfcNormal) != FPClassMask::kfcNone)
577 KnownFPMask |= FPClassMask::kfcNormal;
578 if ((KnownFPMask & FPClassMask::kfcSubnormal) != FPClassMask::kfcNone)
579 KnownFPMask |= FPClassMask::kfcSubnormal;
580 if ((KnownFPMask & FPClassMask::kfcZero) != FPClassMask::kfcNone)
581 KnownFPMask |= FPClassMask::kfcZero;
582
583 if (Sign.getSignBit() && !*Sign.getSignBit())
584 KnownFPMask &= FPClassMask::kfcPosSignBit;
585 if (Sign.getSignBit() && *Sign.getSignBit())
586 KnownFPMask &= FPClassMask::kfcNegSignBit;
587 }
588
589 static KnownFPClass copysign(const KnownFPClass &KnownMag,
590 const KnownFPClass &KnownSign) {
591 KnownFPClass Known = KnownMag;
592 Known.copysign(KnownSign);
593 return Known;
594 }
595
596 // Propagate knowledge that an operation cannot introduce a signaling NaN.
598 if (Src.isKnownNever(fcSNan))
600 }
601
602 // Propagate knowledge that an operation cannot introduce a signaling NaN.
604 if (LHS.isKnownNever(fcSNan) && RHS.isKnownNever(fcSNan))
606 }
607
608 // Propagate knowledge that a non-NaN source implies the result can also not
609 // be a NaN. For unconstrained operations, signaling nans are not guaranteed
610 // to be quieted but cannot be introduced.
611 void propagateNonNaN(const KnownFPClass &Src) {
612 propagateNonSNaN(Src);
613 if (Src.isKnownNever(fcNan))
615 }
616
619 if (LHS.isKnownNeverNaN() && RHS.isKnownNeverNaN())
621 }
622
623 /// Propagate known class for fpext. \p DstMode and \p SrcMode are the
624 /// denormal modes of the destination and source types.
626 fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy,
627 const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode);
628
629 /// Propagate known class for fptrunc and fptrunc_round. \p DstMode and
630 /// \p SrcMode are the denormal modes of the destination and source types.
631 LLVM_ABI static KnownFPClass fptrunc(const KnownFPClass &KnownSrc,
632 const fltSemantics &DstTy,
633 const fltSemantics &SrcTy,
634 DenormalMode DstMode,
635 DenormalMode SrcMode);
636
637 /// Propagate known class for rounding intrinsics (rint, nearbyint, round,
638 /// roundeven). \p IsMultiUnitFPType if this is for a multi-unit
639 /// floating-point type.
641 bool IsMultiUnitFPType,
643
644 /// Propagate known class for trunc.
645 LLVM_ABI static KnownFPClass trunc(const KnownFPClass &Src,
647
648 /// Propagate known class for floor. \p IsMultiUnitFPType if this is for a
649 /// multi-unit floating-point type.
650 LLVM_ABI static KnownFPClass floor(const KnownFPClass &Src,
651 bool IsMultiUnitFPType, DenormalMode Mode);
652
653 /// Propagate known class for ceil. \p IsMultiUnitFPType if this is for a
654 /// multi-unit floating-point type.
655 LLVM_ABI static KnownFPClass ceil(const KnownFPClass &Src,
656 bool IsMultiUnitFPType, DenormalMode Mode);
657
658 /// Propagate known class for mantissa component of frexp
661
662 /// Propagate known class for ldexp, assuming the exponent is known to be
663 /// within [\p ConstantRangeMin, \p ConstantRangeMax]
664 ///
665 // TODO: This really ought to use ConstantRange, but it's in IR not Support.
666 LLVM_ABI static KnownFPClass ldexp(const KnownFPClass &Src,
667 const APInt &ConstantRangeMin,
668 const APInt &ConstantRangeMax,
669 const fltSemantics &Flt,
671 LLVM_ABI static KnownFPClass ldexp(const KnownFPClass &Src,
672 const KnownBits &ExpBits,
673 const fltSemantics &Flt,
675
676 /// Propagate known class for pow
678 const KnownFPClass &RHS);
679
680 /// Propagate known class for powi
681 LLVM_ABI static KnownFPClass powi(const KnownFPClass &Src,
682 const KnownBits &N);
683
684 void resetAll() { *this = KnownFPClass(); }
685};
686
688 LHS |= RHS;
689 return LHS;
690}
691
693 RHS |= LHS;
694 return std::move(RHS);
695}
696
697} // namespace llvm
698
699#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 atan2(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode)
Report known values for atan2.
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 fma(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode)
Report known values for fma.
static LLVM_ABI KnownFPClass sin(const KnownFPClass &Src)
Report known values for sin.
static constexpr FPClassTest OrderedGreaterThanZeroMask
static constexpr FPClassTest OrderedLessThanZeroMask
static LLVM_ABI KnownFPClass trunc(const KnownFPClass &Src, DenormalMode Mode)
Propagate known class for trunc.
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...
void copysign(const KnownFPClass &Sign)
static LLVM_ABI KnownFPClass fadd_self(const KnownFPClass &Src, DenormalMode Mode)
Report known values for fadd x, x.
bool isKnownNeverSubnormal() const
Return true if it's known this can never be a subnormal.
static LLVM_ABI KnownFPClass fma_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode)
Report known values for fma squared, squared, addend.
bool isKnownAlways(FPClassTest Mask) const
void propagateNonNaN(const KnownFPClass &LHS, const KnownFPClass &RHS)
KnownFPClass unionWith(const KnownFPClass &RHS) const
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 frem(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode)
Report known values for frem.
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 ldexp(const KnownFPClass &Src, const APInt &ConstantRangeMin, const APInt &ConstantRangeMax, const fltSemantics &Flt, DenormalMode Mode)
Propagate known class for ldexp, assuming the exponent is known to be within [ConstantRangeMin,...
static LLVM_ABI KnownFPClass frexp_mant(const KnownFPClass &Src, DenormalMode Mode)
Propagate known class for mantissa component of frexp.
static LLVM_ABI KnownFPClass roundToIntegral(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode)
Propagate known class for rounding intrinsics (rint, nearbyint, round, roundeven).
KnownFPClass & operator|=(const KnownFPClass &RHS)
static LLVM_ABI KnownFPClass fmuladd(const KnownFPClass &LHS, const KnownFPClass &RHS, const KnownFPClass &Addend, DenormalMode Mode)
Report known values for fmuladd.
static LLVM_ABI KnownFPClass ceil(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode)
Propagate known class for ceil.
static LLVM_ABI KnownFPClass fmuladd_square(const KnownFPClass &Squared, const KnownFPClass &Addend, DenormalMode Mode)
Report known values for fmuladd squared, squared, addend.
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.
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 asin(const KnownFPClass &Src)
Report known values for asin.
bool isKnownNeverNaN() const
Return true if it's known this can never be a nan.
static LLVM_ABI KnownFPClass minMaxLike(const KnownFPClass &LHS, const KnownFPClass &RHS, MinMaxKind Kind, DenormalMode Mode)
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 LLVM_ABI KnownFPClass floor(const KnownFPClass &Src, bool IsMultiUnitFPType, DenormalMode Mode)
Propagate known class for floor.
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 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.
static LLVM_ABI KnownFPClass fdiv_self(const KnownFPClass &Src, DenormalMode Mode)
Report known values for fdiv x, x.
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 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 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)
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)
static LLVM_ABI KnownFPClass fdiv(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode)
Report known values for fdiv.
static LLVM_ABI KnownFPClass canonicalize(const KnownFPClass &Src, DenormalMode Mode)
Apply the canonicalize intrinsic to this value.
static LLVM_ABI KnownFPClass fmul(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode)
Report known values for fmul.
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 fsub(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode)
Report known values for fsub.
void setSignBit(std::optional< bool > Sign)
static LLVM_ABI KnownFPClass sinh(const KnownFPClass &Src)
Report known values for sinh.
static LLVM_ABI KnownFPClass fadd(const KnownFPClass &LHS, const KnownFPClass &RHS, DenormalMode Mode)
Report known values for fadd.
bool isKnownNeverPosSubnormal() const
Return true if it's known this can never be a positive subnormal.
static KnownFPClass square(const KnownFPClass &Src, DenormalMode Mode)
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()