[llvm] Add ConstantRangeList::subtract(ConstantRange) (PR #97093)
Jan Voung via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 28 12:28:44 PDT 2024
================
@@ -101,6 +101,50 @@ ConstantRangeList GetCRL(ArrayRef<std::pair<APInt, APInt>> Pairs) {
return ConstantRangeList(Ranges);
}
+TEST_F(ConstantRangeListTest, Subtract) {
+ APInt AP0 = APInt(64, 0, /*isSigned=*/true);
+ APInt AP2 = APInt(64, 2, /*isSigned=*/true);
+ APInt AP3 = APInt(64, 3, /*isSigned=*/true);
+ APInt AP4 = APInt(64, 4, /*isSigned=*/true);
+ APInt AP8 = APInt(64, 8, /*isSigned=*/true);
+ APInt AP10 = APInt(64, 10, /*isSigned=*/true);
+ APInt AP11 = APInt(64, 11, /*isSigned=*/true);
+ APInt AP12 = APInt(64, 12, /*isSigned=*/true);
+ ConstantRangeList CRL = GetCRL({{AP0, AP4}, {AP8, AP12}});
+
+ // Execute ConstantRangeList::subtract(ConstantRange) and check the result
+ // is expected. Pass "CRL" by value so that subtract() does not affect the
+ // argument in caller.
+ auto SubtractAndCheck = [](ConstantRangeList CRL,
+ const std::pair<int64_t, int64_t> &Range,
+ const ConstantRangeList &ExpectedCRL) {
+ CRL.subtract(Range.first, Range.second);
+ EXPECT_EQ(CRL, ExpectedCRL);
+ };
+
+ // No overlap
+ SubtractAndCheck(CRL, {-4, 0}, CRL);
+ SubtractAndCheck(CRL, {4, 8}, CRL);
+ SubtractAndCheck(CRL, {12, 16}, CRL);
+
+ // Overlap (left or right)
+ SubtractAndCheck(CRL, {-4, 2}, GetCRL({{AP2, AP4}, {AP8, AP12}}));
+ SubtractAndCheck(CRL, {-4, 4}, GetCRL({{AP8, AP12}}));
+ SubtractAndCheck(CRL, {-4, 8}, GetCRL({{AP8, AP12}}));
+ SubtractAndCheck(CRL, {10, 16}, GetCRL({{AP0, AP4}, {AP8, AP10}}));
+ SubtractAndCheck(CRL, {8, 16}, GetCRL({{AP0, AP4}}));
+ SubtractAndCheck(CRL, {6, 16}, GetCRL({{AP0, AP4}}));
----------------
jvoung wrote:
maybe try touching at the other ends like {0, X} and {X, 12} too
(vs {X, 4} and {8, X})?
https://github.com/llvm/llvm-project/pull/97093
More information about the llvm-commits
mailing list