From 160c3e1fee5767d068552465bcdf130ae499bd5b Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Fri, 11 Nov 2016 02:22:16 +0000 Subject: [PATCH] [ADT/MathExtras] Introduce PowerOf2Ceil. To be used in lld (and probably somewhere else in llvm). Differential Revision: https://reviews.llvm.org/D26538 llvm-svn: 286549 --- include/llvm/Support/MathExtras.h | 8 ++++++++ unittests/Support/MathExtrasTest.cpp | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index 77b1f74d336..dd835170c2c 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -641,6 +641,14 @@ inline uint64_t PowerOf2Floor(uint64_t A) { return 1ull << (63 - countLeadingZeros(A, ZB_Undefined)); } +/// Returns the power of two which is greater than or equal to the given value. +/// Essentially, it is a ceil operation across the domain of powers of two. +inline uint64_t PowerOf2Ceil(uint64_t A) { + if (!A) + return 0; + return NextPowerOf2(A - 1); +} + /// Returns the next integer (mod 2**64) that is greater than or equal to /// \p Value and is a multiple of \p Align. \p Align must be non-zero. /// diff --git a/unittests/Support/MathExtrasTest.cpp b/unittests/Support/MathExtrasTest.cpp index d373030881e..c8c49506ce5 100644 --- a/unittests/Support/MathExtrasTest.cpp +++ b/unittests/Support/MathExtrasTest.cpp @@ -165,6 +165,12 @@ TEST(MathExtras, isPowerOf2_64) { EXPECT_FALSE(isPowerOf2_64(0xABCDEF0ABCDEF0LL)); } +TEST(MathExtras, PowerOf2Ceil) { + EXPECT_EQ(0, PowerOf2Ceil(0)); + EXPECT_EQ(8, PowerOf2Ceil(8)); + EXPECT_EQ(8, PowerOf2Ceil(7)); +} + TEST(MathExtras, ByteSwap_32) { EXPECT_EQ(0x44332211u, ByteSwap_32(0x11223344)); EXPECT_EQ(0xDDCCBBAAu, ByteSwap_32(0xAABBCCDD));