25 Zero.setBitVal(SignBitPosition, Val.
One[SignBitPosition]);
26 One.setBitVal(SignBitPosition, Val.
Zero[SignBitPosition]);
31 bool CarryZero,
bool CarryOne) {
33 APInt PossibleSumZero =
LHS.getMaxValue() +
RHS.getMaxValue() + !CarryZero;
34 APInt PossibleSumOne =
LHS.getMinValue() +
RHS.getMinValue() + CarryOne;
37 APInt CarryKnownZero = ~(PossibleSumZero ^
LHS.Zero ^
RHS.Zero);
38 APInt CarryKnownOne = PossibleSumOne ^
LHS.One ^
RHS.One;
43 APInt CarryKnownUnion = std::move(CarryKnownZero) | CarryKnownOne;
44 APInt Known = std::move(LHSKnownUnion) & RHSKnownUnion & CarryKnownUnion;
49 KnownOut.
One = std::move(PossibleSumOne) & Known;
54 const KnownBits &LHS,
const KnownBits &RHS,
const KnownBits &Carry) {
56 return ::computeForAddCarry(
62 const KnownBits &RHS) {
63 unsigned BitWidth = LHS.getBitWidth();
67 if (LHS.isUnknown() && RHS.isUnknown())
70 if (!LHS.isUnknown() && !RHS.isUnknown()) {
77 KnownBits NotRHS = RHS;
147 const KnownBits &Borrow) {
153 return ::computeForAddCarry(LHS, RHS,
161 "Illegal sext-in-register");
166 unsigned ExtBits =
BitWidth - SrcBitWidth;
168 Result.One =
One << ExtBits;
169 Result.Zero =
Zero << ExtBits;
170 Result.One.ashrInPlace(ExtBits);
171 Result.Zero.ashrInPlace(ExtBits);
182 APInt MaskedVal(Val);
192 if (LHS.getMinValue().uge(RHS.getMaxValue()))
194 if (RHS.getMinValue().uge(LHS.getMaxValue()))
200 KnownBits L = LHS.makeGE(RHS.getMinValue());
201 KnownBits R = RHS.makeGE(LHS.getMinValue());
202 return L.intersectWith(R);
207 auto Flip = [](
const KnownBits &Val) {
return KnownBits(Val.
One, Val.
Zero); };
208 return Flip(
umax(Flip(LHS), Flip(RHS)));
212 return flipSignBit(
umax(flipSignBit(LHS), flipSignBit(RHS)));
217 auto Flip = [](
const KnownBits &Val) {
221 Zero.setBitVal(SignBitPosition, Val.
Zero[SignBitPosition]);
222 One.setBitVal(SignBitPosition, Val.
One[SignBitPosition]);
225 return Flip(
umax(Flip(LHS), Flip(RHS)));
231 if (LHS.getMinValue().uge(RHS.getMaxValue()))
234 if (RHS.getMinValue().uge(LHS.getMaxValue()))
250 if (LHS.getSignedMinValue().sge(RHS.getSignedMaxValue()))
253 if (RHS.getSignedMinValue().sge(LHS.getSignedMaxValue()))
263 unsigned SignBitPosition = LHS.getBitWidth() - 1;
264 for (
auto Arg : {&LHS, &RHS}) {
265 bool Tmp = Arg->Zero[SignBitPosition];
266 Arg->Zero.setBitVal(SignBitPosition, Arg->One[SignBitPosition]);
267 Arg->One.setBitVal(SignBitPosition, Tmp);
286 bool NSW,
bool ShAmtNonZero) {
287 unsigned BitWidth = LHS.getBitWidth();
288 auto ShiftByConst = [&](
const KnownBits &LHS,
unsigned ShiftAmt) {
290 bool ShiftedOutZero, ShiftedOutOne;
291 Known.
Zero = LHS.Zero.
ushl_ov(ShiftAmt, ShiftedOutZero);
293 Known.
One = LHS.One.
ushl_ov(ShiftAmt, ShiftedOutOne);
297 if (NUW && ShiftAmt != 0)
299 ShiftedOutZero =
true;
303 else if (ShiftedOutOne)
311 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(
BitWidth);
312 if (MinShiftAmount == 0 && ShAmtNonZero)
314 if (LHS.isUnknown()) {
316 if (NUW && NSW && MinShiftAmount != 0)
325 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros() - 1);
327 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros());
329 MaxShiftAmount = std::min(
331 std::max(LHS.countMaxLeadingZeros(), LHS.countMaxLeadingOnes()) - 1);
334 if (MinShiftAmount == 0 && MaxShiftAmount ==
BitWidth - 1 &&
340 if (LHS.isNonNegative())
342 if (LHS.isNegative())
349 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
350 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
352 for (
unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
355 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
356 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
370 bool ShAmtNonZero,
bool Exact) {
371 unsigned BitWidth = LHS.getBitWidth();
372 auto ShiftByConst = [&](
const KnownBits &LHS,
unsigned ShiftAmt) {
373 KnownBits Known = LHS;
382 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(
BitWidth);
383 if (MinShiftAmount == 0 && ShAmtNonZero)
385 if (LHS.isUnknown()) {
396 unsigned FirstOne = LHS.countMaxTrailingZeros();
397 if (FirstOne < MinShiftAmount) {
402 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
405 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
406 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
408 for (
unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
411 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
412 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
426 bool ShAmtNonZero,
bool Exact) {
427 unsigned BitWidth = LHS.getBitWidth();
428 auto ShiftByConst = [&](
const KnownBits &LHS,
unsigned ShiftAmt) {
429 KnownBits Known = LHS;
437 unsigned MinShiftAmount = RHS.getMinValue().getLimitedValue(
BitWidth);
438 if (MinShiftAmount == 0 && ShAmtNonZero)
440 if (LHS.isUnknown()) {
455 unsigned FirstOne = LHS.countMaxTrailingZeros();
456 if (FirstOne < MinShiftAmount) {
461 MaxShiftAmount = std::min(MaxShiftAmount, FirstOne);
464 unsigned ShiftAmtZeroMask = RHS.Zero.zextOrTrunc(32).getZExtValue();
465 unsigned ShiftAmtOneMask = RHS.One.zextOrTrunc(32).getZExtValue();
467 for (
unsigned ShiftAmt = MinShiftAmount; ShiftAmt <= MaxShiftAmount;
470 if ((ShiftAmtZeroMask & ShiftAmt) != 0 ||
471 (ShiftAmtOneMask | ShiftAmt) != ShiftAmt)
484std::optional<bool>
KnownBits::eq(
const KnownBits &LHS,
const KnownBits &RHS) {
485 if (LHS.isConstant() && RHS.isConstant())
486 return std::optional<bool>(LHS.getConstant() == RHS.getConstant());
487 if (LHS.One.intersects(RHS.Zero) || RHS.One.intersects(LHS.Zero))
488 return std::optional<bool>(
false);
492std::optional<bool>
KnownBits::ne(
const KnownBits &LHS,
const KnownBits &RHS) {
493 if (std::optional<bool> KnownEQ =
eq(LHS, RHS))
494 return std::optional<bool>(!*KnownEQ);
500 if (LHS.getMaxValue().ule(RHS.getMinValue()))
501 return std::optional<bool>(
false);
503 if (LHS.getMinValue().ugt(RHS.getMaxValue()))
504 return std::optional<bool>(
true);
509 if (std::optional<bool> IsUGT =
ugt(RHS, LHS))
510 return std::optional<bool>(!*IsUGT);
515 return ugt(RHS, LHS);
519 return uge(RHS, LHS);
524 if (LHS.getSignedMaxValue().sle(RHS.getSignedMinValue()))
525 return std::optional<bool>(
false);
527 if (LHS.getSignedMinValue().sgt(RHS.getSignedMaxValue()))
528 return std::optional<bool>(
true);
533 if (std::optional<bool> KnownSGT =
sgt(RHS, LHS))
534 return std::optional<bool>(!*KnownSGT);
539 return sgt(RHS, LHS);
543 return sge(RHS, LHS);
556 KnownBits Tmp = *
this;
565 false, IntMinIsPoison,
false,
595 if (IntMinIsPoison || (!
One.isZero() && !
One.isMinSignedValue())) {
611 std::optional<bool> Overflow;
616 bool MayNegClamp =
true;
617 bool MayPosClamp =
true;
620 if (
Add && ((
LHS.isNegative() &&
RHS.isNonNegative()) ||
621 (
LHS.isNonNegative() &&
RHS.isNegative())))
623 else if (!
Add && (((
LHS.isNegative() &&
RHS.isNegative()) ||
624 (
LHS.isNonNegative() &&
RHS.isNonNegative()))))
641 false, UnsignedLHS, UnsignedRHS);
647 if (
LHS.isNonNegative() &&
RHS.isNonNegative())
653 if (
LHS.isNegative() &&
RHS.isNegative())
657 if (
LHS.isNegative() ||
RHS.isNegative())
659 if (
LHS.isNonNegative() ||
RHS.isNonNegative())
666 if (
LHS.isNegative() &&
RHS.isNonNegative())
672 if (
LHS.isNonNegative() &&
RHS.isNegative())
676 if (
LHS.isNegative() ||
RHS.isNonNegative())
678 if (
LHS.isNonNegative() ||
RHS.isNegative())
683 if (!MayNegClamp && !MayPosClamp)
688 (void)
LHS.getMaxValue().uadd_ov(
RHS.getMaxValue(), Of);
692 (void)
LHS.getMinValue().uadd_ov(
RHS.getMinValue(), Of);
699 (void)
LHS.getMinValue().usub_ov(
RHS.getMaxValue(), Of);
703 (void)
LHS.getMaxValue().usub_ov(
RHS.getMinValue(), Of);
724 "We somehow know overflow without knowing input sign");
785 return flipSignBit(
avgFloorU(flipSignBit(LHS), flipSignBit(RHS)));
793 return flipSignBit(
avgCeilU(flipSignBit(LHS), flipSignBit(RHS)));
801 bool NoUndefSelfMultiply) {
802 unsigned BitWidth = LHS.getBitWidth();
804 assert((!NoUndefSelfMultiply || LHS == RHS) &&
805 "Self multiplication knownbits mismatch");
818 APInt UMaxResult = UMaxLHS.
umul_ov(UMaxRHS, HasOverflow);
819 unsigned LeadZ = HasOverflow ? 0 : UMaxResult.
countl_zero();
863 const APInt &Bottom0 = LHS.One;
864 const APInt &Bottom1 = RHS.One;
868 unsigned TrailBitsKnown0 = (LHS.Zero | LHS.One).
countr_one();
869 unsigned TrailBitsKnown1 = (RHS.Zero | RHS.One).
countr_one();
870 unsigned TrailZero0 = LHS.countMinTrailingZeros();
871 unsigned TrailZero1 = RHS.countMinTrailingZeros();
872 unsigned TrailZ = TrailZero0 + TrailZero1;
875 unsigned SmallestOperand =
876 std::min(TrailBitsKnown0 - TrailZero0, TrailBitsKnown1 - TrailZero1);
877 unsigned ResultBitsKnown = std::min(SmallestOperand + TrailZ,
BitWidth);
884 Res.
Zero |= (~BottomKnown).getLoBits(ResultBitsKnown);
887 if (NoUndefSelfMultiply) {
889 unsigned TwoTZP1 = 2 * TrailZero0 + 1;
895 if (TrailZero0 <
BitWidth && LHS.One[TrailZero0]) {
896 unsigned TwoTZP2 = TwoTZP1 + 1;
906 unsigned BitWidth = LHS.getBitWidth();
908 KnownBits WideLHS = LHS.sext(2 *
BitWidth);
909 KnownBits WideRHS = RHS.sext(2 *
BitWidth);
914 unsigned BitWidth = LHS.getBitWidth();
916 KnownBits WideLHS = LHS.zext(2 *
BitWidth);
917 KnownBits WideRHS = RHS.zext(2 *
BitWidth);
934 (int)
LHS.countMinTrailingZeros() - (int)
RHS.countMaxTrailingZeros();
936 (int)
LHS.countMaxTrailingZeros() - (int)
RHS.countMinTrailingZeros();
940 if (MinTZ == MaxTZ) {
944 }
else if (MaxTZ < 0) {
960 if (LHS.isNonNegative() && RHS.isNonNegative())
961 return udiv(LHS, RHS, Exact);
963 unsigned BitWidth = LHS.getBitWidth();
966 if (LHS.isZero() || RHS.isZero()) {
973 std::optional<APInt> Res;
974 if (LHS.isNegative() && RHS.isNegative()) {
983 }
else if (LHS.isNegative() && RHS.isNonNegative()) {
985 if (Exact || (-LHS.getSignedMaxValue()).uge(RHS.getSignedMaxValue())) {
990 }
else if (LHS.isStrictlyPositive() && RHS.isNegative()) {
992 if (Exact || LHS.getSignedMinValue().uge(-RHS.getSignedMinValue())) {
995 Res = Num.
sdiv(Denom);
1000 if (Res->isNonNegative()) {
1001 unsigned LeadZ = Res->countLeadingZeros();
1004 unsigned LeadO = Res->countLeadingOnes();
1015 unsigned BitWidth = LHS.getBitWidth();
1018 if (LHS.isZero() || RHS.isZero()) {
1041 unsigned BitWidth = LHS.getBitWidth();
1042 if (!RHS.isZero() && RHS.Zero[0]) {
1044 unsigned RHSZeros = RHS.countMinTrailingZeros();
1046 APInt OnesMask = LHS.One & Mask;
1047 APInt ZerosMask = LHS.Zero & Mask;
1054 KnownBits Known = remGetLowBits(LHS, RHS);
1055 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1057 APInt HighBits = ~(RHS.getConstant() - 1);
1058 Known.
Zero |= HighBits;
1065 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingZeros());
1071 KnownBits Known = remGetLowBits(LHS, RHS);
1072 if (RHS.isConstant() && RHS.getConstant().isPowerOf2()) {
1074 APInt LowBits = RHS.getConstant() - 1;
1077 if (LHS.isNonNegative() || LowBits.
isSubsetOf(LHS.Zero))
1078 Known.
Zero |= ~LowBits;
1082 if (LHS.isNegative() && LowBits.
intersects(LHS.One))
1083 Known.
One |= ~LowBits;
1090 if (LHS.isNegative() && Known.
isNonZero())
1092 std::max(LHS.countMinLeadingOnes(), RHS.countMinSignBits()));
1093 else if (LHS.isNonNegative())
1095 std::max(LHS.countMinLeadingZeros(), RHS.countMinSignBits()));
1120 Zero = std::move(Z);
1160#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static KnownBits avgComputeU(KnownBits LHS, KnownBits RHS, bool IsCeil)
static KnownBits computeForSatAddSub(bool Add, bool Signed, const KnownBits &LHS, const KnownBits &RHS)
static KnownBits divComputeLowBit(KnownBits Known, const KnownBits &LHS, const KnownBits &RHS, bool Exact)
static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, bool CarryZero, bool CarryOne)
static unsigned getMaxShiftAmount(const APInt &MaxValue, unsigned BitWidth)
Class for arbitrary precision integers.
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
LLVM_ABI APInt usub_sat(const APInt &RHS) const
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
LLVM_ABI APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
bool isMinSignedValue() const
Determine if this is the smallest signed value.
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
LLVM_ABI uint64_t extractBitsAsZExtValue(unsigned numBits, unsigned bitPosition) const
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
void setSignBit()
Set the sign bit to 1.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
bool isNegative() const
Determine sign of this APInt.
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
void clearAllBits()
Set every bit to 0.
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
unsigned countl_zero() const
The APInt version of std::countl_zero.
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
LLVM_ABI APInt ushl_ov(const APInt &Amt, bool &Overflow) const
unsigned countLeadingZeros() const
unsigned countl_one() const
Count the number of leading one bits.
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
bool getBoolValue() const
Convert APInt to a boolean value.
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
void clearSignBit()
Set the sign bit to 0.
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
This class implements an extremely fast bulk output stream that can only output to a stream.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
int countl_one(T Value)
Count the number of ones from the most significant bit to the first zero bit.
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
static LLVM_ABI KnownBits sadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.sadd.sat(LHS, RHS)
static LLVM_ABI std::optional< bool > eq(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_EQ result.
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
LLVM_ABI KnownBits blsi() const
Compute known bits for X & -X, which has only the lowest bit set of X set.
void makeNonNegative()
Make this value non-negative.
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits ssub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.ssub.sat(LHS, RHS)
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
bool isUnknown() const
Returns true if we don't know any bits.
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
LLVM_ABI KnownBits makeGE(const APInt &Val) const
Return KnownBits based on this, but updated given that the underlying value is known to be greater th...
LLVM_ABI KnownBits blsmsk() const
Compute known bits for X ^ (X - 1), which has all bits up to and including the lowest set bit of X se...
void makeNegative()
Make this value negative.
void setAllConflict()
Make all bits known to be both zero and one.
bool hasConflict() const
Returns true if there is conflicting information.
static LLVM_ABI std::optional< bool > sge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGE result.
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
void setAllZero()
Make all bits known to be zero and discard any previous information.
LLVM_ABI KnownBits & operator|=(const KnownBits &RHS)
Update known bits based on ORing with RHS.
LLVM_ABI void print(raw_ostream &OS) const
unsigned getBitWidth() const
Get the bit width of this value.
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
LLVM_DUMP_METHOD void dump() const
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
LLVM_ABI KnownBits & operator&=(const KnownBits &RHS)
Update known bits based on ANDing with RHS.
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI std::optional< bool > ugt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGT result.
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
static LLVM_ABI std::optional< bool > slt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLT result.
static LLVM_ABI KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI std::optional< bool > ult(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULT result.
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static LLVM_ABI std::optional< bool > ule(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULE result.
bool isNegative() const
Returns true if this value is known to be negative.
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits uadd_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.uadd.sat(LHS, RHS)
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI std::optional< bool > sle(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLE result.
static LLVM_ABI std::optional< bool > sgt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGT result.
unsigned countMinPopulation() const
Returns the number of bits known to be one.
static LLVM_ABI std::optional< bool > uge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGE result.
LLVM_ABI KnownBits & operator^=(const KnownBits &RHS)
Update known bits based on XORing with RHS.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.