[llvm] [DAG] Added m_AnyBinOp and m_c_AnyBinOp in SDPatternMatch.h (PR #86435)
Shourya Goel via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 28 05:34:46 PDT 2024
================
@@ -457,6 +457,53 @@ struct BinaryOpc_match {
}
};
+template <typename LHS_t, typename RHS_t, typename PredFuncT>
+struct AnyBinaryOp_match {
+ LHS_t L;
+ RHS_t R;
+ PredFuncT PredFunc;
+ bool Commutable;
+
+ AnyBinaryOp_match(const PredFuncT &Pred, const LHS_t &LHS, const RHS_t &RHS,
+ const bool Commutable)
+ : PredFunc(Pred), L(LHS), R(RHS), Commutable(Commutable) {}
+
+ template <typename OpTy, typename MatchContext>
+ bool match(OpTy *V, const MatchContext &Ctx) {
+ assert(Ctx.getTLI() && "TargetLowering is required for this pattern");
+ if (auto *I = dyn_cast<BinaryOperator>(V))
+ return (PredFunc(*Ctx.getTLI()) &&
+ ((L.match(I->getOperand(0)) && R.match(I->getOperand(1))) ||
+ (Commutable && L.match(I->getOperand(1)) &&
+ R.match(I->getOperand(0)))));
+ return false;
+ }
+};
+
+template <typename LHS, typename RHS>
+inline auto m_AnyBinOp(const LHS &L, const RHS &R) {
+ return AnyBinaryOp_match{[](const TargetLowering &TLI) { return true; }, L, R,
----------------
Sh0g0-1758 wrote:
Okay, so while I think that the ```m_AnyBinOp(unsigned &Opc, LHS, RHS)``` needs some work in the sense that I am still not returning the opcode, ie. giving Opcode the value of ```N->getOpcode()```. But according to my testing, I don't think that ```isBinOp``` is being called at all. Any reason why?
https://github.com/llvm/llvm-project/pull/86435
More information about the llvm-commits
mailing list