summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Support/APInt.cpp8
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp30
2 files changed, 32 insertions, 6 deletions
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp
index fb8b45166a4..bc3e4b2666b 100644
--- a/llvm/lib/Support/APInt.cpp
+++ b/llvm/lib/Support/APInt.cpp
@@ -440,13 +440,12 @@ APInt& APInt::operator^=(const APInt& RHS) {
assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
if (isSingleWord()) {
VAL ^= RHS.VAL;
- this->clearUnusedBits();
return *this;
}
unsigned numWords = getNumWords();
for (unsigned i = 0; i < numWords; ++i)
pVal[i] ^= RHS.pVal[i];
- return clearUnusedBits();
+ return *this;
}
APInt APInt::AndSlowCase(const APInt& RHS) const {
@@ -471,10 +470,7 @@ APInt APInt::XorSlowCase(const APInt& RHS) const {
for (unsigned i = 0; i < numWords; ++i)
val[i] = pVal[i] ^ RHS.pVal[i];
- APInt Result(val, getBitWidth());
- // 0^0==1 so clear the high bits in case they got set.
- Result.clearUnusedBits();
- return Result;
+ return APInt(val, getBitWidth());
}
APInt APInt::operator*(const APInt& RHS) const {
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index cbffdc096fb..ac6d9ba5891 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -158,6 +158,36 @@ TEST(APIntTest, i1) {
EXPECT_EQ(two, one - neg_one);
EXPECT_EQ(zero, one - one);
+ // And
+ EXPECT_EQ(zero, zero & zero);
+ EXPECT_EQ(zero, one & zero);
+ EXPECT_EQ(zero, zero & one);
+ EXPECT_EQ(one, one & one);
+ EXPECT_EQ(zero, zero & zero);
+ EXPECT_EQ(zero, neg_one & zero);
+ EXPECT_EQ(zero, zero & neg_one);
+ EXPECT_EQ(neg_one, neg_one & neg_one);
+
+ // Or
+ EXPECT_EQ(zero, zero | zero);
+ EXPECT_EQ(one, one | zero);
+ EXPECT_EQ(one, zero | one);
+ EXPECT_EQ(one, one | one);
+ EXPECT_EQ(zero, zero | zero);
+ EXPECT_EQ(neg_one, neg_one | zero);
+ EXPECT_EQ(neg_one, zero | neg_one);
+ EXPECT_EQ(neg_one, neg_one | neg_one);
+
+ // Xor
+ EXPECT_EQ(zero, zero ^ zero);
+ EXPECT_EQ(one, one ^ zero);
+ EXPECT_EQ(one, zero ^ one);
+ EXPECT_EQ(zero, one ^ one);
+ EXPECT_EQ(zero, zero ^ zero);
+ EXPECT_EQ(neg_one, neg_one ^ zero);
+ EXPECT_EQ(neg_one, zero ^ neg_one);
+ EXPECT_EQ(zero, neg_one ^ neg_one);
+
// Shifts.
EXPECT_EQ(zero, one << one);
EXPECT_EQ(one, one << zero);
OpenPOWER on IntegriCloud