[llvm] [LVI] Learn value ranges from ctpop results (PR #121945)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 13 07:40:48 PST 2025
================
@@ -1159,6 +1159,28 @@ getRangeViaSLT(CmpInst::Predicate Pred, APInt RHS,
return std::nullopt;
}
+/// Get value range for a "ctpop(Val) Pred RHS" condition.
+static ValueLatticeElement getValueFromICmpCtpop(ICmpInst::Predicate Pred,
+ Value *RHS) {
+ unsigned BitWidth = RHS->getType()->getPrimitiveSizeInBits();
+
+ auto RHSConst = dyn_cast<ConstantInt>(RHS);
+ if (!RHSConst)
+ return ValueLatticeElement::getOverdefined();
+
+ auto &RHSVal = RHSConst->getValue();
+
+ ConstantRange ResValRange = ConstantRange::makeExactICmpRegion(Pred, RHSVal);
+
+ unsigned ResMin = ResValRange.getUnsignedMin().getLimitedValue(BitWidth);
+ unsigned ResMax = ResValRange.getUnsignedMax().getLimitedValue(BitWidth);
+
+ APInt ValMin = APInt::getLowBitsSet(BitWidth, ResMin);
+ APInt ValMax = APInt::getHighBitsSet(BitWidth, ResMax);
+ return ValueLatticeElement::getRange(
+ ConstantRange{std::move(ValMin), ValMax + 1});
----------------
nikic wrote:
```suggestion
ConstantRange::getNonEmpty(std::move(ValMin), ValMax + 1));
```
https://github.com/llvm/llvm-project/pull/121945
More information about the llvm-commits
mailing list