Commit 7b771ed4 authored by Tim Shen's avatar Tim Shen
Browse files

[APInt] Fix tests that had wrong assumption about sdivs with negative quotient.

Reviewers: sanjoy

Subscribers: bixia, dexonsmith, sanjoy.google, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D70156
parent 0478eadf
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -2604,31 +2604,36 @@ TEST(APIntTest, RoundingSDiv) {
      EXPECT_EQ(0, APIntOps::RoundingSDiv(Zero, A, APInt::Rounding::TOWARD_ZERO));
    }

    for (uint64_t Bi = -128; Bi <= 127; Bi++) {
    for (int64_t Bi = -128; Bi <= 127; Bi++) {
      if (Bi == 0)
        continue;

      APInt B(8, Bi);
      APInt QuoTowardZero = A.sdiv(B);
      {
        APInt Quo = APIntOps::RoundingSDiv(A, B, APInt::Rounding::UP);
        auto Prod = Quo.sext(16) * B.sext(16);
        EXPECT_TRUE(Prod.uge(A));
        if (Prod.ugt(A)) {
          EXPECT_TRUE(((Quo - 1).sext(16) * B.sext(16)).ult(A));
        if (A.srem(B).isNullValue()) {
          EXPECT_EQ(QuoTowardZero, Quo);
        } else if (A.isNegative() !=
                   B.isNegative()) { // if the math quotient is negative.
          EXPECT_EQ(QuoTowardZero, Quo);
        } else {
          EXPECT_EQ(QuoTowardZero + 1, Quo);
        }
      }
      {
        APInt Quo = APIntOps::RoundingSDiv(A, B, APInt::Rounding::DOWN);
        auto Prod = Quo.sext(16) * B.sext(16);
        EXPECT_TRUE(Prod.ule(A));
        if (Prod.ult(A)) {
          EXPECT_TRUE(((Quo + 1).sext(16) * B.sext(16)).ugt(A));
        }
        if (A.srem(B).isNullValue()) {
          EXPECT_EQ(QuoTowardZero, Quo);
        } else if (A.isNegative() !=
                   B.isNegative()) { // if the math quotient is negative.
          EXPECT_EQ(QuoTowardZero - 1, Quo);
        } else {
          EXPECT_EQ(QuoTowardZero, Quo);
        }
      {
        APInt Quo = A.sdiv(B);
        EXPECT_EQ(Quo, APIntOps::RoundingSDiv(A, B, APInt::Rounding::TOWARD_ZERO));
      }
      EXPECT_EQ(QuoTowardZero,
                APIntOps::RoundingSDiv(A, B, APInt::Rounding::TOWARD_ZERO));
    }
  }
}