summaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/MathExtrasTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/Support/MathExtrasTest.cpp')
-rw-r--r--llvm/unittests/Support/MathExtrasTest.cpp114
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