[llvm] Add SD matchers and unit test coverage for ISD::VECTOR_SHUFFLE (PR #119592)

Min-Yih Hsu via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 24 13:37:32 PST 2024


================
@@ -548,49 +548,39 @@ struct BinaryOpc_match {
 };
 
 /// Matching while capturing mask
-template <typename T0, typename T1> struct SDShuffle_match {
+template <typename T0, typename T1, typename T2> struct SDShuffle_match {
   T0 Op1;
   T1 Op2;
+  T2 Mask;
 
-  ArrayRef<int> &CapturedMask;
-
-  // capturing mask
-  SDShuffle_match(const T0 &Op1, const T1 &Op2, ArrayRef<int> &MaskRef)
-      : Op1(Op1), Op2(Op2), CapturedMask(MaskRef) {}
+  SDShuffle_match(const T0 &Op1, const T1 &Op2, const T2 &Mask)
+      : Op1(Op1), Op2(Op2), Mask(Mask) {}
 
   template <typename MatchContext>
   bool match(const MatchContext &Ctx, SDValue N) {
     if (auto *I = dyn_cast<ShuffleVectorSDNode>(N)) {
-      if (Op1.match(Ctx, I->getOperand(0)) &&
-          Op2.match(Ctx, I->getOperand(1))) {
-        CapturedMask = I->getMask();
-        return true;
-      }
+      return Op1.match(Ctx, I->getOperand(0)) &&
+             Op2.match(Ctx, I->getOperand(1)) && Mask.match(I->getMask());
     }
     return false;
   }
 };
 
-/// Matching against a specific match
-template <typename T0, typename T1> struct SDShuffle_maskMatch {
-  T0 Op1;
-  T1 Op2;
-  ArrayRef<int> SpecificMask;
-
-  SDShuffle_maskMatch(const T0 &Op1, const T1 &Op2, ArrayRef<int> Mask)
-      : Op1(Op1), Op2(Op2), SpecificMask(Mask) {}
-
-  template <typename MatchContext>
-  bool match(const MatchContext &Ctx, SDValue N) {
-    if (auto *I = dyn_cast<ShuffleVectorSDNode>(N)) {
-      return Op1.match(Ctx, I->getOperand(0)) &&
-             Op2.match(Ctx, I->getOperand(1)) &&
-             std::equal(SpecificMask.begin(), SpecificMask.end(),
-                        I->getMask().begin(), I->getMask().end());
-    }
-    return false;
+struct m_Mask {
+  ArrayRef<int> &MaskRef;
+  m_Mask(ArrayRef<int> &MaskRef) : MaskRef(MaskRef) {}
+  bool match(ArrayRef<int> Mask) {
+    MaskRef = Mask;
+    return true;
   }
 };
+
+struct m_SpecificMask {
+  ArrayRef<int> &MaskRef;
----------------
mshockwave wrote:

I don't think you need to store a reference here, storing value should suffice (ArrayRef should be trivially copyable).

https://github.com/llvm/llvm-project/pull/119592


More information about the llvm-commits mailing list