Lines Matching refs:LHS

21 static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS,  in computeForAddCarry()  argument
24 APInt PossibleSumZero = LHS.getMaxValue() + RHS.getMaxValue() + !CarryZero; in computeForAddCarry()
25 APInt PossibleSumOne = LHS.getMinValue() + RHS.getMinValue() + CarryOne; in computeForAddCarry()
28 APInt CarryKnownZero = ~(PossibleSumZero ^ LHS.Zero ^ RHS.Zero); in computeForAddCarry()
29 APInt CarryKnownOne = PossibleSumOne ^ LHS.One ^ RHS.One; in computeForAddCarry()
32 APInt LHSKnownUnion = LHS.Zero | LHS.One; in computeForAddCarry()
45 const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry) { in computeForAddCarry() argument
48 LHS, RHS, Carry.Zero.getBoolValue(), Carry.One.getBoolValue()); in computeForAddCarry()
52 const KnownBits &LHS, in computeForAddSub() argument
54 unsigned BitWidth = LHS.getBitWidth(); in computeForAddSub()
58 if (LHS.isUnknown() && RHS.isUnknown()) in computeForAddSub()
61 if (!LHS.isUnknown() && !RHS.isUnknown()) { in computeForAddSub()
64 KnownOut = ::computeForAddCarry(LHS, RHS, /*CarryZero=*/true, in computeForAddSub()
70 KnownOut = ::computeForAddCarry(LHS, NotRHS, /*CarryZero=*/false, in computeForAddSub()
79 APInt MinVal = LHS.getMinValue().uadd_sat(RHS.getMinValue()); in computeForAddSub()
91 APInt MaxVal = LHS.getMaxValue().usub_sat(RHS.getMinValue()); in computeForAddSub()
109 MinVal = LHS.getSignedMinValue().sadd_sat(RHS.getSignedMinValue()); in computeForAddSub()
110 MaxVal = LHS.getSignedMaxValue().sadd_sat(RHS.getSignedMaxValue()); in computeForAddSub()
113 MinVal = LHS.getSignedMinValue().ssub_sat(RHS.getSignedMaxValue()); in computeForAddSub()
114 MaxVal = LHS.getSignedMaxValue().ssub_sat(RHS.getSignedMinValue()); in computeForAddSub()
137 KnownBits KnownBits::computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, in computeForSubBorrow() argument
144 return ::computeForAddCarry(LHS, RHS, in computeForSubBorrow()
178 KnownBits KnownBits::umax(const KnownBits &LHS, const KnownBits &RHS) { in umax() argument
183 if (LHS.getMinValue().uge(RHS.getMaxValue())) in umax()
184 return LHS; in umax()
185 if (RHS.getMinValue().uge(LHS.getMaxValue())) in umax()
191 KnownBits L = LHS.makeGE(RHS.getMinValue()); in umax()
192 KnownBits R = RHS.makeGE(LHS.getMinValue()); in umax()
196 KnownBits KnownBits::umin(const KnownBits &LHS, const KnownBits &RHS) { in umin() argument
199 return Flip(umax(Flip(LHS), Flip(RHS))); in umin()
202 KnownBits KnownBits::smax(const KnownBits &LHS, const KnownBits &RHS) { in smax() argument
212 return Flip(umax(Flip(LHS), Flip(RHS))); in smax()
215 KnownBits KnownBits::smin(const KnownBits &LHS, const KnownBits &RHS) { in smin() argument
225 return Flip(umax(Flip(LHS), Flip(RHS))); in smin()
228 KnownBits KnownBits::abdu(const KnownBits &LHS, const KnownBits &RHS) { in abdu() argument
231 if (LHS.getMinValue().uge(RHS.getMaxValue())) in abdu()
232 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS, in abdu()
234 if (RHS.getMinValue().uge(LHS.getMaxValue())) in abdu()
236 LHS); in abdu()
241 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS); in abdu()
243 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS); in abdu()
247 KnownBits KnownBits::abds(KnownBits LHS, KnownBits RHS) { in abds() argument
250 if (LHS.getSignedMinValue().sge(RHS.getSignedMaxValue())) in abds()
251 return computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/false, LHS, in abds()
253 if (RHS.getSignedMinValue().sge(LHS.getSignedMaxValue())) in abds()
255 LHS); in abds()
263 unsigned SignBitPosition = LHS.getBitWidth() - 1; in abds()
264 for (auto Arg : {&LHS, &RHS}) { in abds()
272 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, LHS, RHS); in abds()
274 computeForAddSub(/*Add=*/false, /*NSW=*/false, /*NUW=*/true, RHS, LHS); in abds()
285 KnownBits KnownBits::shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW, in shl() argument
287 unsigned BitWidth = LHS.getBitWidth(); in shl()
288 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) { in shl() argument
291 Known.Zero = LHS.Zero.ushl_ov(ShiftAmt, ShiftedOutZero); in shl()
293 Known.One = LHS.One.ushl_ov(ShiftAmt, ShiftedOutOne); in shl()
314 if (LHS.isUnknown()) { in shl()
325 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros() - 1); in shl()
327 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros()); in shl()
331 std::max(LHS.countMaxLeadingZeros(), LHS.countMaxLeadingOnes()) - 1); in shl()
336 Known.Zero.setLowBits(LHS.countMinTrailingZeros()); in shl()
337 if (LHS.isAllOnes()) in shl()
340 if (LHS.isNonNegative()) in shl()
342 if (LHS.isNegative()) in shl()
359 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt)); in shl()
370 KnownBits KnownBits::lshr(const KnownBits &LHS, const KnownBits &RHS, in lshr() argument
372 unsigned BitWidth = LHS.getBitWidth(); in lshr()
373 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) { in lshr() argument
374 KnownBits Known = LHS; in lshr()
387 if (LHS.isUnknown()) { in lshr()
398 unsigned FirstOne = LHS.countMaxTrailingZeros(); in lshr()
417 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt)); in lshr()
428 KnownBits KnownBits::ashr(const KnownBits &LHS, const KnownBits &RHS, in ashr() argument
430 unsigned BitWidth = LHS.getBitWidth(); in ashr()
431 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) { in ashr() argument
432 KnownBits Known = LHS; in ashr()
443 if (LHS.isUnknown()) { in ashr()
458 unsigned FirstOne = LHS.countMaxTrailingZeros(); in ashr()
477 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt)); in ashr()
488 std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) { in eq() argument
489 if (LHS.isConstant() && RHS.isConstant()) in eq()
490 return std::optional<bool>(LHS.getConstant() == RHS.getConstant()); in eq()
491 if (LHS.One.intersects(RHS.Zero) || RHS.One.intersects(LHS.Zero)) in eq()
496 std::optional<bool> KnownBits::ne(const KnownBits &LHS, const KnownBits &RHS) { in ne() argument
497 if (std::optional<bool> KnownEQ = eq(LHS, RHS)) in ne()
502 std::optional<bool> KnownBits::ugt(const KnownBits &LHS, const KnownBits &RHS) { in ugt() argument
504 if (LHS.getMaxValue().ule(RHS.getMinValue())) in ugt()
507 if (LHS.getMinValue().ugt(RHS.getMaxValue())) in ugt()
512 std::optional<bool> KnownBits::uge(const KnownBits &LHS, const KnownBits &RHS) { in uge() argument
513 if (std::optional<bool> IsUGT = ugt(RHS, LHS)) in uge()
518 std::optional<bool> KnownBits::ult(const KnownBits &LHS, const KnownBits &RHS) { in ult() argument
519 return ugt(RHS, LHS); in ult()
522 std::optional<bool> KnownBits::ule(const KnownBits &LHS, const KnownBits &RHS) { in ule() argument
523 return uge(RHS, LHS); in ule()
526 std::optional<bool> KnownBits::sgt(const KnownBits &LHS, const KnownBits &RHS) { in sgt() argument
528 if (LHS.getSignedMaxValue().sle(RHS.getSignedMinValue())) in sgt()
531 if (LHS.getSignedMinValue().sgt(RHS.getSignedMaxValue())) in sgt()
536 std::optional<bool> KnownBits::sge(const KnownBits &LHS, const KnownBits &RHS) { in sge() argument
537 if (std::optional<bool> KnownSGT = sgt(RHS, LHS)) in sge()
542 std::optional<bool> KnownBits::slt(const KnownBits &LHS, const KnownBits &RHS) { in slt() argument
543 return sgt(RHS, LHS); in slt()
546 std::optional<bool> KnownBits::sle(const KnownBits &LHS, const KnownBits &RHS) { in sle() argument
547 return sge(RHS, LHS); in sle()
609 const KnownBits &LHS, in computeForSatAddSub() argument
614 KnownBits::computeForAddSub(Add, /*NSW=*/false, /*NUW=*/false, LHS, RHS); in computeForSatAddSub()
624 if (SignBitKnown(LHS) && SignBitKnown(RHS) && SignBitKnown(Res)) { in computeForSatAddSub()
627 Overflow = (LHS.isNonNegative() == RHS.isNonNegative() && in computeForSatAddSub()
628 Res.isNonNegative() != LHS.isNonNegative()); in computeForSatAddSub()
631 Overflow = (LHS.isNonNegative() != RHS.isNonNegative() && in computeForSatAddSub()
632 Res.isNonNegative() != LHS.isNonNegative()); in computeForSatAddSub()
638 (void)LHS.getMaxValue().uadd_ov(RHS.getMaxValue(), Of); in computeForSatAddSub()
642 (void)LHS.getMinValue().uadd_ov(RHS.getMinValue(), Of); in computeForSatAddSub()
649 (void)LHS.getMinValue().usub_ov(RHS.getMaxValue(), Of); in computeForSatAddSub()
653 (void)LHS.getMaxValue().usub_ov(RHS.getMinValue(), Of); in computeForSatAddSub()
661 if (LHS.isNonNegative() && RHS.isNonNegative()) { in computeForSatAddSub()
666 if (LHS.isNegative() && RHS.isNegative()) { in computeForSatAddSub()
672 if (LHS.isNegative() && RHS.isNonNegative()) { in computeForSatAddSub()
676 } else if (LHS.isNonNegative() && RHS.isNegative()) { in computeForSatAddSub()
689 std::max(LHS.countMinLeadingOnes(), RHS.countMinLeadingOnes()); in computeForSatAddSub()
692 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingOnes()); in computeForSatAddSub()
717 assert(SignBitKnown(LHS) && in computeForSatAddSub()
719 C = LHS.isNegative() ? APInt::getSignedMinValue(BitWidth) in computeForSatAddSub()
753 KnownBits KnownBits::sadd_sat(const KnownBits &LHS, const KnownBits &RHS) { in sadd_sat() argument
754 return computeForSatAddSub(/*Add*/ true, /*Signed*/ true, LHS, RHS); in sadd_sat()
756 KnownBits KnownBits::ssub_sat(const KnownBits &LHS, const KnownBits &RHS) { in ssub_sat() argument
757 return computeForSatAddSub(/*Add*/ false, /*Signed*/ true, LHS, RHS); in ssub_sat()
759 KnownBits KnownBits::uadd_sat(const KnownBits &LHS, const KnownBits &RHS) { in uadd_sat() argument
760 return computeForSatAddSub(/*Add*/ true, /*Signed*/ false, LHS, RHS); in uadd_sat()
762 KnownBits KnownBits::usub_sat(const KnownBits &LHS, const KnownBits &RHS) { in usub_sat() argument
763 return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS); in usub_sat()
766 static KnownBits avgCompute(KnownBits LHS, KnownBits RHS, bool IsCeil, in avgCompute() argument
768 unsigned BitWidth = LHS.getBitWidth(); in avgCompute()
769 LHS = IsSigned ? LHS.sext(BitWidth + 1) : LHS.zext(BitWidth + 1); in avgCompute()
771 LHS = in avgCompute()
772 computeForAddCarry(LHS, RHS, /*CarryZero*/ !IsCeil, /*CarryOne*/ IsCeil); in avgCompute()
773 LHS = LHS.extractBits(BitWidth, 1); in avgCompute()
774 return LHS; in avgCompute()
777 KnownBits KnownBits::avgFloorS(const KnownBits &LHS, const KnownBits &RHS) { in avgFloorS() argument
778 return avgCompute(LHS, RHS, /* IsCeil */ false, in avgFloorS()
782 KnownBits KnownBits::avgFloorU(const KnownBits &LHS, const KnownBits &RHS) { in avgFloorU() argument
783 return avgCompute(LHS, RHS, /* IsCeil */ false, in avgFloorU()
787 KnownBits KnownBits::avgCeilS(const KnownBits &LHS, const KnownBits &RHS) { in avgCeilS() argument
788 return avgCompute(LHS, RHS, /* IsCeil */ true, in avgCeilS()
792 KnownBits KnownBits::avgCeilU(const KnownBits &LHS, const KnownBits &RHS) { in avgCeilU() argument
793 return avgCompute(LHS, RHS, /* IsCeil */ true, in avgCeilU()
797 KnownBits KnownBits::mul(const KnownBits &LHS, const KnownBits &RHS, in mul() argument
799 unsigned BitWidth = LHS.getBitWidth(); in mul()
801 assert((!NoUndefSelfMultiply || LHS == RHS) && in mul()
809 APInt UMaxLHS = LHS.getMaxValue(); in mul()
860 const APInt &Bottom0 = LHS.One; in mul()
865 unsigned TrailBitsKnown0 = (LHS.Zero | LHS.One).countr_one(); in mul()
867 unsigned TrailZero0 = LHS.countMinTrailingZeros(); in mul()
894 KnownBits KnownBits::mulhs(const KnownBits &LHS, const KnownBits &RHS) { in mulhs() argument
895 unsigned BitWidth = LHS.getBitWidth(); in mulhs()
897 KnownBits WideLHS = LHS.sext(2 * BitWidth); in mulhs()
902 KnownBits KnownBits::mulhu(const KnownBits &LHS, const KnownBits &RHS) { in mulhu() argument
903 unsigned BitWidth = LHS.getBitWidth(); in mulhu()
905 KnownBits WideLHS = LHS.zext(2 * BitWidth); in mulhu()
910 static KnownBits divComputeLowBit(KnownBits Known, const KnownBits &LHS, in divComputeLowBit() argument
919 if (LHS.One[0]) in divComputeLowBit()
923 (int)LHS.countMinTrailingZeros() - (int)RHS.countMaxTrailingZeros(); in divComputeLowBit()
925 (int)LHS.countMaxTrailingZeros() - (int)RHS.countMinTrailingZeros(); in divComputeLowBit()
946 KnownBits KnownBits::sdiv(const KnownBits &LHS, const KnownBits &RHS, in sdiv() argument
949 if (LHS.isNonNegative() && RHS.isNonNegative()) in sdiv()
950 return udiv(LHS, RHS, Exact); in sdiv()
952 unsigned BitWidth = LHS.getBitWidth(); in sdiv()
955 if (LHS.isZero() || RHS.isZero()) { in sdiv()
963 if (LHS.isNegative() && RHS.isNegative()) { in sdiv()
966 APInt Num = LHS.getSignedMinValue(); in sdiv()
972 } else if (LHS.isNegative() && RHS.isNonNegative()) { in sdiv()
974 if (Exact || (-LHS.getSignedMaxValue()).uge(RHS.getSignedMaxValue())) { in sdiv()
976 APInt Num = LHS.getSignedMinValue(); in sdiv()
979 } else if (LHS.isStrictlyPositive() && RHS.isNegative()) { in sdiv()
981 if (Exact || LHS.getSignedMinValue().uge(-RHS.getSignedMinValue())) { in sdiv()
983 APInt Num = LHS.getSignedMaxValue(); in sdiv()
998 Known = divComputeLowBit(Known, LHS, RHS, Exact); in sdiv()
1002 KnownBits KnownBits::udiv(const KnownBits &LHS, const KnownBits &RHS, in udiv() argument
1004 unsigned BitWidth = LHS.getBitWidth(); in udiv()
1007 if (LHS.isZero() || RHS.isZero()) { in udiv()
1018 APInt MaxNum = LHS.getMaxValue(); in udiv()
1024 Known = divComputeLowBit(Known, LHS, RHS, Exact); in udiv()
1029 KnownBits KnownBits::remGetLowBits(const KnownBits &LHS, const KnownBits &RHS) { in remGetLowBits() argument
1030 unsigned BitWidth = LHS.getBitWidth(); in remGetLowBits()
1035 APInt OnesMask = LHS.One & Mask; in remGetLowBits()
1036 APInt ZerosMask = LHS.Zero & Mask; in remGetLowBits()
1042 KnownBits KnownBits::urem(const KnownBits &LHS, const KnownBits &RHS) { in urem() argument
1043 KnownBits Known = remGetLowBits(LHS, RHS); in urem()
1054 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingZeros()); in urem()
1059 KnownBits KnownBits::srem(const KnownBits &LHS, const KnownBits &RHS) { in srem() argument
1060 KnownBits Known = remGetLowBits(LHS, RHS); in srem()
1066 if (LHS.isNonNegative() || LowBits.isSubsetOf(LHS.Zero)) in srem()
1071 if (LHS.isNegative() && LowBits.intersects(LHS.One)) in srem()
1080 Known.Zero.setHighBits(LHS.countMinLeadingZeros()); in srem()