aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2024-10-15 09:33:44 +0200
committerGitHub <noreply@github.com>2024-10-15 09:33:44 +0200
commitc180da93e0257a92b0bb428f70c1b0de083ebf72 (patch)
tree10fee0cf137a2bb24c4602c87791ec0183135830 /llvm
parent708b15413b02e5a24342898eb0e16cd905038860 (diff)
downloadllvm-c180da93e0257a92b0bb428f70c1b0de083ebf72.zip
llvm-c180da93e0257a92b0bb428f70c1b0de083ebf72.tar.gz
llvm-c180da93e0257a92b0bb428f70c1b0de083ebf72.tar.bz2
[APInt] Fix getAllOnes() with zero width (#112227)
This makes sure that APInt::getAllOnes() keeps working after the APInt constructor assertions are enabled. I'm relaxing the requirement for the signed case to either an all zeros or all ones integer. This is basically saying that we can interpret the zero-width integer as either positive or negative.
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/ADT/APInt.h21
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp1
2 files changed, 15 insertions, 7 deletions
diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h
index a42dae8..63a1385 100644
--- a/llvm/include/llvm/ADT/APInt.h
+++ b/llvm/include/llvm/ADT/APInt.h
@@ -112,14 +112,21 @@ public:
bool implicitTrunc = true)
: BitWidth(numBits) {
if (!implicitTrunc) {
- if (BitWidth == 0) {
- assert(val == 0 && "Value must be zero for 0-bit APInt");
- } else if (isSigned) {
- assert(llvm::isIntN(BitWidth, val) &&
- "Value is not an N-bit signed value");
+ if (isSigned) {
+ if (BitWidth == 0) {
+ assert((val == 0 || val == uint64_t(-1)) &&
+ "Value must be 0 or -1 for signed 0-bit APInt");
+ } else {
+ assert(llvm::isIntN(BitWidth, val) &&
+ "Value is not an N-bit signed value");
+ }
} else {
- assert(llvm::isUIntN(BitWidth, val) &&
- "Value is not an N-bit unsigned value");
+ if (BitWidth == 0) {
+ assert(val == 0 && "Value must be zero for unsigned 0-bit APInt");
+ } else {
+ assert(llvm::isUIntN(BitWidth, val) &&
+ "Value is not an N-bit unsigned value");
+ }
}
}
if (isSingleWord()) {
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index 7a9ac55..4d5553f 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -3423,6 +3423,7 @@ TEST(APIntTest, ZeroWidth) {
EXPECT_EQ(0U, ZW.getBitWidth());
EXPECT_EQ(0U, APInt(0, ArrayRef<uint64_t>({0, 1, 2})).getBitWidth());
EXPECT_EQ(0U, APInt(0, "0", 10).getBitWidth());
+ EXPECT_EQ(0U, APInt::getAllOnes(0).getBitWidth());
// Default constructor is single bit wide.
EXPECT_EQ(1U, APInt().getBitWidth());