[llvm] [LV][EVL] Support in-loop reduction using tail folding with EVL. (PR #90184)
Mel Chen via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 24 02:53:29 PDT 2024
================
@@ -1443,23 +1452,39 @@ bool VPlanTransforms::tryAddExplicitVectorLength(VPlan &Plan) {
for (VPValue *HeaderMask : collectAllHeaderMasks(Plan)) {
for (VPUser *U : collectUsersRecursively(HeaderMask)) {
- auto *MemR = dyn_cast<VPWidenMemoryRecipe>(U);
- if (!MemR)
+ VPRecipeBase *NewRecipe = nullptr;
+ auto *CurRecipe = dyn_cast<VPRecipeBase>(U);
+ if (!CurRecipe || CurRecipe->getNumDefinedValues() > 1)
continue;
- VPValue *OrigMask = MemR->getMask();
- assert(OrigMask && "Unmasked widen memory recipe when folding tail");
- VPValue *NewMask = HeaderMask == OrigMask ? nullptr : OrigMask;
- if (auto *L = dyn_cast<VPWidenLoadRecipe>(MemR)) {
- auto *N = new VPWidenLoadEVLRecipe(L, VPEVL, NewMask);
- N->insertBefore(L);
- L->replaceAllUsesWith(N);
- L->eraseFromParent();
- } else if (auto *S = dyn_cast<VPWidenStoreRecipe>(MemR)) {
- auto *N = new VPWidenStoreEVLRecipe(S, VPEVL, NewMask);
- N->insertBefore(S);
- S->eraseFromParent();
- } else {
- llvm_unreachable("unsupported recipe");
+
+ auto GetNewMask = [&](VPValue *OrigMask) -> VPValue * {
+ assert(OrigMask && "Unmasked recipe when folding tail");
+ return HeaderMask == OrigMask ? nullptr : OrigMask;
+ };
+ if (auto *MemR = dyn_cast<VPWidenMemoryRecipe>(CurRecipe)) {
+ VPValue *NewMask = GetNewMask(MemR->getMask());
+ if (auto *L = dyn_cast<VPWidenLoadRecipe>(MemR))
+ NewRecipe = new VPWidenLoadEVLRecipe(L, VPEVL, NewMask);
+ else if (auto *S = dyn_cast<VPWidenStoreRecipe>(MemR))
+ NewRecipe = new VPWidenStoreEVLRecipe(S, VPEVL, NewMask);
+ else
+ llvm_unreachable("unsupported recipe");
+ } else if (auto *RedR = dyn_cast<VPReductionRecipe>(CurRecipe)) {
+ NewRecipe = new VPReductionEVLRecipe(RedR, VPEVL,
+ GetNewMask(RedR->getCondOp()));
+ }
+
+ if (NewRecipe) {
+ unsigned NumDefVal = NewRecipe->getNumDefinedValues();
+ assert(NumDefVal == CurRecipe->getNumDefinedValues() &&
+ "New recipe must define the same number of values as the "
+ "original.");
+ NewRecipe->insertBefore(CurRecipe);
+ if (NumDefVal > 0) {
----------------
Mel-Chen wrote:
b59b677c63b01711708f24ff4e4e3698325c40dc
I have handled the load as special case since VPWidenLoadEVLRecipe does not inherit from VPSingleDefRecipe.
https://github.com/llvm/llvm-project/pull/90184
More information about the llvm-commits
mailing list