[llvm] [VPlan] Optimize FindLast of FindIV w/o sentinel. (PR #172569)
Mel Chen via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 13 01:53:01 PST 2026
================
@@ -5502,36 +5503,78 @@ void VPlanTransforms::optimizeFindIVReductions(VPlan &Plan,
CheckSentinel(IVSCEV, UseMax, /*IsSigned=*/true);
if (!SentinelVal) {
SentinelVal = CheckSentinel(IVSCEV, UseMax, /*IsSigned=*/false);
- if (!SentinelVal)
- continue;
UseSigned = false;
}
- auto *RdxResult = cast<VPInstruction>(vputils::findRecipe(
+ // If no sentinel was found, fall back to a boolean AnyOf reduction to track
+ // if the condition was ever true. Requires the IV to not wrap, otherwise we
+ // cannot use min/max.
+ if (!SentinelVal) {
+ auto *AR = cast<SCEVAddRecExpr>(IVSCEV);
+ if (AR->hasNoSignedWrap())
+ UseSigned = true;
+ else if (AR->hasNoUnsignedWrap())
+ UseSigned = false;
+ else
+ continue;
+ }
+
+ VPInstruction *RdxResult = cast<VPInstruction>(vputils::findRecipe(
BackedgeVal,
match_fn(m_VPInstruction<VPInstruction::ComputeReductionResult>())));
- // Create the reduction result in the middle block using sentinel directly.
RecurKind MinMaxKind =
UseMax ? (UseSigned ? RecurKind::SMax : RecurKind::UMax)
: (UseSigned ? RecurKind::SMin : RecurKind::UMin);
VPIRFlags Flags(MinMaxKind, /*IsOrdered=*/false, /*IsInLoop=*/false,
FastMathFlags());
- VPValue *Sentinel = Plan.getConstantInt(*SentinelVal);
DebugLoc ExitDL = RdxResult->getDebugLoc();
VPBuilder MiddleBuilder(RdxResult);
VPValue *ReducedIV =
MiddleBuilder.createNaryOp(VPInstruction::ComputeReductionResult,
RdxResult->getOperand(0), Flags, ExitDL);
- auto *Cmp =
- MiddleBuilder.createICmp(CmpInst::ICMP_NE, ReducedIV, Sentinel, ExitDL);
- VPInstruction *NewRdxResult = MiddleBuilder.createSelect(
- Cmp, ReducedIV, PhiR->getStartValue(), ExitDL);
+
+ VPInstruction *NewRdxResult;
+ VPValue *StartVPV = PhiR->getStartValue();
+ if (SentinelVal) {
+ // Sentinel-based approach: reduce IVs with min/max, compare against
+ // sentinel to detect if condition was ever true, select accordingly.
+ VPValue *Sentinel = Plan.getConstantInt(*SentinelVal);
+ auto *Cmp = MiddleBuilder.createICmp(CmpInst::ICMP_NE, ReducedIV,
+ Sentinel, ExitDL);
+ NewRdxResult = cast<VPInstruction>(
+ MiddleBuilder.createSelect(Cmp, ReducedIV, StartVPV, ExitDL));
----------------
Mel-Chen wrote:
```suggestion
VPValue *NewRdxResult;
VPValue *StartVPV = PhiR->getStartValue();
if (SentinelVal) {
// Sentinel-based approach: reduce IVs with min/max, compare against
// sentinel to detect if condition was ever true, select accordingly.
VPValue *Sentinel = Plan.getConstantInt(*SentinelVal);
auto *Cmp = MiddleBuilder.createICmp(CmpInst::ICMP_NE, ReducedIV,
Sentinel, ExitDL);
NewRdxResult =
MiddleBuilder.createSelect(Cmp, ReducedIV, StartVPV, ExitDL);
```
https://github.com/llvm/llvm-project/pull/172569
More information about the llvm-commits
mailing list