aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/APIntTest.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2021-10-19 14:37:34 +0100
committerSimon Pilgrim <llvm-dev@redking.me.uk>2021-10-19 14:38:21 +0100
commit71e39e3f1867032a2fc0c19fa8d4881b39fc5a49 (patch)
treeab3472c7731bdf9ac806b9c9489e1a973950179f /llvm/unittests/ADT/APIntTest.cpp
parent7df912c65d1963c5403f1d645329b20f7e2d60ea (diff)
downloadllvm-71e39e3f1867032a2fc0c19fa8d4881b39fc5a49.zip
llvm-71e39e3f1867032a2fc0c19fa8d4881b39fc5a49.tar.gz
llvm-71e39e3f1867032a2fc0c19fa8d4881b39fc5a49.tar.bz2
[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
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp26
1 files changed, 26 insertions, 0 deletions
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