[llvm] [LV] Support argmin/argmax with strict predicates. (PR #170223)

via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 16 02:58:03 PST 2025


================
@@ -715,6 +715,36 @@ RecurrenceDescriptor::isAnyOfPattern(Loop *Loop, PHINode *OrigPhi,
   return InstDesc(I, RecurKind::AnyOf);
 }
 
+bool RecurrenceDescriptor::isValidIVRangeForFindIV(const SCEVAddRecExpr *AR,
+                                                   bool IsSigned,
+                                                   bool IsFindFirstIV,
+                                                   ScalarEvolution &SE) {
+  const ConstantRange IVRange =
+      IsSigned ? SE.getSignedRange(AR) : SE.getUnsignedRange(AR);
+  unsigned NumBits = AR->getType()->getIntegerBitWidth();
+  ConstantRange ValidRange = ConstantRange::getEmpty(NumBits);
+
+  if (IsFindFirstIV) {
+    if (IsSigned)
+      ValidRange =
+          ConstantRange::getNonEmpty(APInt::getSignedMinValue(NumBits),
+                                     APInt::getSignedMaxValue(NumBits) - 1);
+    else
+      ValidRange = ConstantRange::getNonEmpty(APInt::getMinValue(NumBits),
+                                              APInt::getMaxValue(NumBits) - 1);
+  } else {
+    APInt Sentinel = IsSigned ? APInt::getSignedMinValue(NumBits)
+                              : APInt::getMinValue(NumBits);
+    ValidRange = ConstantRange::getNonEmpty(Sentinel + 1, Sentinel);
+  }
----------------
ayalz wrote:

Would something like
```
  APInt MinIteration = IsSigned ? APInt::getSignedMinValue(NumBits) : APInt::getMinValue(NumBits);
  APInt MaxIteration = IsSigned ? APInt::getSignedMaxValue(NumBits) : APInt::getMaxValue(NumBits);
  APInt SentinelIteration = IsFindFirstIV ? MaxIteration : MinIteration;
  return !IVRange.contains(SentinelIteration);
```
be clearer, inline with documentation, and hopefully also still correct?

https://github.com/llvm/llvm-project/pull/170223


More information about the llvm-commits mailing list