Skip to content

Commit 862d837

Browse files
[DAG] Add SDPatternMatch::m_Select (#100686)
This will enable us to use SDPatternMatch with ISD::SELECT SDNodes in the future.
1 parent 3c2ce70 commit 862d837

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,12 @@ m_c_SetCC(const T0_P &LHS, const T1_P &RHS, const T2_P &CC) {
490490
CC);
491491
}
492492

493+
template <typename T0_P, typename T1_P, typename T2_P>
494+
inline TernaryOpc_match<T0_P, T1_P, T2_P>
495+
m_Select(const T0_P &Cond, const T1_P &T, const T2_P &F) {
496+
return TernaryOpc_match<T0_P, T1_P, T2_P>(ISD::SELECT, Cond, T, F);
497+
}
498+
493499
// === Binary operations ===
494500
template <typename LHS_P, typename RHS_P, bool Commutable = false,
495501
bool ExcludeChain = false>

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
131131
SDValue ICMP_EQ01 = DAG->getSetCC(DL, MVT::i1, Op0, Op1, ISD::SETEQ);
132132
SDValue ICMP_EQ10 = DAG->getSetCC(DL, MVT::i1, Op1, Op0, ISD::SETEQ);
133133

134+
auto Int1VT = EVT::getIntegerVT(Context, 1);
135+
SDValue Cond = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 3, Int1VT);
136+
SDValue T = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 4, Int1VT);
137+
SDValue F = DAG->getCopyFromReg(DAG->getEntryNode(), DL, 5, Int1VT);
138+
SDValue Select = DAG->getSelect(DL, MVT::i1, Cond, T, F);
139+
134140
using namespace SDPatternMatch;
135141
ISD::CondCode CC;
136142
EXPECT_TRUE(sd_match(ICMP_UGT, m_SetCC(m_Value(), m_Value(),
@@ -153,6 +159,13 @@ TEST_F(SelectionDAGPatternMatchTest, matchTernaryOp) {
153159
m_SpecificCondCode(ISD::SETEQ))));
154160
EXPECT_TRUE(sd_match(ICMP_EQ10, m_c_SetCC(m_Specific(Op0), m_Specific(Op1),
155161
m_SpecificCondCode(ISD::SETEQ))));
162+
163+
EXPECT_TRUE(sd_match(
164+
Select, m_Select(m_Specific(Cond), m_Specific(T), m_Specific(F))));
165+
EXPECT_FALSE(sd_match(
166+
Select, m_Select(m_Specific(Cond), m_Specific(F), m_Specific(T))));
167+
EXPECT_FALSE(sd_match(ICMP_EQ01, m_Select(m_Specific(Op0), m_Specific(Op1),
168+
m_SpecificCondCode(ISD::SETEQ))));
156169
}
157170

158171
TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {

0 commit comments

Comments
 (0)