-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[DAG] Add SDPatternMatch::m_Select #100686
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This will enable us to use SDPatternMatch with ISD::SELECT SDNodes in the future.
@llvm/pr-subscribers-llvm-selectiondag Author: Michael Maitland (michaelmaitland) ChangesThis will enable us to use SDPatternMatch with ISD::SELECT SDNodes in Full diff: https://github.com/llvm/llvm-project/pull/100686.diff 2 Files Affected:
diff --git a/llvm/include/llvm/CodeGen/SDPatternMatch.h b/llvm/include/llvm/CodeGen/SDPatternMatch.h
index a905c85f56b66..f59c4463651af 100644
--- a/llvm/include/llvm/CodeGen/SDPatternMatch.h
+++ b/llvm/include/llvm/CodeGen/SDPatternMatch.h
@@ -490,6 +490,13 @@ m_c_SetCC(const T0_P &LHS, const T1_P &RHS, const T2_P &CC) {
CC);
}
+template <typename T0_P, typename T1_P, typename T2_P>
+inline TernaryOpc_match<T0_P, T1_P, T2_P, false, false>
+m_Select(const T0_P &Cond, const T1_P &T, const T2_P &F) {
+ return TernaryOpc_match<T0_P, T1_P, T2_P, false, false>(ISD::SELECT, Cond, T,
+ F);
+}
+
// === Binary operations ===
template <typename LHS_P, typename RHS_P, bool Commutable = false,
bool ExcludeChain = false>
diff --git a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
index e318f467bbf27..f1f612dc1b41e 100644
--- a/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp
@@ -131,6 +131,12 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
SDValue ICMP_EQ01 = DAG->getSetCC(DL, MVT::i1, Op0, Op1, ISD::SETEQ);
SDValue ICMP_EQ10 = DAG->getSetCC(DL, MVT::i1, Op1, Op0, ISD::SETEQ);
+ auto Int1VT = EVT::getIntegerVT(Context, 1);
+ SDValue Cond = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 3, Int1VT);
+ SDValue T = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 4, Int1VT);
+ SDValue F = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 5, Int1VT);
+ SDValue Select = DAG->getSelect(DL, MVT::i1, Cond, T, F);
+
using namespace SDPatternMatch;
ISD::CondCode CC;
EXPECT_TRUE(sd_match(ICMP_UGT, m_SetCC(m_Value(), m_Value(),
@@ -153,6 +159,11 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
m_SpecificCondCode(ISD::SETEQ))));
EXPECT_TRUE(sd_match(ICMP_EQ10, m_c_SetCC(m_Specific(Op0), m_Specific(Op1),
m_SpecificCondCode(ISD::SETEQ))));
+
+ EXPECT_TRUE(sd_match(
+ Select, m_Select(m_Specific(Cond), m_Specific(T), m_Specific(F))));
+ EXPECT_FALSE(sd_match(ICMP_EQ01, m_Select(m_Specific(Op0), m_Specific(Op1),
+ m_SpecificCondCode(ISD::SETEQ))));
}
TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
|
@@ -490,6 +490,13 @@ m_c_SetCC(const T0_P &LHS, const T1_P &RHS, const T2_P &CC) { | |||
CC); | |||
} | |||
|
|||
template <typename T0_P, typename T1_P, typename T2_P> | |||
inline TernaryOpc_match<T0_P, T1_P, T2_P, false, false> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it necessary to pass the false
values?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM - m_VSelect might be useful as well :)
As per the comment in #100686 (review)
This will enable us to use SDPatternMatch with ISD::SELECT SDNodes in
the future.