[llvm] [VPlan] Scalarize to first-lane-only directly on VPlan (PR #184267)
Andrei Elovikov via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 17 08:16:38 PDT 2026
================
@@ -6541,3 +6541,59 @@ void VPlanTransforms::makeMemOpWideningDecisions(
ReplaceWith(Recipe);
}
}
+
+void VPlanTransforms::makeScalarizationDecisions(VPlan &Plan, VFRange &Range) {
+ if (LoopVectorizationPlanner::getDecisionAndClampRange(
+ [&](ElementCount VF) { return VF.isScalar(); }, Range))
+ return;
+
+ // Extend lifetime per `llvm::PostOrderTraversal` documentation:
+ auto PO =
+ vp_post_order_shallow(Plan.getVectorLoopRegion()->getEntryBasicBlock());
+
+ for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(PO)) {
+ for (VPRecipeBase &R : make_early_inc_range(reverse(*VPBB))) {
+ auto *VPI = dyn_cast<VPInstruction>(&R);
+ if (!VPI)
+ continue;
+
+ // For now we (effectively) only scalarize to first-lane-only address
+ // computation chain for the memory operations such that
+ // MemOp->usesFirstLaneOnly(MemOpAddressOperand).
+
+ auto *I = cast_or_null<Instruction>(VPI->getUnderlyingValue());
+ if (!I)
+ // Wouldn't be able to create a `VPReplicateRecipe` anyway.
+ continue;
+
+ // If "executing" other lanes produces side-effects we can't avoid them.
+ if (VPI->mayHaveSideEffects())
+ continue;
+
+ // We want to drop the mask operand, doing that for integer division
+ // isn't safe if it's predicated.
+ if (is_contained({Instruction::SDiv, Instruction::UDiv, Instruction::SRem,
----------------
eas wrote:
That would require accessing `getUnderlyingInst`, I'm not sure we want to do that...
https://github.com/llvm/llvm-project/pull/184267
More information about the llvm-commits
mailing list