Skip to content

Commit 4e17482

Browse files
[DAGCombiner] Add SelectCCLike matcher and unit test-7
1 parent eca282d commit 4e17482

File tree

2 files changed

+40
-39
lines changed

2 files changed

+40
-39
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,7 @@ struct DeferredValue_match {
130130

131131
explicit DeferredValue_match(SDValue &Match) : MatchVal(Match) {}
132132

133-
template <typename MatchContext>
134-
bool match(const MatchContext &, SDValue N) {
133+
template <typename MatchContext> bool match(const MatchContext &, SDValue N) {
135134
return N == MatchVal;
136135
}
137136
};
@@ -580,40 +579,13 @@ m_InsertSubvector(const LHS &Base, const RHS &Sub, const IDX &Idx) {
580579
}
581580

582581
template <typename LTy, typename RTy, typename TTy, typename FTy, typename CCTy>
583-
struct SelectCC_match {
584-
LTy L;
585-
RTy R;
586-
TTy T;
587-
FTy F;
588-
CCTy CC;
589-
590-
SelectCC_match(LTy L, RTy R, TTy T, FTy F, CCTy CC)
591-
: L(std::move(L)), R(std::move(R)), T(std::move(T)), F(std::move(F)),
592-
CC(std::move(CC)) {}
593-
594-
template <typename MatchContext>
595-
bool match(MatchContext &Ctx, SDValue V) {
596-
return V.getOpcode() == ISD::SELECT_CC && L.match(Ctx, V.getOperand(0)) &&
597-
R.match(Ctx, V.getOperand(1)) && T.match(Ctx, V.getOperand(2)) &&
598-
F.match(Ctx, V.getOperand(3)) && CC.match(Ctx, V.getOperand(4));
599-
}
600-
};
601-
602-
template <typename LTy, typename RTy, typename TTy, typename FTy, typename CCTy>
603-
inline auto m_SelectCC(LTy &&L, RTy &&R, TTy &&T, FTy &&F, CCTy &&CC) {
604-
return SelectCC_match<std::decay_t<LTy>, std::decay_t<RTy>, std::decay_t<TTy>,
605-
std::decay_t<FTy>, std::decay_t<CCTy>>(
606-
std::forward<LTy>(L), std::forward<RTy>(R), std::forward<TTy>(T),
607-
std::forward<FTy>(F), std::forward<CCTy>(CC));
582+
inline auto m_SelectCC(LTy L, RTy R, TTy T, FTy F, CCTy CC) {
583+
return m_Node(ISD::SELECT_CC, L, R, T, F, CC);
608584
}
609585

610586
template <typename LTy, typename RTy, typename TTy, typename FTy, typename CCTy>
611-
inline auto m_SelectCCLike(LTy &&L, RTy &&R, TTy &&T, FTy &&F, CCTy &&CC) {
612-
return SDPatternMatch::m_AnyOf(
613-
SDPatternMatch::m_Select(SDPatternMatch::m_SetCC(L, R, CC), T, F),
614-
m_SelectCC(std::forward<LTy>(L), std::forward<RTy>(R),
615-
std::forward<TTy>(T), std::forward<FTy>(F),
616-
std::forward<CCTy>(CC)));
587+
inline auto m_SelectCCLike(LTy L, RTy R, TTy T, FTy F, CCTy CC) {
588+
return m_AnyOf(m_Select(m_SetCC(L, R, CC), T, F), m_SelectCC(L, R, T, F, CC));
617589
}
618590

619591
// === Binary operations ===

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -955,15 +955,44 @@ TEST_F(SelectionDAGPatternMatchTest, MatchSelectCCLike) {
955955

956956
SDValue LHS = DAG->getConstant(1, SDLoc(), MVT::i32);
957957
SDValue RHS = DAG->getConstant(2, SDLoc(), MVT::i32);
958-
SDValue Select = DAG->getNode(ISD::SELECT_CC, SDLoc(), MVT::i32, LHS,
959-
RHS,
960-
LHS, RHS,
961-
DAG->getCondCode(ISD::SETLT));
958+
SDValue TVal = DAG->getConstant(3, SDLoc(), MVT::i32);
959+
SDValue FVal = DAG->getConstant(4, SDLoc(), MVT::i32);
960+
SDValue Select = DAG->getNode(ISD::SELECT_CC, SDLoc(), MVT::i32, LHS, RHS,
961+
TVal, FVal, DAG->getCondCode(ISD::SETLT));
962962

963963
ISD::CondCode CC = ISD::SETLT;
964964
auto Matcher =
965-
m_SelectCCLike(m_Specific(LHS), m_Specific(RHS), m_Specific(LHS),
966-
m_Specific(RHS), m_CondCode(CC));
965+
m_SelectCCLike(m_Specific(LHS), m_Specific(RHS), m_Specific(TVal),
966+
m_Specific(FVal), m_CondCode(CC));
967+
968+
struct DAGMatchContext {
969+
SelectionDAG &DAG;
970+
DAGMatchContext(SelectionDAG &DAG) : DAG(DAG) {}
971+
972+
bool match(SDValue N, unsigned Opcode) const {
973+
return N.getOpcode() == Opcode;
974+
}
975+
976+
unsigned getNumOperands(SDValue N) const { return N.getNumOperands(); }
977+
};
978+
979+
DAGMatchContext Ctx(*DAG);
980+
EXPECT_TRUE(Matcher.match(Ctx, Select));
981+
}
982+
983+
TEST_F(SelectionDAGPatternMatchTest, MatchSelectCC) {
984+
using namespace SDPatternMatch;
985+
986+
SDValue LHS = DAG->getConstant(1, SDLoc(), MVT::i32);
987+
SDValue RHS = DAG->getConstant(2, SDLoc(), MVT::i32);
988+
SDValue TVal = DAG->getConstant(3, SDLoc(), MVT::i32);
989+
SDValue FVal = DAG->getConstant(4, SDLoc(), MVT::i32);
990+
SDValue Select = DAG->getNode(ISD::SELECT_CC, SDLoc(), MVT::i32, LHS, RHS,
991+
TVal, FVal, DAG->getCondCode(ISD::SETLT));
992+
993+
ISD::CondCode CC = ISD::SETLT;
994+
auto Matcher = m_SelectCC(m_Specific(LHS), m_Specific(RHS), m_Specific(TVal),
995+
m_Specific(FVal), m_CondCode(CC));
967996

968997
struct DAGMatchContext {
969998
SelectionDAG &DAG;

0 commit comments

Comments
 (0)