[llvm] [LV] Support argmin/argmax with strict predicates. (PR #170223)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 21 15:05:46 PST 2025
================
@@ -1120,6 +1122,133 @@ bool VPlanTransforms::handleMaxMinNumReductions(VPlan &Plan) {
return true;
}
+/// For argmin/argmax reductions with strict predicates, convert the existing
+/// FindLastIV reduction to a new UMin reduction of a wide canonical IV. If the
+/// original IV was not canonical, a new canonical wide IV is added, and the
+/// final result is scaled back to the original IV.
+static bool handleStrictArgMinArgMax(VPlan &Plan,
+ VPReductionPHIRecipe *MinMaxPhiR,
+ VPReductionPHIRecipe *FindIVPhiR,
+ VPWidenIntOrFpInductionRecipe *WideIV,
+ VPInstruction *MinMaxResult) {
+ Type *Ty = Plan.getVectorLoopRegion()->getCanonicalIVType();
+ if (Ty != VPTypeAnalysis(Plan).inferScalarType(FindIVPhiR))
+ return false;
+
+ // If the original wide IV is not canonical, create a new one. The wide IV is
+ // guaranteed to not wrap for all lanes that are active in the vector loop.
+ if (!WideIV->isCanonical()) {
+ VPValue *Zero = Plan.getOrAddLiveIn(ConstantInt::get(Ty, 0));
+ VPValue *One = Plan.getOrAddLiveIn(ConstantInt::get(Ty, 1));
+ auto *WidenCanIV = new VPWidenIntOrFpInductionRecipe(
+ nullptr, Zero, One, WideIV->getVFValue(),
+ WideIV->getInductionDescriptor(), VPIRFlags(), WideIV->getDebugLoc());
+ WidenCanIV->insertBefore(WideIV);
+
+ // Update the select to use the wide canonical IV.
+ auto *SelectRecipe = cast<VPSingleDefRecipe>(
+ FindIVPhiR->getBackedgeValue()->getDefiningRecipe());
+ if (SelectRecipe->getOperand(1) == WideIV)
+ SelectRecipe->setOperand(1, WidenCanIV);
----------------
fhahn wrote:
yep done, thanks
https://github.com/llvm/llvm-project/pull/170223
More information about the llvm-commits
mailing list