[llvm] [LVI][CVP] Treat undef as Unknown on abs (PR #68711)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 15 06:04:54 PDT 2023
================
@@ -470,58 +470,50 @@ static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI);
// because it is negation-invariant.
static bool processAbsIntrinsic(IntrinsicInst *II, LazyValueInfo *LVI) {
Value *X = II->getArgOperand(0);
- bool IsIntMinPoison = cast<ConstantInt>(II->getArgOperand(1))->isOne();
-
Type *Ty = X->getType();
- Constant *IntMin =
- ConstantInt::get(Ty, APInt::getSignedMinValue(Ty->getScalarSizeInBits()));
- LazyValueInfo::Tristate Result;
+ if (!Ty->isIntegerTy())
+ return false;
+
+ bool IsIntMinPoison = cast<ConstantInt>(II->getArgOperand(1))->isOne();
+ APInt IntMin = APInt::getSignedMinValue(Ty->getScalarSizeInBits());
+ ConstantRange Range = LVI->getConstantRangeAtUse(
+ II->getOperandUse(0), /*UndefAllowed*/ IsIntMinPoison);
// Is X in [0, IntMin]? NOTE: INT_MIN is fine!
- Result = LVI->getPredicateAt(CmpInst::Predicate::ICMP_ULE, X, IntMin, II,
- /*UseBlockValue=*/true);
- if (Result == LazyValueInfo::True) {
+ ConstantRange ZeroIntMinRange =
+ ConstantRange::makeExactICmpRegion(CmpInst::Predicate::ICMP_ULE, IntMin);
+ if (ZeroIntMinRange.contains(Range)) {
----------------
nikic wrote:
```suggestion
if (Range.icmp(CmpInst::ICMP_ULE, IntMin)) {
```
https://github.com/llvm/llvm-project/pull/68711
More information about the llvm-commits
mailing list