diff options
| author | Jay Foad <jay.foad@amd.com> | 2021-10-06 09:49:51 +0100 | 
|---|---|---|
| committer | Jay Foad <jay.foad@amd.com> | 2022-05-14 09:54:24 +0100 | 
| commit | 169ae6db69882605a69e184237640f0c557243ee (patch) | |
| tree | 90405959572d3e8d747182b5790ef3ce15bd897d /llvm/unittests/ADT/APIntTest.cpp | |
| parent | 1ecc3d86ae3eeb43336c27c4d653e06236b918a2 (diff) | |
| download | llvm-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.cpp | 11 | 
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)); | 
