diff --git a/mlir/lib/Analysis/Presburger/PresburgerRelation.cpp b/mlir/lib/Analysis/Presburger/PresburgerRelation.cpp --- a/mlir/lib/Analysis/Presburger/PresburgerRelation.cpp +++ b/mlir/lib/Analysis/Presburger/PresburgerRelation.cpp @@ -300,7 +300,8 @@ canIgnoreIneq[j] = simplex.isMarkedRedundant(offset + j); simplex.rollback(snapshotBeforeIntersect); - SmallVector ineqsToProcess(totalNewSimplexInequalities); + SmallVector ineqsToProcess; + ineqsToProcess.reserve(totalNewSimplexInequalities); for (unsigned i = 0; i < totalNewSimplexInequalities; ++i) if (!canIgnoreIneq[i]) ineqsToProcess.push_back(i); diff --git a/mlir/unittests/Analysis/Presburger/PresburgerSetTest.cpp b/mlir/unittests/Analysis/Presburger/PresburgerSetTest.cpp --- a/mlir/unittests/Analysis/Presburger/PresburgerSetTest.cpp +++ b/mlir/unittests/Analysis/Presburger/PresburgerSetTest.cpp @@ -746,3 +746,21 @@ /*trueVolume=*/{}, /*resultBound=*/{}); } + +TEST(SetTest, subtractOutputSizeRegression) { + PresburgerSet set1 = + parsePresburgerSetFromPolyStrings(1, {"(i) : (i >= 0, 10 - i >= 0)"}); + PresburgerSet set2 = + parsePresburgerSetFromPolyStrings(1, {"(i) : (i - 5 >= 0)"}); + + PresburgerSet set3 = + parsePresburgerSetFromPolyStrings(1, {"(i) : (i >= 0, 4 - i >= 0)"}); + + PresburgerSet result = set1.subtract(set2); + + EXPECT_TRUE(result.isEqual(set3)); + + // Previously, the subtraction result was producing an extra empty set, which + // is correct, but bad for output size. + EXPECT_EQ(result.getNumDisjuncts(), 1u); +}