Skip to content

Commit d3d2d72

Browse files
committed
[DAG] SDPatternMatch - add missing BSWAP/CTPOP/CTTZ matchers
1 parent 9ee9e0e commit d3d2d72

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,11 @@ inline UnaryOpc_match<Opnd, true> m_ChainedUnaryOp(unsigned Opc,
822822
return UnaryOpc_match<Opnd, true>(Opc, Op);
823823
}
824824

825+
template <typename Opnd>
826+
inline UnaryOpc_match<Opnd> m_BSwap(const Opnd &Op) {
827+
return UnaryOpc_match<Opnd>(ISD::BSWAP, Op);
828+
}
829+
825830
template <typename Opnd>
826831
inline UnaryOpc_match<Opnd> m_BitReverse(const Opnd &Op) {
827832
return UnaryOpc_match<Opnd>(ISD::BITREVERSE, Op);
@@ -892,10 +897,18 @@ template <typename Opnd> inline UnaryOpc_match<Opnd> m_FPToSI(const Opnd &Op) {
892897
return UnaryOpc_match<Opnd>(ISD::FP_TO_SINT, Op);
893898
}
894899

900+
template <typename Opnd> inline UnaryOpc_match<Opnd> m_Ctpop(const Opnd &Op) {
901+
return UnaryOpc_match<Opnd>(ISD::CTPOP, Op);
902+
}
903+
895904
template <typename Opnd> inline UnaryOpc_match<Opnd> m_Ctlz(const Opnd &Op) {
896905
return UnaryOpc_match<Opnd>(ISD::CTLZ, Op);
897906
}
898907

908+
template <typename Opnd> inline UnaryOpc_match<Opnd> m_Cttz(const Opnd &Op) {
909+
return UnaryOpc_match<Opnd>(ISD::CTTZ, Op);
910+
}
911+
899912
// === Constants ===
900913
struct ConstantInt_match {
901914
APInt *BindVal;

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,12 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
302302
SDValue FPToSI = DAG->getNode(ISD::FP_TO_SINT, DL, FloatVT, Op2);
303303
SDValue FPToUI = DAG->getNode(ISD::FP_TO_UINT, DL, FloatVT, Op2);
304304

305+
SDValue Brev = DAG->getNode(ISD::BITREVERSE, DL, Int32VT, Op0);
306+
SDValue Bswap = DAG->getNode(ISD::BSWAP, DL, Int32VT, Op0);
307+
308+
SDValue Ctpop = DAG->getNode(ISD::CTPOP, DL, Int32VT, Op0);
305309
SDValue Ctlz = DAG->getNode(ISD::CTLZ, DL, Int32VT, Op0);
310+
SDValue Cttz = DAG->getNode(ISD::CTTZ, DL, Int32VT, Op0);
306311

307312
using namespace SDPatternMatch;
308313
EXPECT_TRUE(sd_match(ZExt, m_UnaryOp(ISD::ZERO_EXTEND, m_Value())));
@@ -328,7 +333,17 @@ TEST_F(SelectionDAGPatternMatchTest, matchUnaryOp) {
328333
EXPECT_FALSE(sd_match(FPToUI, m_FPToSI(m_Value())));
329334
EXPECT_FALSE(sd_match(FPToSI, m_FPToUI(m_Value())));
330335

336+
EXPECT_TRUE(sd_match(Brev, m_BitReverse(m_Value())));
337+
EXPECT_TRUE(sd_match(Bswap, m_BSwap(m_Value())));
338+
EXPECT_FALSE(sd_match(Brev, m_BSwap(m_Value())));
339+
EXPECT_FALSE(sd_match(Bswap, m_BitReverse(m_Value())));
340+
341+
EXPECT_TRUE(sd_match(Ctpop, m_Ctpop(m_Value())));
331342
EXPECT_TRUE(sd_match(Ctlz, m_Ctlz(m_Value())));
343+
EXPECT_TRUE(sd_match(Cttz, m_Cttz(m_Value())));
344+
EXPECT_FALSE(sd_match(Ctpop, m_Ctlz(m_Value())));
345+
EXPECT_FALSE(sd_match(Ctlz, m_Cttz(m_Value())));
346+
EXPECT_FALSE(sd_match(Cttz, m_Ctlz(m_Value())));
332347
}
333348

334349
TEST_F(SelectionDAGPatternMatchTest, matchConstants) {

0 commit comments

Comments
 (0)