[llvm] [LV] Add support for cmp reductions with decreasing IVs. (PR #140451)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 28 14:42:18 PDT 2025
================
@@ -713,36 +715,66 @@ RecurrenceDescriptor::isFindLastIVPattern(Loop *TheLoop, PHINode *OrigPhi,
return std::nullopt;
const SCEV *Step = AR->getStepRecurrence(SE);
- if (!SE.isKnownPositive(Step))
+
+ if (isFindFirstIVRecurrenceKind(Kind)) {
+ if (!SE.isKnownNegative(Step))
+ return std::nullopt;
+ } else if (!SE.isKnownPositive(Step))
return std::nullopt;
// Keep the minimum value of the recurrence type as the sentinel value.
// The maximum acceptable range for the increasing induction variable,
// called the valid range, will be defined as
+
+ // Keep the minimum (FindLast) or maximum (FindFirst) value of the
+ // recurrence type as the sentinel value. The maximum acceptable range for
+ // the induction variable, called the valid range, will be defined as
// [<sentinel value> + 1, <sentinel value>)
- // where <sentinel value> is [Signed|Unsigned]Min(<recurrence type>)
+ // where <sentinel value> is [Signed|Unsigned]Min(<recurrence type>) for
+ // FindLastIV or [Signed|Unsigned]Max(<recurrence type>) for FindFirstIV.
// TODO: This range restriction can be lifted by adding an additional
// virtual OR reduction.
auto CheckRange = [&](bool IsSigned) {
const ConstantRange IVRange =
IsSigned ? SE.getSignedRange(AR) : SE.getUnsignedRange(AR);
unsigned NumBits = Ty->getIntegerBitWidth();
- const APInt Sentinel = IsSigned ? APInt::getSignedMinValue(NumBits)
- : APInt::getMinValue(NumBits);
- const ConstantRange ValidRange =
- ConstantRange::getNonEmpty(Sentinel + 1, Sentinel);
- LLVM_DEBUG(dbgs() << "LV: FindLastIV valid range is " << ValidRange
+ ConstantRange ValidRange = ConstantRange::getEmpty(NumBits);
+ if (isFindLastIVRecurrenceKind(Kind)) {
+ APInt Sentinel = IsSigned ? APInt::getSignedMinValue(NumBits)
+ : APInt::getMinValue(NumBits);
+ ValidRange = ConstantRange::getNonEmpty(Sentinel + 1, Sentinel);
+ } else {
+ assert(isFindFirstIVRecurrenceKind(Kind) &&
+ "Kind must either be FindLastIV or FindFirstIV");
----------------
fhahn wrote:
Yeah, thought it might be good for extra safety, but dropped it for now, thanks
https://github.com/llvm/llvm-project/pull/140451
More information about the llvm-commits
mailing list