[llvm] [APInt] Introduce isSameSignedValue (PR #178854)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 30 01:56:21 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-adt

Author: Ramkumar Ramachandra (artagnon)

<details>
<summary>Changes</summary>

Similar to isSameValue, it checks if two APInts have the same signed value.

---
Full diff: https://github.com/llvm/llvm-project/pull/178854.diff


2 Files Affected:

- (modified) llvm/include/llvm/ADT/APInt.h (+12) 
- (modified) llvm/unittests/ADT/APIntTest.cpp (+22-1) 


``````````diff
diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h
index 9193b5f8994e0..2676cb67005b0 100644
--- a/llvm/include/llvm/ADT/APInt.h
+++ b/llvm/include/llvm/ADT/APInt.h
@@ -561,6 +561,18 @@ class [[nodiscard]] APInt {
     return I1.zext(I2.getBitWidth()) == I2;
   }
 
+  /// Determine if two APInts have the same value, after sign-extending
+  /// one of them (if needed!) to ensure that the bit-widths match.
+  static bool isSameSignedValue(const APInt &I1, const APInt &I2) {
+    if (I1.getBitWidth() == I2.getBitWidth())
+      return I1 == I2;
+
+    if (I1.getBitWidth() > I2.getBitWidth())
+      return I1 == I2.sext(I1.getBitWidth());
+
+    return I1.sext(I2.getBitWidth()) == I2;
+  }
+
   /// Overload to compute a hash_code for an APInt value.
   LLVM_ABI friend hash_code hash_value(const APInt &Arg);
 
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 271d17cb29905..be5db038c904d 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -14,7 +14,6 @@
 #include "llvm/Support/Alignment.h"
 #include "gtest/gtest.h"
 #include <array>
-#include <climits>
 #include <limits>
 #include <optional>
 
@@ -29,6 +28,28 @@ TEST(APIntTest, ValueInit) {
   EXPECT_TRUE(!Zero.sext(64));
 }
 
+TEST(APIntTest, IsSameValueAndIsSameSignedValue) {
+  APInt One8(8, 1, /*isSigned=*/false);
+  APInt Three4(4, 3, /*isSigned=*/false);
+  EXPECT_FALSE(APInt::isSameValue(One8, Three4));
+  EXPECT_FALSE(APInt::isSameSignedValue(One8, Three4));
+
+  APInt Two8(8, 2, /*isSigned=*/false);
+  APInt Two4(4, 2, /*isSigned=*/false);
+  EXPECT_TRUE(APInt::isSameValue(Two8, Two4));
+  EXPECT_TRUE(APInt::isSameSignedValue(Two8, Two4));
+
+  APInt Seven8(8, 7, /*isSigned=*/false);
+  APInt Seven3(3, 7, /*isSigned=*/false);
+  EXPECT_TRUE(APInt::isSameValue(Seven8, Seven3));
+  EXPECT_FALSE(APInt::isSameSignedValue(Seven8, Seven3));
+
+  APInt Ones8 = APInt::getAllOnes(8);
+  APInt Ones4 = APInt::getAllOnes(4);
+  EXPECT_FALSE(APInt::isSameValue(Ones8, Ones4));
+  EXPECT_TRUE(APInt::isSameSignedValue(Ones8, Ones4));
+}
+
 // Test that 0^5 == 0
 TEST(APIntTest, PowZeroTo5) {
   APInt Zero = APInt::getZero(32);

``````````

</details>


https://github.com/llvm/llvm-project/pull/178854


More information about the llvm-commits mailing list