[ConstantRange] Optimize APInt creation in getSignedMax/getSignedMin.

We were creating an APInt at the top of these methods that isn't always returned. For ranges wider than 64-bits this results in an allocation and deallocation when its not used.

In getSignedMax we were creating Upper-1 to use in a compare and then creating it again for a return value. The compiler is unable to determine that these can be shared. So help it out and create the Upper-1 in a temporary that can be reused.

This provides a little compile time improvement.

llvm-svn: 300621
This commit is contained in:
Craig Topper 2017-04-18 23:02:39 +00:00
parent 6a470bcb6d
commit 88c64f324f
1 changed files with 8 additions and 8 deletions

View File

@ -281,25 +281,25 @@ APInt ConstantRange::getUnsignedMin() const {
APInt ConstantRange::getSignedMax() const {
APInt SignedMax(APInt::getSignedMaxValue(getBitWidth()));
if (!isWrappedSet()) {
if (getLower().sle(getUpper() - 1))
return getUpper() - 1;
return SignedMax;
APInt UpperMinusOne = getUpper() - 1;
if (getLower().sle(UpperMinusOne))
return UpperMinusOne;
return APInt::getSignedMaxValue(getBitWidth());
}
if (getLower().isNegative() == getUpper().isNegative())
return SignedMax;
return APInt::getSignedMaxValue(getBitWidth());
return getUpper() - 1;
}
APInt ConstantRange::getSignedMin() const {
APInt SignedMin(APInt::getSignedMinValue(getBitWidth()));
if (!isWrappedSet()) {
if (getLower().sle(getUpper() - 1))
return getLower();
return SignedMin;
return APInt::getSignedMinValue(getBitWidth());
}
if ((getUpper() - 1).slt(getLower())) {
if (getUpper() != SignedMin)
return SignedMin;
if (!getUpper().isMinSignedValue())
return APInt::getSignedMinValue(getBitWidth());
}
return getLower();
}