[ConstantRange] Implement getSignedMin/Max in a less complicated and faster way

Summary: As far as I can tell we should be able to implement these almost the same way we do unsigned, but using signed comparisons and checks for min signed value instead of min unsigned value.

Reviewers: pete, davide, sanjoy

Reviewed By: davide

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D33815

llvm-svn: 305607
This commit is contained in:
Craig Topper 2017-06-16 23:26:23 +00:00
parent 288b3c9e69
commit 61e684adcc
1 changed files with 2 additions and 15 deletions

View File

@ -284,27 +284,14 @@ APInt ConstantRange::getUnsignedMin() const {
}
APInt ConstantRange::getSignedMax() const {
if (!isWrappedSet()) {
APInt UpperMinusOne = getUpper() - 1;
if (getLower().sle(UpperMinusOne))
return UpperMinusOne;
return APInt::getSignedMaxValue(getBitWidth());
}
if (getLower().isNegative() == getUpper().isNegative())
if (isFullSet() || Lower.sgt(Upper))
return APInt::getSignedMaxValue(getBitWidth());
return getUpper() - 1;
}
APInt ConstantRange::getSignedMin() const {
if (!isWrappedSet()) {
if (getLower().sle(getUpper() - 1))
return getLower();
if (isFullSet() || (Lower.sgt(Upper) && !getUpper().isMinSignedValue()))
return APInt::getSignedMinValue(getBitWidth());
}
if ((getUpper() - 1).slt(getLower())) {
if (!getUpper().isMinSignedValue())
return APInt::getSignedMinValue(getBitWidth());
}
return getLower();
}