Skip to content

Commit f04ea2e

Browse files
Add m_SelectCCLike matcher to match SELECT_CC or SELECT with SETCC (#149646)
Fix #147282 and Follow-up to #148834 --------- Co-authored-by: Simon Pilgrim <[email protected]>
1 parent 7c1b948 commit f04ea2e

File tree

3 files changed

+55
-12
lines changed

3 files changed

+55
-12
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,18 @@ m_InsertSubvector(const LHS &Base, const RHS &Sub, const IDX &Idx) {
578578
return TernaryOpc_match<LHS, RHS, IDX>(ISD::INSERT_SUBVECTOR, Base, Sub, Idx);
579579
}
580580

581+
template <typename LTy, typename RTy, typename TTy, typename FTy, typename CCTy>
582+
inline auto m_SelectCC(const LTy &L, const RTy &R, const TTy &T, const FTy &F,
583+
const CCTy &CC) {
584+
return m_Node(ISD::SELECT_CC, L, R, T, F, CC);
585+
}
586+
587+
template <typename LTy, typename RTy, typename TTy, typename FTy, typename CCTy>
588+
inline auto m_SelectCCLike(const LTy &L, const RTy &R, const TTy &T,
589+
const FTy &F, const CCTy &CC) {
590+
return m_AnyOf(m_Select(m_SetCC(L, R, CC), T, F), m_SelectCC(L, R, T, F, CC));
591+
}
592+
581593
// === Binary operations ===
582594
template <typename LHS_P, typename RHS_P, bool Commutable = false,
583595
bool ExcludeChain = false>

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4107,18 +4107,17 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
41074107
// (sub x, ([v]select (uge x, y), y, 0)) -> (umin x, (sub x, y))
41084108
if (N1.hasOneUse() && hasUMin(VT)) {
41094109
SDValue Y;
4110-
if (sd_match(N1, m_Select(m_SetCC(m_Specific(N0), m_Value(Y),
4111-
m_SpecificCondCode(ISD::SETULT)),
4112-
m_Zero(), m_Deferred(Y))) ||
4113-
sd_match(N1, m_Select(m_SetCC(m_Specific(N0), m_Value(Y),
4114-
m_SpecificCondCode(ISD::SETUGE)),
4115-
m_Deferred(Y), m_Zero())) ||
4116-
sd_match(N1, m_VSelect(m_SetCC(m_Specific(N0), m_Value(Y),
4117-
m_SpecificCondCode(ISD::SETULT)),
4118-
m_Zero(), m_Deferred(Y))) ||
4119-
sd_match(N1, m_VSelect(m_SetCC(m_Specific(N0), m_Value(Y),
4120-
m_SpecificCondCode(ISD::SETUGE)),
4121-
m_Deferred(Y), m_Zero())))
4110+
auto MS0 = m_Specific(N0);
4111+
auto MVY = m_Value(Y);
4112+
auto MZ = m_Zero();
4113+
auto MCC1 = m_SpecificCondCode(ISD::SETULT);
4114+
auto MCC2 = m_SpecificCondCode(ISD::SETUGE);
4115+
4116+
if (sd_match(N1, m_SelectCCLike(MS0, MVY, MZ, m_Deferred(Y), MCC1)) ||
4117+
sd_match(N1, m_SelectCCLike(MS0, MVY, m_Deferred(Y), MZ, MCC2)) ||
4118+
sd_match(N1, m_VSelect(m_SetCC(MS0, MVY, MCC1), MZ, m_Deferred(Y))) ||
4119+
sd_match(N1, m_VSelect(m_SetCC(MS0, MVY, MCC2), m_Deferred(Y), MZ)))
4120+
41224121
return DAG.getNode(ISD::UMIN, DL, VT, N0,
41234122
DAG.getNode(ISD::SUB, DL, VT, N0, Y));
41244123
}

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,3 +859,35 @@ TEST_F(SelectionDAGPatternMatchTest, MatchZeroOneAllOnes) {
859859
EXPECT_TRUE(sd_match(Vec, DAG.get(), m_AllOnes(true)));
860860
}
861861
}
862+
863+
TEST_F(SelectionDAGPatternMatchTest, MatchSelectCCLike) {
864+
using namespace SDPatternMatch;
865+
866+
SDValue LHS = DAG->getConstant(1, SDLoc(), MVT::i32);
867+
SDValue RHS = DAG->getConstant(2, SDLoc(), MVT::i32);
868+
SDValue TVal = DAG->getConstant(3, SDLoc(), MVT::i32);
869+
SDValue FVal = DAG->getConstant(4, SDLoc(), MVT::i32);
870+
SDValue Select = DAG->getNode(ISD::SELECT_CC, SDLoc(), MVT::i32, LHS, RHS,
871+
TVal, FVal, DAG->getCondCode(ISD::SETLT));
872+
873+
ISD::CondCode CC = ISD::SETLT;
874+
EXPECT_TRUE(sd_match(
875+
Select, m_SelectCCLike(m_Specific(LHS), m_Specific(RHS), m_Specific(TVal),
876+
m_Specific(FVal), m_CondCode(CC))));
877+
}
878+
879+
TEST_F(SelectionDAGPatternMatchTest, MatchSelectCC) {
880+
using namespace SDPatternMatch;
881+
882+
SDValue LHS = DAG->getConstant(1, SDLoc(), MVT::i32);
883+
SDValue RHS = DAG->getConstant(2, SDLoc(), MVT::i32);
884+
SDValue TVal = DAG->getConstant(3, SDLoc(), MVT::i32);
885+
SDValue FVal = DAG->getConstant(4, SDLoc(), MVT::i32);
886+
SDValue Select = DAG->getNode(ISD::SELECT_CC, SDLoc(), MVT::i32, LHS, RHS,
887+
TVal, FVal, DAG->getCondCode(ISD::SETLT));
888+
889+
ISD::CondCode CC = ISD::SETLT;
890+
EXPECT_TRUE(sd_match(Select, m_SelectCC(m_Specific(LHS), m_Specific(RHS),
891+
m_Specific(TVal), m_Specific(FVal),
892+
m_CondCode(CC))));
893+
}

0 commit comments

Comments
 (0)