[llvm] [VPlan] Optimize FindLast of FindIV w/o sentinel. (PR #172569)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 12 10:52:36 PST 2026
================
@@ -5526,36 +5526,83 @@ 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(
+ // Fall back to boolean tracking if IV doesn't wrap.
+ 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));
+ StartVPV = Sentinel;
+ } else {
+ // Introduce a boolean AnyOf reduction to track if the condition was ever
+ // true in the loop. Use it to select the initial start value, if it was
+ // never true.
+ auto *AnyOfPhi = new VPReductionPHIRecipe(
+ nullptr, RecurKind::Or, *Plan.getFalse(), *Plan.getFalse(),
+ RdxUnordered{1}, /*HasUsesOutsideReductionChain=*/false);
+ AnyOfPhi->insertAfter(PhiR);
+
+ VPBuilder LoopBuilder(
+ cast<VPRecipeBase>(BackedgeVal->getDefiningRecipe()));
----------------
fhahn wrote:
yep, removed thanks
https://github.com/llvm/llvm-project/pull/172569
More information about the llvm-commits
mailing list