[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