[llvm] [VPlan] Convert EVL loops to variable-length stepping after dissolution (PR #147222)

Luke Lau via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 17 09:16:26 PDT 2025


================
@@ -2357,6 +2357,64 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
   return true;
 }
 
+void VPlanTransforms::simplifyEVLIVs(VPlan &Plan) {
+  auto ConvertEVLPhi = [](VPlan &Plan, VPBasicBlock *Entry,
+                          VPEVLBasedIVPHIRecipe *EVLPhi) {
+    using namespace llvm::VPlanPatternMatch;
+    VPValue *EVLIncrement = EVLPhi->getBackedgeValue();
+
+    // Convert EVLPhi to concrete recipe.
+    auto *ScalarR = VPBuilder(EVLPhi).createScalarPhi(
+        {EVLPhi->getStartValue(), EVLIncrement}, EVLPhi->getDebugLoc(),
+        "evl.based.iv");
+    EVLPhi->replaceAllUsesWith(ScalarR);
+    EVLPhi->eraseFromParent();
+
+    // Find the latch-exiting block and convert to variable-length stepping.
+    // Before: (branch-on-count CanonicalIVInc, VectorTripCount)
+    // After: (branch-on-count EVLIVInc, TripCount)
+    auto Range =
+        VPBlockUtils::blocksOnly<VPBasicBlock>(vp_depth_first_shallow(Entry));
+    auto It = find_if(Range, [&](VPBasicBlock *VPBB) {
+      return any_of(VPBB->successors(),
+                    [&](VPBlockBase *Succ) { return Succ == Entry; });
+    });
----------------
lukel97 wrote:

Can we explicitly capture Entry?

```suggestion
    auto It = find_if(Range, [&EVLPhi](VPBasicBlock *VPBB) {
      return any_of(VPBB->successors(),
                    [&EVLPhi](VPBlockBase *Succ) { return Succ == EVLPhi->getParent(); });
    });
```

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


More information about the llvm-commits mailing list