mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-28 08:16:05 +00:00
[ConstantRange] Add ushl_sat()
/sshl_sat()
methods.
Summary: To be used in `ConstantRange::shlWithNoOverflow()`, may in future be useful for when saturating shift/mul ops are added. Unlike `ConstantRange::shl()`, these are precise. Reviewers: nikic, spatel, reames Reviewed By: nikic Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69960
This commit is contained in:
parent
d771b3fb3e
commit
86394fcb63
@ -434,6 +434,14 @@ public:
|
||||
/// Perform a signed saturating subtraction of two constant ranges.
|
||||
ConstantRange ssub_sat(const ConstantRange &Other) const;
|
||||
|
||||
/// Perform an unsigned saturating left shift of this constant range by a
|
||||
/// value in \p Other.
|
||||
ConstantRange ushl_sat(const ConstantRange &Other) const;
|
||||
|
||||
/// Perform a signed saturating left shift of this constant range by a
|
||||
/// value in \p Other.
|
||||
ConstantRange sshl_sat(const ConstantRange &Other) const;
|
||||
|
||||
/// Return a new range that is the logical not of the current set.
|
||||
ConstantRange inverse() const;
|
||||
|
||||
|
@ -1333,6 +1333,26 @@ ConstantRange ConstantRange::ssub_sat(const ConstantRange &Other) const {
|
||||
return getNonEmpty(std::move(NewL), std::move(NewU));
|
||||
}
|
||||
|
||||
ConstantRange ConstantRange::ushl_sat(const ConstantRange &Other) const {
|
||||
if (isEmptySet() || Other.isEmptySet())
|
||||
return getEmpty();
|
||||
|
||||
APInt NewL = getUnsignedMin().ushl_sat(Other.getUnsignedMin());
|
||||
APInt NewU = getUnsignedMax().ushl_sat(Other.getUnsignedMax()) + 1;
|
||||
return getNonEmpty(std::move(NewL), std::move(NewU));
|
||||
}
|
||||
|
||||
ConstantRange ConstantRange::sshl_sat(const ConstantRange &Other) const {
|
||||
if (isEmptySet() || Other.isEmptySet())
|
||||
return getEmpty();
|
||||
|
||||
APInt Min = getSignedMin(), Max = getSignedMax();
|
||||
APInt ShAmtMin = Other.getUnsignedMin(), ShAmtMax = Other.getUnsignedMax();
|
||||
APInt NewL = Min.sshl_sat(isAllNonNegative() ? ShAmtMin : ShAmtMax);
|
||||
APInt NewU = Max.sshl_sat(isAllNegative() ? ShAmtMin : ShAmtMax) + 1;
|
||||
return getNonEmpty(std::move(NewL), std::move(NewU));
|
||||
}
|
||||
|
||||
ConstantRange ConstantRange::inverse() const {
|
||||
if (isFullSet())
|
||||
return getEmpty();
|
||||
|
@ -2217,6 +2217,14 @@ TEST_F(ConstantRangeTest, USubSat) {
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(ConstantRangeTest, UShlSat) {
|
||||
TestUnsignedBinOpExhaustive(
|
||||
[](const ConstantRange &CR1, const ConstantRange &CR2) {
|
||||
return CR1.ushl_sat(CR2);
|
||||
},
|
||||
[](const APInt &N1, const APInt &N2) { return N1.ushl_sat(N2); });
|
||||
}
|
||||
|
||||
TEST_F(ConstantRangeTest, SAddSat) {
|
||||
TestSignedBinOpExhaustive(
|
||||
[](const ConstantRange &CR1, const ConstantRange &CR2) {
|
||||
@ -2237,6 +2245,14 @@ TEST_F(ConstantRangeTest, SSubSat) {
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(ConstantRangeTest, SShlSat) {
|
||||
TestSignedBinOpExhaustive(
|
||||
[](const ConstantRange &CR1, const ConstantRange &CR2) {
|
||||
return CR1.sshl_sat(CR2);
|
||||
},
|
||||
[](const APInt &N1, const APInt &N2) { return N1.sshl_sat(N2); });
|
||||
}
|
||||
|
||||
TEST_F(ConstantRangeTest, Abs) {
|
||||
unsigned Bits = 4;
|
||||
EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user