|
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