aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/MathExtrasTest.cpp
diff options
context:
space:
mode:
authorRamkumar Ramachandra <ramkumar.ramachandra@codasip.com>2024-06-29 12:16:47 +0100
committerGitHub <noreply@github.com>2024-06-29 12:16:47 +0100
commit56277948d577245be845c89a7d7c3a5ccd9747ef (patch)
tree3c5d8c9cb0f4cf07fa2b4f8e12d6f0e8f7066f7b /llvm/unittests/Support/MathExtrasTest.cpp
parent5cc1287bdbb2de9ad91e4ba8dc9eeb9508c734a5 (diff)
downloadllvm-56277948d577245be845c89a7d7c3a5ccd9747ef.zip
llvm-56277948d577245be845c89a7d7c3a5ccd9747ef.tar.gz
llvm-56277948d577245be845c89a7d7c3a5ccd9747ef.tar.bz2
MathExtras: avoid unnecessarily widening types (#95426)
Several multi-argument functions unnecessarily widen types beyond the argument types. Template'ize the functions, and use std::common_type_t to avoid this, hence optimizing the functions. A requirement of this patch is to change the overflow behavior of alignTo to only overflow when the result isn't representable in the return type.
Diffstat (limited to 'llvm/unittests/Support/MathExtrasTest.cpp')
-rw-r--r--llvm/unittests/Support/MathExtrasTest.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/unittests/Support/MathExtrasTest.cpp b/llvm/unittests/Support/MathExtrasTest.cpp
index bd09bab..a557b61 100644
--- a/llvm/unittests/Support/MathExtrasTest.cpp
+++ b/llvm/unittests/Support/MathExtrasTest.cpp
@@ -189,8 +189,13 @@ 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(8u, alignTo(5ULL, 8ULL));
+
+ EXPECT_EQ(8u, alignTo<8>(5));
+ EXPECT_EQ(24u, alignTo<8>(17));
+ EXPECT_EQ(0u, alignTo<8>(~0LL));
+ EXPECT_EQ(254u,
+ alignTo<static_cast<uint8_t>(127)>(static_cast<uint8_t>(200)));
EXPECT_EQ(7u, alignTo(5, 8, 7));
EXPECT_EQ(17u, alignTo(17, 8, 1));
@@ -198,12 +203,21 @@ TEST(MathExtras, AlignTo) {
EXPECT_EQ(552u, alignTo(321, 255, 42));
EXPECT_EQ(std::numeric_limits<uint32_t>::max(),
alignTo(std::numeric_limits<uint32_t>::max(), 2, 1));
+
+ // Overflow.
+ EXPECT_EQ(0u, alignTo(static_cast<uint8_t>(200), static_cast<uint8_t>(128)));
+ EXPECT_EQ(0u, alignTo<static_cast<uint8_t>(128)>(static_cast<uint8_t>(200)));
+ EXPECT_EQ(0u, alignTo(static_cast<uint8_t>(200), static_cast<uint8_t>(128),
+ static_cast<uint8_t>(0)));
+ EXPECT_EQ(0u, alignTo(std::numeric_limits<uint32_t>::max(), 2));
}
TEST(MathExtras, AlignToPowerOf2) {
+ EXPECT_EQ(0u, alignToPowerOf2(0u, 8));
EXPECT_EQ(8u, alignToPowerOf2(5, 8));
EXPECT_EQ(24u, alignToPowerOf2(17, 8));
EXPECT_EQ(0u, alignToPowerOf2(~0LL, 8));
+ EXPECT_EQ(240u, alignToPowerOf2(240, 16));
EXPECT_EQ(static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()) + 1,
alignToPowerOf2(std::numeric_limits<uint32_t>::max(), 2));
}