diff options
Diffstat (limited to 'llvm/unittests/Support/MathExtrasTest.cpp')
| -rw-r--r-- | llvm/unittests/Support/MathExtrasTest.cpp | 114 |
1 files changed, 110 insertions, 4 deletions
diff --git a/llvm/unittests/Support/MathExtrasTest.cpp b/llvm/unittests/Support/MathExtrasTest.cpp index 67239a24c47a..bd09bab9be00 100644 --- a/llvm/unittests/Support/MathExtrasTest.cpp +++ b/llvm/unittests/Support/MathExtrasTest.cpp @@ -8,6 +8,7 @@ #include "llvm/Support/MathExtras.h" #include "gtest/gtest.h" +#include <limits> using namespace llvm; @@ -175,6 +176,7 @@ TEST(MathExtras, MinAlign) { EXPECT_EQ(2u, MinAlign(2, 4)); EXPECT_EQ(1u, MinAlign(17, 64)); EXPECT_EQ(256u, MinAlign(256, 512)); + EXPECT_EQ(2u, MinAlign(0, 2)); } TEST(MathExtras, NextPowerOf2) { @@ -183,15 +185,34 @@ TEST(MathExtras, NextPowerOf2) { EXPECT_EQ(256u, NextPowerOf2(128)); } -TEST(MathExtras, alignTo) { +TEST(MathExtras, AlignTo) { EXPECT_EQ(8u, alignTo(5, 8)); EXPECT_EQ(24u, alignTo(17, 8)); EXPECT_EQ(0u, alignTo(~0LL, 8)); + EXPECT_EQ(static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()) + 1, + alignTo(std::numeric_limits<uint32_t>::max(), 2)); EXPECT_EQ(7u, alignTo(5, 8, 7)); EXPECT_EQ(17u, alignTo(17, 8, 1)); EXPECT_EQ(3u, alignTo(~0LL, 8, 3)); EXPECT_EQ(552u, alignTo(321, 255, 42)); + EXPECT_EQ(std::numeric_limits<uint32_t>::max(), + alignTo(std::numeric_limits<uint32_t>::max(), 2, 1)); +} + +TEST(MathExtras, AlignToPowerOf2) { + EXPECT_EQ(8u, alignToPowerOf2(5, 8)); + EXPECT_EQ(24u, alignToPowerOf2(17, 8)); + EXPECT_EQ(0u, alignToPowerOf2(~0LL, 8)); + EXPECT_EQ(static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()) + 1, + alignToPowerOf2(std::numeric_limits<uint32_t>::max(), 2)); +} + +TEST(MathExtras, AlignDown) { + EXPECT_EQ(0u, alignDown(5, 8)); + EXPECT_EQ(16u, alignDown(17, 8)); + EXPECT_EQ(std::numeric_limits<uint32_t>::max() - 1, + alignDown(std::numeric_limits<uint32_t>::max(), 2)); } template <typename T> void SaturatingAddTestHelper() { @@ -434,8 +455,94 @@ TEST(MathExtras, IsShiftedInt) { EXPECT_FALSE((isShiftedInt<6, 10>(int64_t(1) << 15))); } -template <typename T> -class OverflowTest : public ::testing::Test { }; +TEST(MathExtras, DivideNearest) { + EXPECT_EQ(divideNearest(14, 3), 5u); + EXPECT_EQ(divideNearest(15, 3), 5u); + EXPECT_EQ(divideNearest(0, 3), 0u); + EXPECT_EQ(divideNearest(5, 4), 1u); + EXPECT_EQ(divideNearest(6, 4), 2u); + EXPECT_EQ(divideNearest(3, 1), 3u); + EXPECT_EQ(divideNearest(3, 6), 1u); + EXPECT_EQ(divideNearest(3, 7), 0u); + EXPECT_EQ(divideNearest(std::numeric_limits<uint32_t>::max(), 2), + std::numeric_limits<uint32_t>::max() / 2 + 1); + EXPECT_EQ(divideNearest(std::numeric_limits<uint64_t>::max(), 2), + std::numeric_limits<uint64_t>::max() / 2 + 1); + EXPECT_EQ(divideNearest(std::numeric_limits<uint64_t>::max(), 1), + std::numeric_limits<uint64_t>::max()); + EXPECT_EQ(divideNearest(std::numeric_limits<uint64_t>::max() - 1, + std::numeric_limits<uint64_t>::max()), + 1u); +} + +TEST(MathExtras, DivideCeil) { + EXPECT_EQ(divideCeil(14, 3), 5u); + EXPECT_EQ(divideCeil(15, 3), 5u); + EXPECT_EQ(divideCeil(0, 3), 0u); + EXPECT_EQ(divideCeil(5, 4), 2u); + EXPECT_EQ(divideCeil(6, 4), 2u); + EXPECT_EQ(divideCeil(3, 1), 3u); + EXPECT_EQ(divideCeil(3, 6), 1u); + EXPECT_EQ(divideCeil(3, 7), 1u); + EXPECT_EQ(divideCeil(std::numeric_limits<uint32_t>::max(), 2), + std::numeric_limits<uint32_t>::max() / 2 + 1); + EXPECT_EQ(divideCeil(std::numeric_limits<uint64_t>::max(), 2), + std::numeric_limits<uint64_t>::max() / 2 + 1); + EXPECT_EQ(divideCeil(std::numeric_limits<uint64_t>::max(), 1), + std::numeric_limits<uint64_t>::max()); + + EXPECT_EQ(divideCeilSigned(14, 3), 5); + EXPECT_EQ(divideCeilSigned(15, 3), 5); + EXPECT_EQ(divideCeilSigned(14, -3), -4); + EXPECT_EQ(divideCeilSigned(-14, -3), 5); + EXPECT_EQ(divideCeilSigned(-14, 3), -4); + EXPECT_EQ(divideCeilSigned(-15, 3), -5); + EXPECT_EQ(divideCeilSigned(0, 3), 0); + EXPECT_EQ(divideCeilSigned(0, -3), 0); + EXPECT_EQ(divideCeilSigned(std::numeric_limits<int32_t>::max(), 2), + std::numeric_limits<int32_t>::max() / 2 + 1); + EXPECT_EQ(divideCeilSigned(std::numeric_limits<int64_t>::max(), 2), + std::numeric_limits<int64_t>::max() / 2 + 1); + EXPECT_EQ(divideCeilSigned(std::numeric_limits<int32_t>::max(), -2), + std::numeric_limits<int32_t>::min() / 2 + 1); + EXPECT_EQ(divideCeilSigned(std::numeric_limits<int64_t>::max(), -2), + std::numeric_limits<int64_t>::min() / 2 + 1); + EXPECT_EQ(divideCeilSigned(std::numeric_limits<int64_t>::min(), 1), + std::numeric_limits<int64_t>::min()); +} + +TEST(MathExtras, DivideFloorSigned) { + EXPECT_EQ(divideFloorSigned(14, 3), 4); + EXPECT_EQ(divideFloorSigned(15, 3), 5); + EXPECT_EQ(divideFloorSigned(14, -3), -5); + EXPECT_EQ(divideFloorSigned(-14, -3), 4); + EXPECT_EQ(divideFloorSigned(-14, 3), -5); + EXPECT_EQ(divideFloorSigned(-15, 3), -5); + EXPECT_EQ(divideFloorSigned(0, 3), 0); + EXPECT_EQ(divideFloorSigned(0, -3), 0); + EXPECT_EQ(divideFloorSigned(std::numeric_limits<int32_t>::max(), 2), + std::numeric_limits<int32_t>::max() / 2); + EXPECT_EQ(divideFloorSigned(std::numeric_limits<int64_t>::max(), 2), + std::numeric_limits<int64_t>::max() / 2); + EXPECT_EQ(divideFloorSigned(std::numeric_limits<int32_t>::max(), -2), + std::numeric_limits<int32_t>::min() / 2); + EXPECT_EQ(divideFloorSigned(std::numeric_limits<int64_t>::max(), -2), + std::numeric_limits<int64_t>::min() / 2); + EXPECT_EQ(divideFloorSigned(std::numeric_limits<int64_t>::min(), 1), + std::numeric_limits<int64_t>::min()); +} + +TEST(MathExtras, Mod) { + EXPECT_EQ(mod(1, 14), 1); + EXPECT_EQ(mod(-1, 14), 13); + EXPECT_EQ(mod(14, 3), 2); + EXPECT_EQ(mod(15, 3), 0); + EXPECT_EQ(mod(-14, 3), 1); + EXPECT_EQ(mod(-15, 3), 0); + EXPECT_EQ(mod(0, 3), 0); +} + +template <typename T> class OverflowTest : public ::testing::Test {}; using OverflowTestTypes = ::testing::Types<signed char, short, int, long, long long>; @@ -560,5 +667,4 @@ TYPED_TEST(OverflowTest, MulResultZero) { EXPECT_FALSE(MulOverflow<TypeParam>(0, -5, Result)); EXPECT_EQ(Result, TypeParam(0)); } - } // namespace |
