summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2017-01-24 08:32:59 +0000
committerpatrick <patrick@openbsd.org>2017-01-24 08:32:59 +0000
commit53d771aafdbe5b919f264f53cba3788e2c4cffd2 (patch)
tree7eca39498be0ff1e3a6daf583cd9ca5886bb2636 /gnu/llvm/unittests/IR/ConstantRangeTest.cpp
parentIn preparation of compiling our kernels with -ffreestanding, explicitly map (diff)
downloadwireguard-openbsd-53d771aafdbe5b919f264f53cba3788e2c4cffd2.tar.xz
wireguard-openbsd-53d771aafdbe5b919f264f53cba3788e2c4cffd2.zip
Import LLVM 4.0.0 rc1 including clang and lld to help the current
development effort on OpenBSD/arm64.
Diffstat (limited to 'gnu/llvm/unittests/IR/ConstantRangeTest.cpp')
-rw-r--r--gnu/llvm/unittests/IR/ConstantRangeTest.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/gnu/llvm/unittests/IR/ConstantRangeTest.cpp b/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
index f7a8a82043b..58fd04448e2 100644
--- a/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
+++ b/gnu/llvm/unittests/IR/ConstantRangeTest.cpp
@@ -102,10 +102,19 @@ TEST_F(ConstantRangeTest, Equality) {
TEST_F(ConstantRangeTest, SingleElement) {
EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(nullptr));
EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
+ EXPECT_EQ(Full.getSingleMissingElement(), static_cast<APInt *>(nullptr));
+ EXPECT_EQ(Empty.getSingleMissingElement(), static_cast<APInt *>(nullptr));
+
EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
+ EXPECT_EQ(One.getSingleMissingElement(), static_cast<APInt *>(nullptr));
+ EXPECT_EQ(Some.getSingleMissingElement(), static_cast<APInt *>(nullptr));
+
+ ConstantRange OneInverse = One.inverse();
+ EXPECT_EQ(*OneInverse.getSingleMissingElement(), *One.getSingleElement());
+
EXPECT_FALSE(Full.isSingleElement());
EXPECT_FALSE(Empty.isSingleElement());
EXPECT_TRUE(One.isSingleElement());
@@ -348,6 +357,32 @@ TEST_F(ConstantRangeTest, Add) {
ConstantRange(APInt(16, 0xe)));
}
+TEST_F(ConstantRangeTest, AddWithNoSignedWrap) {
+ EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, 1)), Empty);
+ EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, 1)),
+ ConstantRange(APInt(16, INT16_MIN+1), APInt(16, INT16_MIN)));
+ EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, 10)),
+ ConstantRange(APInt(8, -40), APInt(8, 60)));
+ EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 120)).addWithNoSignedWrap(APInt(8, 10)),
+ ConstantRange(APInt(8, -40), APInt(8, INT8_MIN)));
+ EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10)).addWithNoSignedWrap(APInt(8, 5)),
+ ConstantRange(APInt(8, 125), APInt(8, -5)));
+ EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, 10)),
+ ConstantRange(APInt(8, INT8_MIN+10), APInt(8, -110)));
+
+ EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, -1)), Empty);
+ EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, -1)),
+ ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
+ EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
+ ConstantRange(APInt(8, -60), APInt(8, 40)));
+ EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
+ ConstantRange(APInt(8, INT8_MIN), APInt(8, 40)));
+ EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -5)),
+ ConstantRange(APInt(8, 115), APInt(8, -125)));
+ EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -10)),
+ ConstantRange(APInt(8, 110), APInt(8, INT8_MIN-10)));
+}
+
TEST_F(ConstantRangeTest, Sub) {
EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
EXPECT_EQ(Full.sub(Full), Full);
@@ -760,6 +795,42 @@ TEST(ConstantRange, GetEquivalentICmp) {
EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
APInt::getMinValue(32) + APInt(32, 100))
.getEquivalentICmp(Pred, RHS));
+
+ EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
+ EXPECT_EQ(RHS, APInt(32, 100));
+
+ EXPECT_TRUE(
+ ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_NE);
+ EXPECT_EQ(RHS, APInt(32, 100));
+
+ EXPECT_TRUE(
+ ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_NE);
+ EXPECT_EQ(RHS, APInt(512, 100));
+
+ // NB! It would be correct for the following four calls to getEquivalentICmp
+ // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
+ // However, that's not the case today.
+
+ EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
+ EXPECT_EQ(RHS, APInt(32, 0));
+
+ EXPECT_TRUE(
+ ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_NE);
+ EXPECT_EQ(RHS, APInt(32, 0));
+
+ EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
+ EXPECT_EQ(RHS, APInt(32, -1));
+
+ EXPECT_TRUE(
+ ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
+ EXPECT_EQ(Pred, CmpInst::ICMP_NE);
+ EXPECT_EQ(RHS, APInt(32, -1));
}
} // anonymous namespace