[llvm] [VPlan] Materialize constant vector trip counts before final opts. (PR #142309)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 9 15:02:38 PDT 2025
================
@@ -10536,6 +10537,25 @@ bool LoopVectorizePass::processLoop(Loop *L) {
InnerLoopVectorizer LB(L, PSE, LI, DT, TLI, TTI, AC, ORE, VF.Width,
VF.MinProfitableTripCount, IC, &CM, BFI, PSI,
Checks, BestPlan);
+
+ // Materialize vector trip counts for constants early if it can simply
+ // be computed as (Original TC / VF * UF) * VF * UF.
+ if (BestPlan.hasScalarTail() &&
+ !CM.requiresScalarEpilogue(VF.Width.isVector())) {
+ VPValue *TC = BestPlan.getTripCount();
+ if (TC->isLiveIn()) {
+ ScalarEvolution &SE = *PSE.getSE();
+ auto *TCScev = SE.getSCEV(TC->getLiveInIRValue());
+ const SCEV *VFxUF =
+ SE.getElementCount(TCScev->getType(), VF.Width * IC);
+ auto VecTCScev =
----------------
fhahn wrote:
Initially VectorTripCount is an opaque live-in VPValue and we can only compute it once we picked VF and UF. It is set just before executing the VPlan in `VPlan::prepareToExecute`, so it's available during codegen, but not during earlier VPlan transforms.
With this patch, it now gets set slightly earlier if it is constant so VPlan transform can use it for optimizations.
I updated `VPlan::prepareToExecute` to also assert the value set earlier matches.
https://github.com/llvm/llvm-project/pull/142309
More information about the llvm-commits
mailing list