[ConstantRange] Support zero size in isSizeLargerThan()
authorNikita Popov <nikita.ppv@gmail.com>
Sun, 7 Nov 2021 20:21:41 +0000 (21:21 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Sun, 7 Nov 2021 20:22:45 +0000 (21:22 +0100)
From an API perspective, it does not make a lot of sense that 0
is not a valid argument to this function. Add the exact check needed
to support it.

llvm/lib/IR/ConstantRange.cpp
llvm/unittests/IR/ConstantRangeTest.cpp

index b01f5cf..bbb07bf 100644 (file)
@@ -381,11 +381,10 @@ ConstantRange::isSizeStrictlySmallerThan(const ConstantRange &Other) const {
 
 bool
 ConstantRange::isSizeLargerThan(uint64_t MaxSize) const {
-  assert(MaxSize && "MaxSize can't be 0.");
   // If this a full set, we need special handling to avoid needing an extra bit
   // to represent the size.
   if (isFullSet())
-    return APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1);
+    return MaxSize == 0 || APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1);
 
   return (Upper - Lower).ugt(MaxSize);
 }
index ac5c445..2de1ae7 100644 (file)
@@ -2594,4 +2594,15 @@ TEST_F(ConstantRangeTest, getEquivalentPredWithFlippedSignedness) {
   }
 }
 
+TEST_F(ConstantRangeTest, isSizeLargerThan) {
+  EXPECT_FALSE(Empty.isSizeLargerThan(0));
+
+  EXPECT_TRUE(Full.isSizeLargerThan(0));
+  EXPECT_TRUE(Full.isSizeLargerThan(65535));
+  EXPECT_FALSE(Full.isSizeLargerThan(65536));
+
+  EXPECT_TRUE(One.isSizeLargerThan(0));
+  EXPECT_FALSE(One.isSizeLargerThan(1));
+}
+
 } // anonymous namespace