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. Valid for all rounding modes, since frem is
481 /// always exact.
484
485 /// Report known values for frem x, x. Valid for all rounding modes.
488
489 /// Report known values for fma
491 const KnownFPClass &RHS,
492 const KnownFPClass &Addend,
494
495 /// Report known values for fmuladd
497 const KnownFPClass &RHS,
498 const KnownFPClass &Addend,
500
501 /// Report known values for fma squared, squared, addend
502 LLVM_ABI static KnownFPClass fma_square(const KnownFPClass &Squared,
503 const KnownFPClass &Addend,
505
506 /// Report known values for fmuladd squared, squared, addend
507 LLVM_ABI static KnownFPClass fmuladd_square(const KnownFPClass &Squared,
508 const KnownFPClass &Addend,
510
511 /// Propagate known class for sqrt
514
515 /// Propagate known class for log/log2/log10
516 ///
517 /// \p IsMultiUnitFPType if this is for a multi-unit floating-point type.
519 bool IsMultiUnitFPType);
520
521 /// Report known values for exp, exp2 and exp10.
522 /// This function assumes that exp10(-1.0) = +0.1 and exp10(+1.0) = +10.0 are
523 /// both finite normal values, which holds for formats with a corresponding
524 /// LLVM IR type (e.g. does not hold for Float4E2M1FN).
525 LLVM_ABI static KnownFPClass exp(const KnownFPClass &Src);
526
527 /// Report known values for sin
528 LLVM_ABI static KnownFPClass sin(const KnownFPClass &Src);
529
530 /// Report known values for cos
531 LLVM_ABI static KnownFPClass cos(const KnownFPClass &Src);
532
533 /// Report known values for tan
534 LLVM_ABI static KnownFPClass tan(const KnownFPClass &Src);
535
536 /// Report known values for sinh
537 LLVM_ABI static KnownFPClass sinh(const KnownFPClass &Src);
538
539 /// Report known values for cosh
540 LLVM_ABI static KnownFPClass cosh(const KnownFPClass &Src);
541
542 /// Report known values for tanh
543 LLVM_ABI static KnownFPClass tanh(const KnownFPClass &Src);
544
545 /// Report known values for asin
546 LLVM_ABI static KnownFPClass asin(const KnownFPClass &Src);
547
548 /// Report known values for acos
549 LLVM_ABI static KnownFPClass acos(const KnownFPClass &Src);
550
551 /// Report known values for atan
552 LLVM_ABI static KnownFPClass atan(const KnownFPClass &Src);
553
554 /// Report known values for atan2
557
558 /// Return true if the sign bit must be 0, ignoring the sign of nans.
560
561 /// Assume the sign bit is zero.
563
564 /// Assume the sign bit is one.
566
568 // Don't know anything about the sign of the source. Expand the possible set
569 // to its opposite sign pair.
570
571 if ((KnownFPMask & FPClassMask::kfcQNan) != FPClassMask::kfcNone)
572 KnownFPMask |= FPClassMask::kfcQNan;
573 if ((KnownFPMask & FPClassMask::kfcSNan) != FPClassMask::kfcNone)
574 KnownFPMask |= FPClassMask::kfcSNan;
575 if ((KnownFPMask & FPClassMask::kfcInf) != FPClassMask::kfcNone)
576 KnownFPMask |= FPClassMask::kfcInf;
577 if ((KnownFPMask & FPClassMask::kfcNormal) != FPClassMask::kfcNone)
578 KnownFPMask |= FPClassMask::kfcNormal;
579 if ((KnownFPMask & FPClassMask::kfcSubnormal) != FPClassMask::kfcNone)
580 KnownFPMask |= FPClassMask::kfcSubnormal;
581 if ((KnownFPMask & FPClassMask::kfcZero) != FPClassMask::kfcNone)
582 KnownFPMask |= FPClassMask::kfcZero;
583
584 if (Sign.getSignBit() && !*Sign.getSignBit())
585 KnownFPMask &= FPClassMask::kfcPosSignBit;
586 if (Sign.getSignBit() && *Sign.getSignBit())
587 KnownFPMask &= FPClassMask::kfcNegSignBit;
588 }
589
590 static KnownFPClass copysign(const KnownFPClass &KnownMag,
591 const KnownFPClass &KnownSign) {
592 KnownFPClass Known = KnownMag;
593 Known.copysign(KnownSign);
594 return Known;
595 }
596
597 // Propagate knowledge that an operation cannot introduce a signaling NaN.
599 if (Src.isKnownNever(fcSNan))
601 }
602
603 // Propagate knowledge that an operation cannot introduce a signaling NaN.
605 if (LHS.isKnownNever(fcSNan) && RHS.isKnownNever(fcSNan))
607 }
608
609 // Propagate knowledge that a non-NaN source implies the result can also not
610 // be a NaN. For unconstrained operations, signaling nans are not guaranteed
611 // to be quieted but cannot be introduced.
612 void propagateNonNaN(const KnownFPClass &Src) {
613 propagateNonSNaN(Src);
614 if (Src.isKnownNever(fcNan))
616 }
617
620 if (LHS.isKnownNeverNaN() && RHS.isKnownNeverNaN())
622 }
623
624 /// Propagate known class for fpext. \p DstMode and \p SrcMode are the
625 /// denormal modes of the destination and source types.
627 fpext(const KnownFPClass &KnownSrc, const fltSemantics &DstTy,
628 const fltSemantics &SrcTy, DenormalMode DstMode, DenormalMode SrcMode);
629
630 /// Propagate known class for fptrunc and fptrunc_round. \p DstMode and
631 /// \p SrcMode are the denormal modes of the destination and source types.
632 LLVM_ABI static KnownFPClass fptrunc(const KnownFPClass &KnownSrc,
633 const fltSemantics &DstTy,
634 const fltSemantics &SrcTy,
635 DenormalMode DstMode,
636 DenormalMode SrcMode);
637
638 /// Propagate known class for rounding intrinsics (rint, nearbyint, round,
639 /// roundeven). \p IsMultiUnitFPType if this is for a multi-unit
640 /// floating-point type.
642 bool IsMultiUnitFPType,
644
645 /// Propagate known class for trunc.
646 LLVM_ABI static KnownFPClass trunc(const KnownFPClass &Src,
648
649 /// Propagate known class for floor. \p IsMultiUnitFPType if this is for a
650 /// multi-unit floating-point type.
651 LLVM_ABI static KnownFPClass floor(const KnownFPClass &Src,
652 bool IsMultiUnitFPType, DenormalMode Mode);
653
654 /// Propagate known class for ceil. \p IsMultiUnitFPType if this is for a
655 /// multi-unit floating-point type.
656 LLVM_ABI static KnownFPClass ceil(const KnownFPClass &Src,
657 bool IsMultiUnitFPType, DenormalMode Mode);
658
659 /// Propagate known class for mantissa component of frexp
662
663 /// Propagate known class for ldexp, assuming the exponent is known to be
664 /// within [\p ConstantRangeMin, \p ConstantRangeMax]
665 ///
666 // TODO: This really ought to use ConstantRange, but it's in IR not Support.
667 LLVM_ABI static KnownFPClass ldexp(const KnownFPClass &Src,
668 const APInt &ConstantRangeMin,
669 const APInt &ConstantRangeMax,
670 const fltSemantics &Flt,
672 LLVM_ABI static KnownFPClass ldexp(const KnownFPClass &Src,
673 const KnownBits &ExpBits,
674 const fltSemantics &Flt,
676
677 /// Propagate known class for pow
679 const KnownFPClass &RHS);
680
681 /// Propagate known class for powi
682 LLVM_ABI static KnownFPClass powi(const KnownFPClass &Src,
683 const KnownBits &N);
684
685 void resetAll() { *this = KnownFPClass(); }
686};
687
689 LHS |= RHS;
690 return LHS;
691}
692
694 RHS |= LHS;
695 return std::move(RHS);
696}
697
698} // namespace llvm
699
700#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. Valid for all rounding modes.
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()