[llvm] [VPlan] Move IV predicate handling to VPlan. (PR #192876)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue May 5 10:43:51 PDT 2026
================
@@ -993,6 +994,72 @@ bool VPlanTransforms::createHeaderPhiRecipes(
return true;
}
+bool VPlanTransforms::finalizeSCEVPredicates(VPlan &Plan,
+ PredicatedScalarEvolution &PSE,
+ bool OptForSize,
+ unsigned SCEVCheckThreshold,
+ OptimizationRemarkEmitter *ORE,
+ Loop *TheLoop) {
+ // Collect which header IVs have predicates and add them to PSE.
+ auto *HeaderVPBB = cast<VPBasicBlock>(
+ Plan.getEntry()->getSuccessors()[1]->getSingleSuccessor());
+ SmallPtrSet<VPWidenInductionRecipe *, 4> PredicatedIVs;
+ for (auto &R : HeaderVPBB->phis()) {
+ auto *WideIV = dyn_cast<VPWidenInductionRecipe>(&R);
+ if (!WideIV || WideIV->getPredicates().empty())
+ continue;
+ PredicatedIVs.insert(WideIV);
+ for (const auto *P : WideIV->getPredicates())
+ PSE.addPredicate(*P);
+ }
+
+ // Bail out if exit phis use predicated IVs via ExitingIVValue, as the
+ // predicated SCEV may not hold outside the loop (PR33706). Check each IV's
+ // predicates directly, regardless of whether PSE was already non-trivial
+ // from other sources (e.g., LAI predicates).
+ // TODO: Overly conservative; exit values from vector registers are safe
+ // when guarded by runtime checks, but later passes may use the SCEV.
+ if (!PredicatedIVs.empty())
+ for (auto *EB : Plan.getExitBlocks())
+ for (VPRecipeBase &R : EB->phis())
+ for (VPValue *Op : R.operands()) {
+ VPValue *Inner;
+ if (!match(Op, m_ExitingIVValue(m_VPValue(Inner))))
+ continue;
----------------
fhahn wrote:
I think we should, but the legacy code did not check phis. I can pull it in here, but as this is a separate bugfix it would probably be better to do separately?
https://github.com/llvm/llvm-project/pull/192876
More information about the llvm-commits
mailing list