[llvm] [VPlan] Materialize VF and VFxUF using VPInstructions. (PR #152879)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 11 04:06:27 PDT 2025


================
@@ -3340,6 +3340,33 @@ void VPlanTransforms::materializeVectorTripCount(VPlan &Plan,
   VectorTC.replaceAllUsesWith(Res);
 }
 
+void VPlanTransforms::materializeVFAndVFxUF(VPlan &Plan, VPBasicBlock *VectorPH,
+                                            ElementCount VFEC) {
+  VPBuilder Builder(VectorPH, VectorPH->begin());
+  auto *TCTy = VPTypeAnalysis(Plan).inferScalarType(Plan.getTripCount());
+  VPValue &VF = Plan.getVF();
+  VPValue &VFxUF = Plan.getVFxUF();
+  if (VF.getNumUsers()) {
+    VPValue *RuntimeVF = Builder.createElementCount(TCTy, VFEC);
+    if (any_of(VF.users(), [&VF](VPUser *U) { return !U->usesScalars(&VF); })) {
+      auto *BC = Builder.createNaryOp(VPInstruction::Broadcast, {RuntimeVF});
+      VF.replaceUsesWithIf(
+          BC, [&VF](VPUser &U, unsigned) { return !U.usesScalars(&VF); });
+    }
+    VF.replaceAllUsesWith(RuntimeVF);
+
+    VPValue *UF = Plan.getOrAddLiveIn(ConstantInt::get(TCTy, Plan.getUF()));
+    auto *MulByUF = Plan.getUF() == 1 ? RuntimeVF
+                                      : Builder.createNaryOp(Instruction::Mul,
+                                                             {RuntimeVF, UF});
----------------
fhahn wrote:

I'd prefer to not change this here. Until clarfiying LangRef to limit the maximal possible value of VScale (https://github.com/llvm/llvm-project/pull/144607), adding NUW here would be on shaky grounds IMO.

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


More information about the llvm-commits mailing list