[llvm] Add SD matchers and unit test coverage for ISD::VECTOR_SHUFFLE (PR #119592)
Aidan Goldfarb via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 25 07:05:08 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;
----------------
AidanGoldfarb wrote:
I agree, per the [ArrayRef docs](https://llvm.org/doxygen/classllvm_1_1ArrayRef.html), "This is intended to be trivially copyable, so it should be passed by value." Perhaps a modification of this in the IR code, in a different pull request, would be valuable?
https://github.com/llvm/llvm-project/pull/119592
More information about the llvm-commits
mailing list