[llvm] 531e066 - [ValueTracking] Return ConstantRange for intrinsic ranges (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 16 06:25:38 PDT 2023
Author: Nikita Popov
Date: 2023-03-16T14:25:28+01:00
New Revision: 531e06668bf84f6d5f85b15c5d2ff6418165a4c4
URL: https://github.com/llvm/llvm-project/commit/531e06668bf84f6d5f85b15c5d2ff6418165a4c4
DIFF: https://github.com/llvm/llvm-project/commit/531e06668bf84f6d5f85b15c5d2ff6418165a4c4.diff
LOG: [ValueTracking] Return ConstantRange for intrinsic ranges (NFC)
Instead of setting Lower and Upper, return a ConstantRange.
Should do this for the others as well.
Added:
Modified:
llvm/lib/Analysis/ValueTracking.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 1ad875bec6e77..1e9ce108ff884 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -7354,67 +7354,66 @@ static void setLimitsForBinOp(const BinaryOperator &BO, APInt &Lower,
}
}
-static void setLimitsForIntrinsic(const IntrinsicInst &II, APInt &Lower,
- APInt &Upper) {
- unsigned Width = Lower.getBitWidth();
+static ConstantRange getRangeForIntrinsic(const IntrinsicInst &II) {
+ unsigned Width = II.getType()->getScalarSizeInBits();
const APInt *C;
switch (II.getIntrinsicID()) {
case Intrinsic::ctpop:
case Intrinsic::ctlz:
case Intrinsic::cttz:
// Maximum of set/clear bits is the bit width.
- assert(Lower == 0 && "Expected lower bound to be zero");
- Upper = Width + 1;
- break;
+ return ConstantRange(APInt::getZero(Width), APInt(Width, Width + 1));
case Intrinsic::uadd_sat:
// uadd.sat(x, C) produces [C, UINT_MAX].
if (match(II.getOperand(0), m_APInt(C)) ||
match(II.getOperand(1), m_APInt(C)))
- Lower = *C;
+ return ConstantRange::getNonEmpty(*C, APInt::getZero(Width));
break;
case Intrinsic::sadd_sat:
if (match(II.getOperand(0), m_APInt(C)) ||
match(II.getOperand(1), m_APInt(C))) {
- if (C->isNegative()) {
+ if (C->isNegative())
// sadd.sat(x, -C) produces [SINT_MIN, SINT_MAX + (-C)].
- Lower = APInt::getSignedMinValue(Width);
- Upper = APInt::getSignedMaxValue(Width) + *C + 1;
- } else {
- // sadd.sat(x, +C) produces [SINT_MIN + C, SINT_MAX].
- Lower = APInt::getSignedMinValue(Width) + *C;
- Upper = APInt::getSignedMaxValue(Width) + 1;
- }
+ return ConstantRange::getNonEmpty(APInt::getSignedMinValue(Width),
+ APInt::getSignedMaxValue(Width) + *C +
+ 1);
+
+ // sadd.sat(x, +C) produces [SINT_MIN + C, SINT_MAX].
+ return ConstantRange::getNonEmpty(APInt::getSignedMinValue(Width) + *C,
+ APInt::getSignedMaxValue(Width) + 1);
}
break;
case Intrinsic::usub_sat:
// usub.sat(C, x) produces [0, C].
if (match(II.getOperand(0), m_APInt(C)))
- Upper = *C + 1;
+ return ConstantRange::getNonEmpty(APInt::getZero(Width), *C + 1);
+
// usub.sat(x, C) produces [0, UINT_MAX - C].
- else if (match(II.getOperand(1), m_APInt(C)))
- Upper = APInt::getMaxValue(Width) - *C + 1;
+ if (match(II.getOperand(1), m_APInt(C)))
+ return ConstantRange::getNonEmpty(APInt::getZero(Width),
+ APInt::getMaxValue(Width) - *C + 1);
break;
case Intrinsic::ssub_sat:
if (match(II.getOperand(0), m_APInt(C))) {
- if (C->isNegative()) {
+ if (C->isNegative())
// ssub.sat(-C, x) produces [SINT_MIN, -SINT_MIN + (-C)].
- Lower = APInt::getSignedMinValue(Width);
- Upper = *C - APInt::getSignedMinValue(Width) + 1;
- } else {
- // ssub.sat(+C, x) produces [-SINT_MAX + C, SINT_MAX].
- Lower = *C - APInt::getSignedMaxValue(Width);
- Upper = APInt::getSignedMaxValue(Width) + 1;
- }
+ return ConstantRange::getNonEmpty(APInt::getSignedMinValue(Width),
+ *C - APInt::getSignedMinValue(Width) +
+ 1);
+
+ // ssub.sat(+C, x) produces [-SINT_MAX + C, SINT_MAX].
+ return ConstantRange::getNonEmpty(*C - APInt::getSignedMaxValue(Width),
+ APInt::getSignedMaxValue(Width) + 1);
} else if (match(II.getOperand(1), m_APInt(C))) {
- if (C->isNegative()) {
+ if (C->isNegative())
// ssub.sat(x, -C) produces [SINT_MIN - (-C), SINT_MAX]:
- Lower = APInt::getSignedMinValue(Width) - *C;
- Upper = APInt::getSignedMaxValue(Width) + 1;
- } else {
- // ssub.sat(x, +C) produces [SINT_MIN, SINT_MAX - C].
- Lower = APInt::getSignedMinValue(Width);
- Upper = APInt::getSignedMaxValue(Width) - *C + 1;
- }
+ return ConstantRange::getNonEmpty(APInt::getSignedMinValue(Width) - *C,
+ APInt::getSignedMaxValue(Width) + 1);
+
+ // ssub.sat(x, +C) produces [SINT_MIN, SINT_MAX - C].
+ return ConstantRange::getNonEmpty(APInt::getSignedMinValue(Width),
+ APInt::getSignedMaxValue(Width) - *C +
+ 1);
}
break;
case Intrinsic::umin:
@@ -7427,19 +7426,15 @@ static void setLimitsForIntrinsic(const IntrinsicInst &II, APInt &Lower,
switch (II.getIntrinsicID()) {
case Intrinsic::umin:
- Upper = *C + 1;
- break;
+ return ConstantRange::getNonEmpty(APInt::getZero(Width), *C + 1);
case Intrinsic::umax:
- Lower = *C;
- break;
+ return ConstantRange::getNonEmpty(*C, APInt::getZero(Width));
case Intrinsic::smin:
- Lower = APInt::getSignedMinValue(Width);
- Upper = *C + 1;
- break;
+ return ConstantRange::getNonEmpty(APInt::getSignedMinValue(Width),
+ *C + 1);
case Intrinsic::smax:
- Lower = *C;
- Upper = APInt::getSignedMaxValue(Width) + 1;
- break;
+ return ConstantRange::getNonEmpty(*C,
+ APInt::getSignedMaxValue(Width) + 1);
default:
llvm_unreachable("Must be min/max intrinsic");
}
@@ -7448,13 +7443,16 @@ static void setLimitsForIntrinsic(const IntrinsicInst &II, APInt &Lower,
// If abs of SIGNED_MIN is poison, then the result is [0..SIGNED_MAX],
// otherwise it is [0..SIGNED_MIN], as -SIGNED_MIN == SIGNED_MIN.
if (match(II.getOperand(1), m_One()))
- Upper = APInt::getSignedMaxValue(Width) + 1;
- else
- Upper = APInt::getSignedMinValue(Width) + 1;
- break;
+ return ConstantRange(APInt::getZero(Width),
+ APInt::getSignedMaxValue(Width) + 1);
+
+ return ConstantRange(APInt::getZero(Width),
+ APInt::getSignedMinValue(Width) + 1);
default:
break;
}
+
+ return ConstantRange::getFull(Width);
}
static void setLimitsForSelectPattern(const SelectInst &SI, APInt &Lower,
@@ -7543,18 +7541,28 @@ ConstantRange llvm::computeConstantRange(const Value *V, bool ForSigned,
InstrInfoQuery IIQ(UseInstrInfo);
unsigned BitWidth = V->getType()->getScalarSizeInBits();
- APInt Lower = APInt(BitWidth, 0);
- APInt Upper = APInt(BitWidth, 0);
- if (auto *BO = dyn_cast<BinaryOperator>(V))
+ ConstantRange CR = ConstantRange::getFull(BitWidth);
+ if (auto *BO = dyn_cast<BinaryOperator>(V)) {
+ APInt Lower = APInt(BitWidth, 0);
+ APInt Upper = APInt(BitWidth, 0);
+ // TODO: Return ConstantRange.
setLimitsForBinOp(*BO, Lower, Upper, IIQ, ForSigned);
- else if (auto *II = dyn_cast<IntrinsicInst>(V))
- setLimitsForIntrinsic(*II, Lower, Upper);
- else if (auto *SI = dyn_cast<SelectInst>(V))
+ CR = ConstantRange::getNonEmpty(Lower, Upper);
+ } else if (auto *II = dyn_cast<IntrinsicInst>(V))
+ CR = getRangeForIntrinsic(*II);
+ else if (auto *SI = dyn_cast<SelectInst>(V)) {
+ APInt Lower = APInt(BitWidth, 0);
+ APInt Upper = APInt(BitWidth, 0);
+ // TODO: Return ConstantRange.
setLimitsForSelectPattern(*SI, Lower, Upper, IIQ);
- else if (isa<FPToUIInst>(V) || isa<FPToSIInst>(V))
+ CR = ConstantRange::getNonEmpty(Lower, Upper);
+ } else if (isa<FPToUIInst>(V) || isa<FPToSIInst>(V)) {
+ APInt Lower = APInt(BitWidth, 0);
+ APInt Upper = APInt(BitWidth, 0);
+ // TODO: Return ConstantRange.
setLimitForFPToI(cast<Instruction>(V), Lower, Upper);
-
- ConstantRange CR = ConstantRange::getNonEmpty(Lower, Upper);
+ CR = ConstantRange::getNonEmpty(Lower, Upper);
+ }
if (auto *I = dyn_cast<Instruction>(V))
if (auto *Range = IIQ.getMetadata(I, LLVMContext::MD_range))
More information about the llvm-commits
mailing list