[llvm] [VPlan] Split out optimizeEVLMasks. NFC (PR #174925)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 11 23:01:55 PST 2026
================
@@ -2979,8 +2979,43 @@ static VPRecipeBase *optimizeMaskToEVL(VPValue *HeaderMask,
return nullptr;
}
-/// Replace recipes with their EVL variants.
-static void transformRecipestoEVLRecipes(VPlan &Plan, VPValue &EVL) {
+/// Optimize away any EVL-based header masks to VP intrinsic based recipes.
+/// The transforms here need to preserve the original semantics.
+void VPlanTransforms::optimizeEVLMasks(VPlan &Plan) {
+ // Find the EVL-based header mask if it exists: icmp ult step-vector, EVL
+ VPValue *HeaderMask = nullptr, *EVL = nullptr;
+ for (VPRecipeBase &R : *Plan.getVectorLoopRegion()->getEntryBasicBlock()) {
+ if (match(&R, m_SpecificICmp(CmpInst::ICMP_ULT, m_StepVector(),
+ m_VPValue(EVL))) &&
+ match(EVL, m_EVL(m_VPValue()))) {
+ HeaderMask = R.getVPSingleValue();
+ break;
+ }
+ }
+ if (!HeaderMask)
+ return;
+
+ VPTypeAnalysis TypeInfo(Plan);
+ SmallVector<VPRecipeBase *> OldRecipes;
+ for (VPUser *U : collectUsersRecursively(HeaderMask)) {
+ VPRecipeBase *R = cast<VPRecipeBase>(U);
+ if (auto *NewR = optimizeMaskToEVL(HeaderMask, *R, TypeInfo, *EVL)) {
+ NewR->insertBefore(R);
+ for (auto [Old, New] :
+ zip_equal(R->definedValues(), NewR->definedValues()))
+ Old->replaceAllUsesWith(New);
+ OldRecipes.push_back(R);
+ }
+ }
+ // Erase recipes at the end so we don't invalidate TypeInfo.
+ for (VPRecipeBase *OldR : OldRecipes)
+ OldR->eraseFromParent();
+ removeDeadRecipes(Plan);
----------------
lukel97 wrote:
Calling removeDeadRecipes was just simpler than having to worry about erasing the old recipes in reverse order, passing through the old recipe's operands etc. Not strongly opinionated about it though and can restore it if you prefer.
https://github.com/llvm/llvm-project/pull/174925
More information about the llvm-commits
mailing list