[llvm] [VPlan] Extract reverse operation for reverse accesses (PR #146525)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 11 14:01:19 PST 2025
================
@@ -2858,25 +2858,43 @@ static VPRecipeBase *optimizeMaskToEVL(VPValue *HeaderMask,
return new VPWidenLoadEVLRecipe(cast<VPWidenLoadRecipe>(CurRecipe), Addr,
EVL, Mask);
- if (match(&CurRecipe,
+ VPValue *ReversedVal;
+ if (match(&CurRecipe, m_Reverse(m_VPValue(ReversedVal))) &&
+ match(ReversedVal,
m_MaskedLoad(m_VPValue(EndPtr), m_RemoveMask(HeaderMask, Mask))) &&
match(EndPtr, m_VecEndPtr(m_VPValue(Addr), m_Specific(&Plan->getVF()))) &&
- cast<VPWidenLoadRecipe>(CurRecipe).isReverse())
- return new VPWidenLoadEVLRecipe(cast<VPWidenLoadRecipe>(CurRecipe),
- AdjustEndPtr(EndPtr), EVL, Mask);
+ cast<VPWidenLoadRecipe>(ReversedVal)->isReverse()) {
+ auto *LoadR = new VPWidenLoadEVLRecipe(
+ *cast<VPWidenLoadRecipe>(ReversedVal), AdjustEndPtr(EndPtr), EVL, Mask);
+ LoadR->insertBefore(&CurRecipe);
+ return new VPWidenIntrinsicRecipe(
+ Intrinsic::experimental_vp_reverse, {LoadR, Plan->getTrue(), &EVL},
+ TypeInfo.inferScalarType(LoadR), {}, {}, DL);
+ }
if (match(&CurRecipe, m_MaskedStore(m_VPValue(Addr), m_VPValue(),
m_RemoveMask(HeaderMask, Mask))) &&
!cast<VPWidenStoreRecipe>(CurRecipe).isReverse())
return new VPWidenStoreEVLRecipe(cast<VPWidenStoreRecipe>(CurRecipe), Addr,
EVL, Mask);
- if (match(&CurRecipe, m_MaskedStore(m_VPValue(EndPtr), m_VPValue(),
+ VPValue *StoredVal;
+ if (match(&CurRecipe, m_MaskedStore(m_VPValue(EndPtr), m_VPValue(StoredVal),
m_RemoveMask(HeaderMask, Mask))) &&
match(EndPtr, m_VecEndPtr(m_VPValue(Addr), m_Specific(&Plan->getVF()))) &&
- cast<VPWidenStoreRecipe>(CurRecipe).isReverse())
- return new VPWidenStoreEVLRecipe(cast<VPWidenStoreRecipe>(CurRecipe),
- AdjustEndPtr(EndPtr), EVL, Mask);
+ cast<VPWidenStoreRecipe>(CurRecipe).isReverse()) {
+ if (match(StoredVal, m_Reverse(m_VPValue(ReversedVal)))) {
+ auto *NewReverse = new VPWidenIntrinsicRecipe(
+ Intrinsic::experimental_vp_reverse,
+ {ReversedVal, Plan->getTrue(), &EVL},
+ TypeInfo.inferScalarType(ReversedVal), {}, {},
+ cast<VPInstruction>(StoredVal)->getDebugLoc());
----------------
fhahn wrote:
I don't think we have tests with debug location for EVL transform, would be good to add some.
https://github.com/llvm/llvm-project/pull/146525
More information about the llvm-commits
mailing list