diff options
author | Florian Hahn <flo@fhahn.com> | 2020-04-01 09:34:33 +0100 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2020-04-01 09:50:24 +0100 |
commit | d307174e1d9e66a9e5a1e936ac3736343c3fe381 (patch) | |
tree | 03552b7bdfed5022701992e3e312074fbb4b390d /llvm/lib/IR/ConstantRange.cpp | |
parent | 08a53dba93389a9859c12e948d8281a839cffbdb (diff) | |
download | llvm-d307174e1d9e66a9e5a1e936ac3736343c3fe381.zip llvm-d307174e1d9e66a9e5a1e936ac3736343c3fe381.tar.gz llvm-d307174e1d9e66a9e5a1e936ac3736343c3fe381.tar.bz2 |
[ConstantRange] Use APInt::or/APInt::and for single elements.
Currently ConstantRange::binaryAnd/binaryOr results are too pessimistic
for single element constant ranges.
If both operands are single element ranges, we can use APInt's AND and
OR implementations directly.
Note that some other binary operations on constant ranges can cover the
single element cases naturally, but for OR and AND this unfortunately is
not the case.
Reviewers: nikic, spatel, lebedev.ri
Reviewed By: spatel
Differential Revision: https://reviews.llvm.org/D76446
Diffstat (limited to 'llvm/lib/IR/ConstantRange.cpp')
-rw-r--r-- | llvm/lib/IR/ConstantRange.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp index b8c5753..eabaaa2 100644 --- a/llvm/lib/IR/ConstantRange.cpp +++ b/llvm/lib/IR/ConstantRange.cpp @@ -1196,6 +1196,10 @@ ConstantRange::binaryAnd(const ConstantRange &Other) const { if (isEmptySet() || Other.isEmptySet()) return getEmpty(); + // Use APInt's implementation of AND for single element ranges. + if (isSingleElement() && Other.isSingleElement()) + return {*getSingleElement() & *Other.getSingleElement()}; + // TODO: replace this with something less conservative APInt umin = APIntOps::umin(Other.getUnsignedMax(), getUnsignedMax()); @@ -1207,6 +1211,10 @@ ConstantRange::binaryOr(const ConstantRange &Other) const { if (isEmptySet() || Other.isEmptySet()) return getEmpty(); + // Use APInt's implementation of OR for single element ranges. + if (isSingleElement() && Other.isSingleElement()) + return {*getSingleElement() | *Other.getSingleElement()}; + // TODO: replace this with something less conservative APInt umax = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin()); |