summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/unittests/IR/ConstantRangeTest.cpp')
-rw-r--r--gnu/llvm/unittests/IR/ConstantRangeTest.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/gnu/llvm/unittests/IR/ConstantRangeTest.cpp b/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
index 0292f60fe33..351256d4993 100644
--- a/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
+++ b/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
@@ -606,6 +606,33 @@ TEST_F(ConstantRangeTest, Lshr) {
EXPECT_EQ(Wrap.lshr(Wrap), Full);
}
+TEST_F(ConstantRangeTest, Ashr) {
+ EXPECT_EQ(Full.ashr(Full), Full);
+ EXPECT_EQ(Full.ashr(Empty), Empty);
+ EXPECT_EQ(Full.ashr(One), ConstantRange(APInt(16, 0xffe0),
+ APInt(16, (0x7fff >> 0xa) + 1 )));
+ ConstantRange Small(APInt(16, 0xa), APInt(16, 0xb));
+ EXPECT_EQ(Full.ashr(Small), ConstantRange(APInt(16, 0xffe0),
+ APInt(16, (0x7fff >> 0xa) + 1 )));
+ EXPECT_EQ(Full.ashr(Some), ConstantRange(APInt(16, 0xffe0),
+ APInt(16, (0x7fff >> 0xa) + 1 )));
+ EXPECT_EQ(Full.ashr(Wrap), Full);
+ EXPECT_EQ(Empty.ashr(Empty), Empty);
+ EXPECT_EQ(Empty.ashr(One), Empty);
+ EXPECT_EQ(Empty.ashr(Some), Empty);
+ EXPECT_EQ(Empty.ashr(Wrap), Empty);
+ EXPECT_EQ(One.ashr(One), ConstantRange(APInt(16, 0)));
+ EXPECT_EQ(One.ashr(Some), ConstantRange(APInt(16, 0)));
+ EXPECT_EQ(One.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
+ EXPECT_EQ(Some.ashr(Some), ConstantRange(APInt(16, 0),
+ APInt(16, (0xaaa >> 0xa) + 1)));
+ EXPECT_EQ(Some.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
+ EXPECT_EQ(Wrap.ashr(Wrap), Full);
+ ConstantRange Neg(APInt(16, 0xf3f0, true), APInt(16, 0xf7f8, true));
+ EXPECT_EQ(Neg.ashr(Small), ConstantRange(APInt(16, 0xfffc, true),
+ APInt(16, 0xfffe, true)));
+}
+
TEST(ConstantRange, MakeAllowedICmpRegion) {
// PR8250
ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
@@ -715,24 +742,102 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
}
}
+ for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
+ APInt C(4, Const, true /* = isSigned */);
+
+ auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, C, OBO::NoUnsignedWrap);
+
+ EXPECT_FALSE(NUWRegion.isEmptySet());
+
+ auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, C, OBO::NoSignedWrap);
+
+ EXPECT_FALSE(NSWRegion.isEmptySet());
+
+ auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap);
+
+ EXPECT_FALSE(NoWrapRegion.isEmptySet());
+ EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion));
+
+ for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
+ ++I) {
+ bool Overflow = false;
+ (void)I.usub_ov(C, Overflow);
+ EXPECT_FALSE(Overflow);
+ }
+
+ for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
+ ++I) {
+ bool Overflow = false;
+ (void)I.ssub_ov(C, Overflow);
+ EXPECT_FALSE(Overflow);
+ }
+
+ for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E;
+ ++I) {
+ bool Overflow = false;
+
+ (void)I.ssub_ov(C, Overflow);
+ EXPECT_FALSE(Overflow);
+
+ (void)I.usub_ov(C, Overflow);
+ EXPECT_FALSE(Overflow);
+ }
+ }
+
auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
OBO::NoSignedWrap);
EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
NSWForAllValues.getSingleElement()->isMinValue());
+ NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
+ OBO::NoSignedWrap);
+ EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
+ NSWForAllValues.getSingleElement()->isMaxValue());
+
auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
OBO::NoUnsignedWrap);
EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
NUWForAllValues.getSingleElement()->isMinValue());
+ NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
+ OBO::NoUnsignedWrap);
+ EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
+ NUWForAllValues.getSingleElement()->isMaxValue());
+
auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
OBO::NoUnsignedWrap | OBO::NoSignedWrap);
EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
NUWAndNSWForAllValues.getSingleElement()->isMinValue());
+ NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
+ OBO::NoUnsignedWrap | OBO::NoSignedWrap);
+ EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
+ NUWAndNSWForAllValues.getSingleElement()->isMaxValue());
+
+ EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Add, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
+ EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Add, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
+ EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Add, APInt(32, 0),
+ OBO::NoUnsignedWrap | OBO::NoSignedWrap).isFullSet());
+ EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
+ EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
+ EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, APInt(32, 0),
+ OBO::NoUnsignedWrap | OBO::NoSignedWrap).isFullSet());
+
ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
Instruction::Add, OneToFive, OBO::NoSignedWrap),
@@ -745,6 +850,17 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
ConstantRange::makeGuaranteedNoWrapRegion(
Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, OneToFive, OBO::NoSignedWrap),
+ ConstantRange(APInt::getSignedMinValue(32) + 5,
+ APInt::getSignedMinValue(32)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, OneToFive, OBO::NoUnsignedWrap),
+ ConstantRange(APInt::getMinValue(32) + 5, APInt::getMinValue(32)));
+ EXPECT_EQ(
+ ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
+ ConstantRange(APInt::getMinValue(32) + 5, APInt::getSignedMinValue(32)));
ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
@@ -758,6 +874,19 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
Instruction::Add, MinusFiveToMinusTwo,
OBO::NoUnsignedWrap | OBO::NoSignedWrap),
ConstantRange(APInt(32, 0), APInt(32, 2)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, MinusFiveToMinusTwo, OBO::NoSignedWrap),
+ ConstantRange(APInt::getSignedMinValue(32),
+ APInt::getSignedMaxValue(32) - 4));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
+ ConstantRange(APInt::getMaxValue(32) - 1,
+ APInt::getMinValue(32)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, MinusFiveToMinusTwo,
+ OBO::NoUnsignedWrap | OBO::NoSignedWrap),
+ ConstantRange(APInt::getMaxValue(32) - 1,
+ APInt::getMinValue(32)));
ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
@@ -771,6 +900,43 @@ TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
Instruction::Add, MinusOneToOne,
OBO::NoUnsignedWrap | OBO::NoSignedWrap),
ConstantRange(APInt(32, 0), APInt(32, 1)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, MinusOneToOne, OBO::NoSignedWrap),
+ ConstantRange(APInt::getSignedMinValue(32) + 1,
+ APInt::getSignedMinValue(32) - 1));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, MinusOneToOne, OBO::NoUnsignedWrap),
+ ConstantRange(APInt::getMaxValue(32),
+ APInt::getMinValue(32)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, MinusOneToOne,
+ OBO::NoUnsignedWrap | OBO::NoSignedWrap),
+ ConstantRange(APInt::getMaxValue(32),
+ APInt::getMinValue(32)));
+
+ ConstantRange One(APInt(32, 1), APInt(32, 2));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Add, One, OBO::NoSignedWrap),
+ ConstantRange(APInt::getSignedMinValue(32),
+ APInt::getSignedMaxValue(32)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Add, One, OBO::NoUnsignedWrap),
+ ConstantRange(APInt::getMinValue(32), APInt::getMaxValue(32)));
+ EXPECT_EQ(
+ ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Add, One, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
+ ConstantRange(APInt(32, 0), APInt::getSignedMaxValue(32)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, One, OBO::NoSignedWrap),
+ ConstantRange(APInt::getSignedMinValue(32) + 1,
+ APInt::getSignedMinValue(32)));
+ EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, One, OBO::NoUnsignedWrap),
+ ConstantRange(APInt::getMinValue(32) + 1, APInt::getMinValue(32)));
+ EXPECT_EQ(
+ ConstantRange::makeGuaranteedNoWrapRegion(
+ Instruction::Sub, One, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
+ ConstantRange(APInt::getMinValue(32) + 1, APInt::getSignedMinValue(32)));
}
TEST(ConstantRange, GetEquivalentICmp) {