[llvm] [VPlan] Materialize VF and VFxUF using VPInstructions. (PR #152879)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 11 08:57:39 PDT 2025
================
@@ -3335,6 +3335,33 @@ void VPlanTransforms::materializeVectorTripCount(VPlan &Plan,
VectorTC.replaceAllUsesWith(Res);
}
+void VPlanTransforms::materializeVFAndVFxUF(VPlan &Plan, VPBasicBlock *VectorPH,
+ ElementCount VFEC) {
+ VPBuilder Builder(VectorPH, VectorPH->begin());
+ Type *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
----------------
fhahn wrote:
Hm, but they generate operations in slightly different order, the first does (VF * Vscale) * UF, whereas otherwise we do ((VF * UF) * vscale), the former will serve users of the runtime-vf.
Both compute the same value, but in different order. The patch keeps the sequence the same as for IR.
https://github.com/llvm/llvm-project/pull/152879
More information about the llvm-commits
mailing list