summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/IR/ConstantRangeTest.cpp
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-10-02 20:59:05 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-10-02 20:59:05 +0000
commitc7d3291b681eab4c01fd0d1ccda37698076d30a6 (patch)
tree2e08e0967ef6937fb3d857e3b621042d1715da0d /llvm/unittests/IR/ConstantRangeTest.cpp
parentbce1f6b49196e174f299e577a42151e2adbf49d8 (diff)
downloadbcm5719-llvm-c7d3291b681eab4c01fd0d1ccda37698076d30a6.tar.gz
bcm5719-llvm-c7d3291b681eab4c01fd0d1ccda37698076d30a6.zip
[ConstantRange] Make getEquivalentICmp smarter
This change teaches getEquivalentICmp to be smarter about generating ICMP_NE and ICMP_EQ predicates. An earlier version of this change was landed as rL283057 which had a use-after-free bug. This new version has a fix for that bug, and a (C++ unittests/) test case that would have triggered it rL283057. llvm-svn: 283078
Diffstat (limited to 'llvm/unittests/IR/ConstantRangeTest.cpp')
-rw-r--r--llvm/unittests/IR/ConstantRangeTest.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp
index f7a8a82043b..b890a4a0bc4 100644
--- a/llvm/unittests/IR/ConstantRangeTest.cpp
+++ b/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());
@@ -760,6 +769,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
OpenPOWER on IntegriCloud