aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/APIntTest.cpp
diff options
context:
space:
mode:
authorIman Hosseini <imanhosseini@google.com>2025-01-17 14:40:31 +0000
committerGitHub <noreply@github.com>2025-01-17 14:40:31 +0000
commit8ae1cb2bcb55293cce31bb75c38d6b4e8a13cc23 (patch)
tree434c76e3876d25161af7c99928acc9fc5b56e216 /llvm/unittests/ADT/APIntTest.cpp
parenta18f4bdb18d59858e384540a62c9145c888cc9b2 (diff)
downloadllvm-8ae1cb2bcb55293cce31bb75c38d6b4e8a13cc23.zip
llvm-8ae1cb2bcb55293cce31bb75c38d6b4e8a13cc23.tar.gz
llvm-8ae1cb2bcb55293cce31bb75c38d6b4e8a13cc23.tar.bz2
add power function to APInt (#122788)
I am trying to calculate power function for APFloat, APInt to constant fold vector reductions: https://github.com/llvm/llvm-project/pull/122450 I need this utility to fold N `mul`s into power. --------- Co-authored-by: ImanHosseini <imanhosseini.17@gmail.com> Co-authored-by: Jakub Kuderski <kubakuderski@gmail.com>
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 4d5553f..b14366e 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -29,6 +29,73 @@ TEST(APIntTest, ValueInit) {
EXPECT_TRUE(!Zero.sext(64));
}
+// Test that 0^5 == 0
+TEST(APIntTest, PowZeroTo5) {
+ APInt Zero = APInt::getZero(32);
+ EXPECT_TRUE(!Zero);
+ APInt ZeroTo5 = APIntOps::pow(Zero, 5);
+ EXPECT_TRUE(!ZeroTo5);
+}
+
+// Test that 1^16 == 1
+TEST(APIntTest, PowOneTo16) {
+ APInt One(32, 1);
+ APInt OneTo16 = APIntOps::pow(One, 16);
+ EXPECT_EQ(One, OneTo16);
+}
+
+// Test that 2^10 == 1024
+TEST(APIntTest, PowerTwoTo10) {
+ APInt Two(32, 2);
+ APInt TwoTo20 = APIntOps::pow(Two, 10);
+ APInt V_1024(32, 1024);
+ EXPECT_EQ(TwoTo20, V_1024);
+}
+
+// Test that 3^3 == 27
+TEST(APIntTest, PowerThreeTo3) {
+ APInt Three(32, 3);
+ APInt ThreeTo3 = APIntOps::pow(Three, 3);
+ APInt V_27(32, 27);
+ EXPECT_EQ(ThreeTo3, V_27);
+}
+
+// Test that SignedMaxValue^3 == SignedMaxValue
+TEST(APIntTest, PowerSignedMaxValue) {
+ APInt SignedMaxValue = APInt::getSignedMaxValue(32);
+ APInt MaxTo3 = APIntOps::pow(SignedMaxValue, 3);
+ EXPECT_EQ(MaxTo3, SignedMaxValue);
+}
+
+// Test that MaxValue^3 == MaxValue
+TEST(APIntTest, PowerMaxValue) {
+ APInt MaxValue = APInt::getMaxValue(32);
+ APInt MaxTo3 = APIntOps::pow(MaxValue, 3);
+ EXPECT_EQ(MaxValue, MaxTo3);
+}
+
+// Test that SignedMinValue^3 == 0
+TEST(APIntTest, PowerSignedMinValueTo3) {
+ APInt SignedMinValue = APInt::getSignedMinValue(32);
+ APInt MinTo3 = APIntOps::pow(SignedMinValue, 3);
+ EXPECT_TRUE(MinTo3.isZero());
+}
+
+// Test that SignedMinValue^1 == SignedMinValue
+TEST(APIntTest, PowerSignedMinValueTo1) {
+ APInt SignedMinValue = APInt::getSignedMinValue(32);
+ APInt MinTo1 = APIntOps::pow(SignedMinValue, 1);
+ EXPECT_EQ(SignedMinValue, MinTo1);
+}
+
+// Test that MaxValue^3 == MaxValue
+TEST(APIntTest, ZeroToZero) {
+ APInt Zero = APInt::getZero(32);
+ APInt One(32, 1);
+ APInt ZeroToZero = APIntOps::pow(Zero, 0);
+ EXPECT_EQ(ZeroToZero, One);
+}
+
// Test that APInt shift left works when bitwidth > 64 and shiftamt == 0
TEST(APIntTest, ShiftLeftByZero) {
APInt One = APInt::getZero(65) + 1;