[llvm] [NFC][VPlan] Split `makeMemOpWideningDecisions` into subpasses (PR #182593)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 14 20:59:58 PDT 2026
================
@@ -6924,38 +6924,79 @@ void VPlanTransforms::makeMemOpWideningDecisions(
}
}
- VPBasicBlock *MiddleVPBB = Plan.getMiddleBlock();
+ // Few helpers to process different kinds of memory operations.
+
+ // To be used as argument to `VPlanTransforms::runPass` which explicitly
+ // specified pass name, hence `VPlan &` parameter.
+ auto ProcessSubset = [&](VPlan &, auto ProcessVPInst) {
+ SmallVector<VPInstruction *> RemainingMemOps;
+ for (VPInstruction *VPI : MemOps) {
+ if (!ProcessVPInst(VPI))
+ RemainingMemOps.push_back(VPI);
+ }
+
+ MemOps.clear();
+ std::swap(MemOps, RemainingMemOps);
+ };
+
+ auto ReplaceWith = [&](VPInstruction *VPI, VPRecipeBase *New) {
+ New->insertBefore(VPI);
+ if (VPI->getOpcode() == Instruction::Load)
+ VPI->replaceAllUsesWith(New->getVPSingleValue());
+ VPI->eraseFromParent();
+
+ // VPI has been processed.
+ return true;
+ };
+
+ auto Scalarize = [&](VPInstruction *VPI) {
+ return ReplaceWith(VPI, RecipeBuilder.handleReplication(VPI, Range));
+ };
+
+ auto *MiddleVPBB = Plan.getMiddleBlock();
VPBuilder FinalRedStoresBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
+ VPlanTransforms::runPass(
+ "lowerMemoryIdioms", ProcessSubset, Plan, [&](VPInstruction *VPI) {
+ if (RecipeBuilder.replaceWithFinalIfReductionStore(
+ VPI, FinalRedStoresBuilder))
+ return true;
+
+ // Filter out scalar VPlan for the remaining idioms.
+ if (LoopVectorizationPlanner::getDecisionAndClampRange(
+ [](ElementCount VF) { return VF.isScalar(); }, Range))
+ return false;
----------------
lukel97 wrote:
How come we filter out the scalar VPlan twice, once here and once in line 6976? Can we split the `replaceWithFinalIfReductionStore` into its own subpass, then filter out the scalar VPlans, and then continue with the rest of the histogram + `scalarizeMemOpsWithIrregularTypes` lowering?
https://github.com/llvm/llvm-project/pull/182593
More information about the llvm-commits
mailing list