|
18 | 18 |
|
19 | 19 | using namespace llvm; |
20 | 20 |
|
| 21 | +KnownBits KnownBits::flipSignBit(const KnownBits &Val) { |
| 22 | + unsigned SignBitPosition = Val.getBitWidth() - 1; |
| 23 | + APInt Zero = Val.Zero; |
| 24 | + APInt One = Val.One; |
| 25 | + Zero.setBitVal(SignBitPosition, Val.One[SignBitPosition]); |
| 26 | + One.setBitVal(SignBitPosition, Val.Zero[SignBitPosition]); |
| 27 | + return KnownBits(Zero, One); |
| 28 | +} |
| 29 | + |
21 | 30 | static KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, |
22 | 31 | bool CarryZero, bool CarryOne) { |
23 | 32 |
|
@@ -200,16 +209,7 @@ KnownBits KnownBits::umin(const KnownBits &LHS, const KnownBits &RHS) { |
200 | 209 | } |
201 | 210 |
|
202 | 211 | KnownBits KnownBits::smax(const KnownBits &LHS, const KnownBits &RHS) { |
203 | | - // Flip the range of values: [-0x80000000, 0x7FFFFFFF] <-> [0, 0xFFFFFFFF] |
204 | | - auto Flip = [](const KnownBits &Val) { |
205 | | - unsigned SignBitPosition = Val.getBitWidth() - 1; |
206 | | - APInt Zero = Val.Zero; |
207 | | - APInt One = Val.One; |
208 | | - Zero.setBitVal(SignBitPosition, Val.One[SignBitPosition]); |
209 | | - One.setBitVal(SignBitPosition, Val.Zero[SignBitPosition]); |
210 | | - return KnownBits(Zero, One); |
211 | | - }; |
212 | | - return Flip(umax(Flip(LHS), Flip(RHS))); |
| 212 | + return flipSignBit(umax(flipSignBit(LHS), flipSignBit(RHS))); |
213 | 213 | } |
214 | 214 |
|
215 | 215 | KnownBits KnownBits::smin(const KnownBits &LHS, const KnownBits &RHS) { |
@@ -763,35 +763,30 @@ KnownBits KnownBits::usub_sat(const KnownBits &LHS, const KnownBits &RHS) { |
763 | 763 | return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS); |
764 | 764 | } |
765 | 765 |
|
766 | | -static KnownBits avgCompute(KnownBits LHS, KnownBits RHS, bool IsCeil, |
767 | | - bool IsSigned) { |
| 766 | +static KnownBits avgComputeU(KnownBits LHS, KnownBits RHS, bool IsCeil) { |
768 | 767 | unsigned BitWidth = LHS.getBitWidth(); |
769 | | - LHS = IsSigned ? LHS.sext(BitWidth + 1) : LHS.zext(BitWidth + 1); |
770 | | - RHS = IsSigned ? RHS.sext(BitWidth + 1) : RHS.zext(BitWidth + 1); |
| 768 | + LHS = LHS.zext(BitWidth + 1); |
| 769 | + RHS = RHS.zext(BitWidth + 1); |
771 | 770 | LHS = |
772 | 771 | computeForAddCarry(LHS, RHS, /*CarryZero*/ !IsCeil, /*CarryOne*/ IsCeil); |
773 | 772 | LHS = LHS.extractBits(BitWidth, 1); |
774 | 773 | return LHS; |
775 | 774 | } |
776 | 775 |
|
777 | 776 | KnownBits KnownBits::avgFloorS(const KnownBits &LHS, const KnownBits &RHS) { |
778 | | - return avgCompute(LHS, RHS, /* IsCeil */ false, |
779 | | - /* IsSigned */ true); |
| 777 | + return flipSignBit(avgFloorU(flipSignBit(LHS), flipSignBit(RHS))); |
780 | 778 | } |
781 | 779 |
|
782 | 780 | KnownBits KnownBits::avgFloorU(const KnownBits &LHS, const KnownBits &RHS) { |
783 | | - return avgCompute(LHS, RHS, /* IsCeil */ false, |
784 | | - /* IsSigned */ false); |
| 781 | + return avgComputeU(LHS, RHS, /*IsCeil=*/false); |
785 | 782 | } |
786 | 783 |
|
787 | 784 | KnownBits KnownBits::avgCeilS(const KnownBits &LHS, const KnownBits &RHS) { |
788 | | - return avgCompute(LHS, RHS, /* IsCeil */ true, |
789 | | - /* IsSigned */ true); |
| 785 | + return flipSignBit(avgCeilU(flipSignBit(LHS), flipSignBit(RHS))); |
790 | 786 | } |
791 | 787 |
|
792 | 788 | KnownBits KnownBits::avgCeilU(const KnownBits &LHS, const KnownBits &RHS) { |
793 | | - return avgCompute(LHS, RHS, /* IsCeil */ true, |
794 | | - /* IsSigned */ false); |
| 789 | + return avgComputeU(LHS, RHS, /*IsCeil=*/true); |
795 | 790 | } |
796 | 791 |
|
797 | 792 | KnownBits KnownBits::mul(const KnownBits &LHS, const KnownBits &RHS, |
|
0 commit comments