Skip to content

Commit 4651216

Browse files
[DAG] Add m_SelectCCLike matcher for SELECT_CC and SELECT(SETCC(...))-2
1 parent 82b9b2c commit 4651216

File tree

2 files changed

+17
-45
lines changed

2 files changed

+17
-45
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4099,18 +4099,17 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
40994099
// (sub x, ([v]select (uge x, y), y, 0)) -> (umin x, (sub x, y))
41004100
if (N1.hasOneUse() && hasUMin(VT)) {
41014101
SDValue Y;
4102-
if (sd_match(N1, m_SelectCCLike(m_Specific(N0), m_Value(Y), m_Zero(),
4103-
m_Deferred(Y),
4104-
m_SpecificCondCode(ISD::SETULT))) ||
4105-
sd_match(N1,
4106-
m_SelectCCLike(m_Specific(N0), m_Value(Y), m_Deferred(Y),
4107-
m_Zero(), m_SpecificCondCode(ISD::SETUGE))) ||
4108-
sd_match(N1, m_VSelect(m_SetCC(m_Specific(N0), m_Value(Y),
4109-
m_SpecificCondCode(ISD::SETULT)),
4110-
m_Zero(), m_Deferred(Y))) ||
4111-
sd_match(N1, m_VSelect(m_SetCC(m_Specific(N0), m_Value(Y),
4112-
m_SpecificCondCode(ISD::SETUGE)),
4113-
m_Deferred(Y), m_Zero())))
4102+
auto MS0 = m_Specific(N0);
4103+
auto MVY = m_Value(Y);
4104+
auto MZ = m_Zero();
4105+
auto MCC1 = m_SpecificCondCode(ISD::SETULT);
4106+
auto MCC2 = m_SpecificCondCode(ISD::SETUGE);
4107+
4108+
if (sd_match(N1, m_SelectCCLike(MS0, MVY, MZ, m_Deferred(Y), MCC1)) ||
4109+
sd_match(N1, m_SelectCCLike(MS0, MVY, m_Deferred(Y), MZ, MCC2)) ||
4110+
sd_match(N1, m_VSelect(m_SetCC(MS0, MVY, MCC1), MZ, m_Deferred(Y))) ||
4111+
sd_match(N1, m_VSelect(m_SetCC(MS0, MVY, MCC2), m_Deferred(Y), MZ)))
4112+
41144113
return DAG.getNode(ISD::UMIN, DL, VT, N0,
41154114
DAG.getNode(ISD::SUB, DL, VT, N0, Y));
41164115
}

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -961,23 +961,9 @@ TEST_F(SelectionDAGPatternMatchTest, MatchSelectCCLike) {
961961
TVal, FVal, DAG->getCondCode(ISD::SETLT));
962962

963963
ISD::CondCode CC = ISD::SETLT;
964-
auto Matcher =
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));
964+
EXPECT_TRUE(sd_match(
965+
Select, m_SelectCCLike(m_Specific(LHS), m_Specific(RHS), m_Specific(TVal),
966+
m_Specific(FVal), m_CondCode(CC))));
981967
}
982968

983969
TEST_F(SelectionDAGPatternMatchTest, MatchSelectCC) {
@@ -991,20 +977,7 @@ TEST_F(SelectionDAGPatternMatchTest, MatchSelectCC) {
991977
TVal, FVal, DAG->getCondCode(ISD::SETLT));
992978

993979
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));
996-
997-
struct DAGMatchContext {
998-
SelectionDAG &DAG;
999-
DAGMatchContext(SelectionDAG &DAG) : DAG(DAG) {}
1000-
1001-
bool match(SDValue N, unsigned Opcode) const {
1002-
return N.getOpcode() == Opcode;
1003-
}
1004-
1005-
unsigned getNumOperands(SDValue N) const { return N.getNumOperands(); }
1006-
};
1007-
1008-
DAGMatchContext Ctx(*DAG);
1009-
EXPECT_TRUE(Matcher.match(Ctx, Select));
980+
EXPECT_TRUE(sd_match(Select, m_SelectCC(m_Specific(LHS), m_Specific(RHS),
981+
m_Specific(TVal), m_Specific(FVal),
982+
m_CondCode(CC))));
1010983
}

0 commit comments

Comments
 (0)