From 71e39e3f1867032a2fc0c19fa8d4881b39fc5a49 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Tue, 19 Oct 2021 14:37:34 +0100 Subject: [ADT] Add APInt::isNegatedPowerOf2() helper Inspired by D111968, provide a isNegatedPowerOf2() wrapper instead of obfuscating code with (-Value).isPowerOf2() patterns, which I'm sure are likely avenues for typos..... Differential Revision: https://reviews.llvm.org/D111998 --- llvm/unittests/ADT/APIntTest.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'llvm/unittests/ADT/APIntTest.cpp') diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp index 0efe28f..8a731633 100644 --- a/llvm/unittests/ADT/APIntTest.cpp +++ b/llvm/unittests/ADT/APIntTest.cpp @@ -1785,6 +1785,32 @@ TEST(APIntTest, isPowerOf2) { } } +TEST(APIntTest, isNegatedPowerOf2) { + EXPECT_FALSE(APInt(5, 0x00).isNegatedPowerOf2()); + EXPECT_TRUE(APInt(15, 0x7ffe).isNegatedPowerOf2()); + EXPECT_TRUE(APInt(16, 0xfffc).isNegatedPowerOf2()); + EXPECT_TRUE(APInt(32, 0xffffffff).isNegatedPowerOf2()); + + for (int N : {1, 2, 3, 4, 7, 8, 16, 32, 64, 127, 128, 129, 256}) { + EXPECT_FALSE(APInt(N, 0).isNegatedPowerOf2()); + EXPECT_TRUE(APInt::getAllOnes(N).isNegatedPowerOf2()); + EXPECT_TRUE(APInt::getSignedMinValue(N).isNegatedPowerOf2()); + EXPECT_TRUE((-APInt::getSignedMinValue(N)).isNegatedPowerOf2()); + + APInt One(N, 1); + for (int I = 1; I < N - 1; ++I) { + EXPECT_FALSE(APInt::getOneBitSet(N, I).isNegatedPowerOf2()); + EXPECT_TRUE((-APInt::getOneBitSet(N, I)).isNegatedPowerOf2()); + + APInt MaskVal = One.shl(I); + EXPECT_TRUE((-MaskVal).isNegatedPowerOf2()); + + APInt ShiftMaskVal = One.getHighBitsSet(N, I); + EXPECT_TRUE(ShiftMaskVal.isNegatedPowerOf2()); + } + } +} + // Test that self-move works with EXPENSIVE_CHECKS. It calls std::shuffle which // does self-move on some platforms. #ifdef EXPENSIVE_CHECKS -- cgit v1.1