[PATCH] D111241: [APInt] Fix isAllOnes and extractBits for zero width values.
Chris Lattner via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 6 12:37:48 PDT 2021
lattner updated this revision to Diff 377642.
lattner added a comment.
use EXPECT_TRUE as Jay points out
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111241/new/
https://reviews.llvm.org/D111241
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
@@ -2948,6 +2948,7 @@
// Methods like getLowBitsSet work with zero bits.
EXPECT_EQ(0U, APInt::getLowBitsSet(0, 0).getBitWidth());
EXPECT_EQ(0U, APInt::getSplat(0, ZW).getBitWidth());
+ EXPECT_EQ(0U, APInt(4, 10).extractBits(0, 2).getBitWidth());
// Logical operators.
ZW |= ZW2;
@@ -2990,6 +2991,7 @@
EXPECT_EQ(0U, ZW.getLoBits(0).getBitWidth());
EXPECT_EQ(0, ZW.zext(4));
EXPECT_EQ(0U, APInt(4, 3).trunc(0).getBitWidth());
+ EXPECT_TRUE(ZW.isAllOnes());
SmallString<42> STR;
ZW.toStringUnsigned(STR);
Index: llvm/lib/Support/APInt.cpp
===================================================================
--- llvm/lib/Support/APInt.cpp
+++ llvm/lib/Support/APInt.cpp
@@ -444,7 +444,6 @@
}
APInt APInt::extractBits(unsigned numBits, unsigned bitPosition) const {
- assert(numBits > 0 && "Can't extract zero bits");
assert(bitPosition < BitWidth && (numBits + bitPosition) <= BitWidth &&
"Illegal bit extraction");
Index: llvm/include/llvm/ADT/APInt.h
===================================================================
--- llvm/include/llvm/ADT/APInt.h
+++ llvm/include/llvm/ADT/APInt.h
@@ -343,14 +343,12 @@
/// \returns true if this APInt is non-positive.
bool isNonPositive() const { return !isStrictlyPositive(); }
- /// Determine if all bits are set.
+ /// Determine if all bits are set. This is true for zero-width values.
bool isAllOnes() const {
- if (isSingleWord()) {
- // Calculate the shift amount, handling the zero-bit wide case without UB.
- unsigned ShiftAmt =
- (APINT_BITS_PER_WORD - BitWidth) % APINT_BITS_PER_WORD;
- return U.VAL == WORDTYPE_MAX >> ShiftAmt;
- }
+ if (BitWidth == 0)
+ return true;
+ if (isSingleWord())
+ return U.VAL == WORDTYPE_MAX >> (APINT_BITS_PER_WORD - BitWidth);
return countTrailingOnesSlowCase() == BitWidth;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111241.377642.patch
Type: text/x-patch
Size: 2065 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211006/0e2c7f07/attachment.bin>
More information about the llvm-commits
mailing list