zsrkmyn wrote: Ah, by applying the patch below, I just found the lower bound is still not optimal for non-wrapped cases. E.g., for 4-bit ints, given 2 ranges,
``` [0011, 1111] [1101, 1111] ``` the optimal lower bound is 1, while the algorithm gives 0. ```diff diff --git a/llvm/unittests/IR/ConstantRangeTest.cpp b/llvm/unittests/IR/ConstantRangeTest.cpp index e1d9b3e387b2..74a49e6842cb 100644 --- a/llvm/unittests/IR/ConstantRangeTest.cpp +++ b/llvm/unittests/IR/ConstantRangeTest.cpp @@ -112,6 +112,10 @@ bool PreferSmallestNonFullSigned(const ConstantRange &CR1, return PreferSmallestSigned(CR1, CR2); } +bool PreferSmallerLowerBound(const ConstantRange &CR1, const ConstantRange &CR2) { + return CR1.getLower().ult(CR2.getLower()); +} + testing::AssertionResult rangeContains(const ConstantRange &CR, const APInt &N, ArrayRef<ConstantRange> Inputs) { if (CR.contains(N)) @@ -2726,6 +2730,13 @@ TEST_F(ConstantRangeTest, binaryAnd) { }, [](const APInt &N1, const APInt &N2) { return N1 & N2; }, PreferSmallest, CheckSingleElementsOnly); + + TestBinaryOpExhaustive( + [](const ConstantRange &CR1, const ConstantRange &CR2) { + return CR1.binaryAnd(CR2); + }, + [](const APInt &N1, const APInt &N2) { return N1 & N2; }, + PreferSmallerLowerBound, CheckNonWrappedOnly); } TEST_F(ConstantRangeTest, binaryOr) { ``` https://github.com/llvm/llvm-project/pull/120352 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits