diff options
author | Ramkumar Ramachandra <ramkumar.ramachandra@codasip.com> | 2024-06-29 12:16:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-29 12:16:47 +0100 |
commit | 56277948d577245be845c89a7d7c3a5ccd9747ef (patch) | |
tree | 3c5d8c9cb0f4cf07fa2b4f8e12d6f0e8f7066f7b /llvm/unittests/Support/MathExtrasTest.cpp | |
parent | 5cc1287bdbb2de9ad91e4ba8dc9eeb9508c734a5 (diff) | |
download | llvm-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.cpp | 18 |
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)); } |