[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