aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/APIntTest.cpp
diff options
context:
space:
mode:
authorJay Foad <jay.foad@amd.com>2021-10-06 09:49:51 +0100
committerJay Foad <jay.foad@amd.com>2022-05-14 09:54:24 +0100
commit169ae6db69882605a69e184237640f0c557243ee (patch)
tree90405959572d3e8d747182b5790ef3ce15bd897d /llvm/unittests/ADT/APIntTest.cpp
parent1ecc3d86ae3eeb43336c27c4d653e06236b918a2 (diff)
downloadllvm-169ae6db69882605a69e184237640f0c557243ee.zip
llvm-169ae6db69882605a69e184237640f0c557243ee.tar.gz
llvm-169ae6db69882605a69e184237640f0c557243ee.tar.bz2
[APInt] Allow extending and truncating to the same width
Allow zext, sext, trunc, truncUSat and truncSSat to extend or truncate to the same bit width, which is a no-op. Disallowing this forced clients to use workarounds like using zextOrTrunc (even though they never wanted truncation) or zextOrSelf (even though they did not want its strange behaviour of allowing a *smaller* bit width, which is also treated as a no-op). Differential Revision: https://reviews.llvm.org/D125556
Diffstat (limited to 'llvm/unittests/ADT/APIntTest.cpp')
-rw-r--r--llvm/unittests/ADT/APIntTest.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/unittests/ADT/APIntTest.cpp b/llvm/unittests/ADT/APIntTest.cpp
index ec3d5f8..aca4a9a 100644
--- a/llvm/unittests/ADT/APIntTest.cpp
+++ b/llvm/unittests/ADT/APIntTest.cpp
@@ -1181,18 +1181,22 @@ TEST(APIntTest, SaturatingMath) {
APInt AP_100 = APInt(8, 100);
APInt AP_200 = APInt(8, 200);
+ EXPECT_EQ(APInt(8, 100), AP_100.truncUSat(8));
EXPECT_EQ(APInt(7, 100), AP_100.truncUSat(7));
EXPECT_EQ(APInt(6, 63), AP_100.truncUSat(6));
EXPECT_EQ(APInt(5, 31), AP_100.truncUSat(5));
+ EXPECT_EQ(APInt(8, 200), AP_200.truncUSat(8));
EXPECT_EQ(APInt(7, 127), AP_200.truncUSat(7));
EXPECT_EQ(APInt(6, 63), AP_200.truncUSat(6));
EXPECT_EQ(APInt(5, 31), AP_200.truncUSat(5));
+ EXPECT_EQ(APInt(8, 42), AP_42.truncSSat(8));
EXPECT_EQ(APInt(7, 42), AP_42.truncSSat(7));
EXPECT_EQ(APInt(6, 31), AP_42.truncSSat(6));
EXPECT_EQ(APInt(5, 15), AP_42.truncSSat(5));
+ EXPECT_EQ(APInt(8, -56), AP_200.truncSSat(8));
EXPECT_EQ(APInt(7, -56), AP_200.truncSSat(7));
EXPECT_EQ(APInt(6, -32), AP_200.truncSSat(6));
EXPECT_EQ(APInt(5, -16), AP_200.truncSSat(5));
@@ -2637,23 +2641,28 @@ TEST(APIntTest, sext) {
EXPECT_EQ(~uint64_t(0), APInt(1, 1).sext(64));
APInt i32_max(APInt::getSignedMaxValue(32).sext(63));
+ EXPECT_EQ(i32_max, i32_max.sext(63));
EXPECT_EQ(32U, i32_max.countLeadingZeros());
EXPECT_EQ(0U, i32_max.countTrailingZeros());
EXPECT_EQ(31U, i32_max.countPopulation());
APInt i32_min(APInt::getSignedMinValue(32).sext(63));
+ EXPECT_EQ(i32_min, i32_min.sext(63));
EXPECT_EQ(32U, i32_min.countLeadingOnes());
EXPECT_EQ(31U, i32_min.countTrailingZeros());
EXPECT_EQ(32U, i32_min.countPopulation());
APInt i32_neg1(APInt(32, ~uint64_t(0)).sext(63));
+ EXPECT_EQ(i32_neg1, i32_neg1.sext(63));
EXPECT_EQ(63U, i32_neg1.countLeadingOnes());
EXPECT_EQ(0U, i32_neg1.countTrailingZeros());
EXPECT_EQ(63U, i32_neg1.countPopulation());
}
-TEST(APIntTest, truncOrSelf) {
+TEST(APIntTest, trunc) {
APInt val(32, 0xFFFFFFFF);
+ EXPECT_EQ(0xFFFF, val.trunc(16));
+ EXPECT_EQ(0xFFFFFFFF, val.trunc(32));
EXPECT_EQ(0xFFFF, val.truncOrSelf(16));
EXPECT_EQ(0xFFFFFFFF, val.truncOrSelf(32));
EXPECT_EQ(0xFFFFFFFF, val.truncOrSelf(64));