[llvm] [VPlan] Factor collectGroupedReplicateMemOps (NFC) (PR #179506)

Ramkumar Ramachandra via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 3 06:11:31 PST 2026


================
@@ -4595,51 +4668,32 @@ void VPlanTransforms::materializeBroadcasts(VPlan &Plan) {
   }
 }
 
-void VPlanTransforms::hoistInvariantLoads(VPlan &Plan) {
-  VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
-
-  // Collect candidate loads with invariant addresses and noalias scopes
-  // metadata and memory-writing recipes with noalias metadata.
-  SmallVector<std::pair<VPRecipeBase *, MemoryLocation>> CandidateLoads;
-  SmallVector<MemoryLocation> Stores;
-  for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(
-           vp_depth_first_shallow(LoopRegion->getEntry()))) {
-    for (VPRecipeBase &R : *VPBB) {
-      // Only handle single-scalar replicated loads with invariant addresses.
-      if (auto *RepR = dyn_cast<VPReplicateRecipe>(&R)) {
-        if (RepR->isPredicated() || !RepR->isSingleScalar() ||
-            RepR->getOpcode() != Instruction::Load)
-          continue;
+void VPlanTransforms::hoistInvariantLoads(VPlan &Plan,
+                                          PredicatedScalarEvolution &PSE,
+                                          const Loop *L) {
+  VPBasicBlock *Preheader = Plan.getVectorPreheader();
+  auto IsInvariantLoad = [](VPReplicateRecipe *RepR) {
+    if (RepR->isPredicated() || !RepR->isSingleScalar() ||
+        RepR->getOpcode() != Instruction::Load)
+      return false;
+    VPValue *Addr = RepR->getOperand(0);
+    return Addr->isDefinedOutsideLoopRegions();
+  };
+  auto Groups = collectGroupedReplicateMemOps<Instruction::Load>(
+      Plan, PSE, L, IsInvariantLoad);
+  for (auto Group : Groups) {
+    VPReplicateRecipe *EarliestLoad = Group[0];
----------------
artagnon wrote:

Oops, fixed thinko now, thanks! Patch should really be an NFC now.

https://github.com/llvm/llvm-project/pull/179506


More information about the llvm-commits mailing list