[llvm] [VPlan] Perform optimizeMaskToEVL in terms of pattern matching (PR #155394)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 12 04:19:14 PDT 2025
================
@@ -587,6 +588,79 @@ m_DerivedIV(const Op0_t &Op0, const Op1_t &Op1, const Op2_t &Op2) {
return VPDerivedIV_match<Op0_t, Op1_t, Op2_t>({Op0, Op1, Op2});
}
+template <typename Addr_t, typename Mask_t, bool Reverse> struct Load_match {
+ Addr_t Addr;
+ Mask_t Mask;
+
+ Load_match(Addr_t Addr, Mask_t Mask) : Addr(Addr), Mask(Mask) {}
+
+ template <typename OpTy> bool match(const OpTy *V) const {
+ auto *Load = dyn_cast<VPWidenLoadRecipe>(V);
+ if (!Load || Load->isReverse() != Reverse || !Addr.match(Load->getAddr()) ||
+ !Load->isMasked() || !Mask.match(Load->getMask()))
+ return false;
+ return true;
+ }
+};
+
+/// Match a non-reversed masked load.
+template <typename Addr_t, typename Mask_t>
+inline Load_match<Addr_t, Mask_t, false> m_Load(const Addr_t &Addr,
+ const Mask_t &Mask) {
+ return Load_match<Addr_t, Mask_t, false>(Addr, Mask);
+}
+
+/// Match a reversed masked load.
+template <typename Addr_t, typename Mask_t>
+inline Load_match<Addr_t, Mask_t, true> m_ReverseLoad(const Addr_t &Addr,
+ const Mask_t &Mask) {
+ return Load_match<Addr_t, Mask_t, true>(Addr, Mask);
+}
+
+template <typename Addr_t, typename Val_t, typename Mask_t, bool Reverse>
+struct Store_match {
+ Addr_t Addr;
+ Val_t Val;
+ Mask_t Mask;
+
+ Store_match(Addr_t Addr, Val_t Val, Mask_t Mask)
+ : Addr(Addr), Val(Val), Mask(Mask) {}
+
+ template <typename OpTy> bool match(const OpTy *V) const {
+ auto *Store = dyn_cast<VPWidenStoreRecipe>(V);
+ if (!Store || Store->isReverse() != Reverse ||
----------------
lukel97 wrote:
Oh I see, I think your plan makes sense. But surely convertToStrided access has the same issue with the `BinOp(reverse(V1), reverse(V2)) --> reverse(BinOp(V1, V2))` simplification? I think it will also have to peek through the binary op to find the loads too?
If we do have to peek through the use-def chain then we can probably share the logic between convertToStridedAccess and optimizeMaskToEVL.
https://github.com/llvm/llvm-project/pull/155394
More information about the llvm-commits
mailing list