diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/unittests/ADT/APIntTest.cpp @@ -2604,31 +2604,36 @@ 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)); } } }