[PATCH] D139683: [APInt] provide a safe API for zext value and sext value.

Peter Rong via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 8 17:05:24 PST 2022


Peter updated this revision to Diff 481482.
Peter added a comment.

use existing API


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139683/new/

https://reviews.llvm.org/D139683

Files:
  llvm/include/llvm/ADT/APInt.h
  llvm/lib/Support/APInt.cpp
  llvm/unittests/ADT/APIntTest.cpp


Index: llvm/unittests/ADT/APIntTest.cpp
===================================================================
--- llvm/unittests/ADT/APIntTest.cpp
+++ llvm/unittests/ADT/APIntTest.cpp
@@ -3133,4 +3133,15 @@
   Map.find(ZeroWidthInt);
 }
 
+TEST(APIntTest, TryExt) {
+  APInt small(32, 42);
+  APInt large(128, {0xffff, 0xffff});
+  ASSERT_TRUE(small.tryZExtValue().has_value());
+  ASSERT_TRUE(small.trySExtValue().has_value());
+  ASSERT_FALSE(large.tryZExtValue().has_value());
+  ASSERT_FALSE(large.trySExtValue().has_value());
+  ASSERT_EQ(small.trySExtValue().value_or(41), 42);
+  ASSERT_EQ(large.trySExtValue().value_or(41), 41);
+}
+
 } // end anonymous namespace
Index: llvm/lib/Support/APInt.cpp
===================================================================
--- llvm/lib/Support/APInt.cpp
+++ llvm/lib/Support/APInt.cpp
@@ -503,6 +503,16 @@
   return retBits;
 }
 
+Optional<uint64_t> APInt::tryZExtValue() const {
+  return (getActiveBits() <= 64) ? Optional<uint64_t>(getZExtValue())
+                                 : Optional<uint64_t>();
+}
+
+Optional<int64_t> APInt::trySExtValue() const {
+  return (getActiveBits() <= 64) ? Optional<int64_t>(getSExtValue())
+                                 : Optional<int64_t>();
+}
+
 unsigned APInt::getSufficientBitsNeeded(StringRef Str, uint8_t Radix) {
   assert(!Str.empty() && "Invalid string length");
   size_t StrLen = Str.size();
Index: llvm/include/llvm/ADT/APInt.h
===================================================================
--- llvm/include/llvm/ADT/APInt.h
+++ llvm/include/llvm/ADT/APInt.h
@@ -1491,6 +1491,13 @@
     return U.pVal[0];
   }
 
+  /// Get zero extended value if possible
+  ///
+  /// This method attempts to return the value of this APInt as a zero extended
+  /// uint64_t. The bitwidth must be <= 64 or the value must fit within a
+  /// uint64_t. Otherwise no value is returned.
+  Optional<uint64_t> tryZExtValue() const;
+
   /// Get sign extended value
   ///
   /// This method attempts to return the value of this APInt as a sign extended
@@ -1503,6 +1510,13 @@
     return int64_t(U.pVal[0]);
   }
 
+  /// Get sign extended value if possible
+  ///
+  /// This method attempts to return the value of this APInt as a zero extended
+  /// int64_t. The bitwidth must be <= 64 or the value must fit within an
+  /// int64_t. Otherwise no value is returned.
+  Optional<int64_t> trySExtValue() const;
+
   /// Get bits required for string value.
   ///
   /// This method determines how many bits are required to hold the APInt


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139683.481482.patch
Type: text/x-patch
Size: 2532 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221209/b91c8439/attachment.bin>


More information about the llvm-commits mailing list