[llvm] [LV] Vectorize conditional scalar assignments (PR #158088)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 21 05:32:56 PST 2025
================
@@ -992,3 +992,66 @@ bool VPlanTransforms::handleMaxMinNumReductions(VPlan &Plan) {
MiddleTerm->setOperand(0, NewCond);
return true;
}
+
+void VPlanTransforms::convertFindLastRecurrences(
+ VPlan &Plan, VPRecipeBuilder &RecipeBuilder) {
+ if (Plan.hasScalarVFOnly())
+ return;
+
+ // We want to create the following nodes:
+ // vec.body:
+ // mask.phi = phi <VF x i1> [ all.false, vec.ph ], [ new.mask, vec.body ]
+ // ...data.phi already exists, but needs updating...
+ // data.phi = phi <VF x Ty> [ default.val, vec.ph ], [ new.data, vec.body ]
+ //
+ // ...'data' and 'compare' created by existing nodes...
+ //
+ // any_active = i1 any_of_reduction(compare)
+ // new.mask = select any_active, compare, mask.phi
+ // new.data = select any_active, data, data.phi
+ //
+ // middle.block:
+ // result = extract-last-active new.data, new.mask, default.val
+
+ for (auto &Phi : Plan.getVectorLoopRegion()->getEntryBasicBlock()->phis()) {
+ auto *PhiR = dyn_cast<VPReductionPHIRecipe>(&Phi);
+ if (!PhiR || !RecurrenceDescriptor::isFindLastRecurrenceKind(
+ PhiR->getRecurrenceKind()))
+ continue;
+
+ // Find the condition for the select
+ auto *SR = cast<VPWidenSelectRecipe>(&PhiR->getBackedgeRecipe());
+ VPValue *Cond = SR->getCond();
+
+ // Add mask phi
+ VPBuilder Builder = VPBuilder::getToInsertAfter(PhiR);
+ VPValue *False = Plan.getOrAddLiveIn(
+ ConstantInt::getFalse(PhiR->getUnderlyingValue()->getContext()));
----------------
fhahn wrote:
```suggestion
VPValue *False = Plan.getConstantInt(1, 0);
```
can use something like above,
or get the context via Plan.getContext() to avoid look up of underlying value.
https://github.com/llvm/llvm-project/pull/158088
More information about the llvm-commits
mailing list