[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
This commit is contained in:
Tim Shen 2019-11-12 18:17:04 -08:00
parent 8cece4c2f5
commit d64d54da75

View File

@ -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));
}
}
}