Skip to content

Commit d3270ad

Browse files
authored
[DAG] SDPatternMatch - add matching for SELECT_CC patterns to min/max like matchers (#147071)
Fixes #147083
1 parent 9be7194 commit d3270ad

File tree

2 files changed

+61
-14
lines changed

2 files changed

+61
-14
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,21 @@ struct MaxMin_match {
655655

656656
template <typename MatchContext>
657657
bool match(const MatchContext &Ctx, SDValue N) {
658+
auto MatchMinMax = [&](SDValue L, SDValue R, SDValue TrueValue,
659+
SDValue FalseValue, ISD::CondCode CC) {
660+
if ((TrueValue != L || FalseValue != R) &&
661+
(TrueValue != R || FalseValue != L))
662+
return false;
663+
664+
ISD::CondCode Cond =
665+
TrueValue == L ? CC : getSetCCInverse(CC, L.getValueType());
666+
if (!Pred_t::match(Cond))
667+
return false;
668+
669+
return (LHS.match(Ctx, L) && RHS.match(Ctx, R)) ||
670+
(Commutable && LHS.match(Ctx, R) && RHS.match(Ctx, L));
671+
};
672+
658673
if (sd_context_match(N, Ctx, m_Opc(ISD::SELECT)) ||
659674
sd_context_match(N, Ctx, m_Opc(ISD::VSELECT))) {
660675
EffectiveOperands<ExcludeChain> EO_SELECT(N, Ctx);
@@ -670,23 +685,22 @@ struct MaxMin_match {
670685
SDValue R = Cond->getOperand(EO_SETCC.FirstIndex + 1);
671686
auto *CondNode =
672687
cast<CondCodeSDNode>(Cond->getOperand(EO_SETCC.FirstIndex + 2));
673-
674-
if ((TrueValue != L || FalseValue != R) &&
675-
(TrueValue != R || FalseValue != L)) {
676-
return false;
677-
}
678-
679-
ISD::CondCode Cond =
680-
TrueValue == L ? CondNode->get()
681-
: getSetCCInverse(CondNode->get(), L.getValueType());
682-
if (!Pred_t::match(Cond)) {
683-
return false;
684-
}
685-
return (LHS.match(Ctx, L) && RHS.match(Ctx, R)) ||
686-
(Commutable && LHS.match(Ctx, R) && RHS.match(Ctx, L));
688+
return MatchMinMax(L, R, TrueValue, FalseValue, CondNode->get());
687689
}
688690
}
689691

692+
if (sd_context_match(N, Ctx, m_Opc(ISD::SELECT_CC))) {
693+
EffectiveOperands<ExcludeChain> EO_SELECT(N, Ctx);
694+
assert(EO_SELECT.Size == 5);
695+
SDValue L = N->getOperand(EO_SELECT.FirstIndex);
696+
SDValue R = N->getOperand(EO_SELECT.FirstIndex + 1);
697+
SDValue TrueValue = N->getOperand(EO_SELECT.FirstIndex + 2);
698+
SDValue FalseValue = N->getOperand(EO_SELECT.FirstIndex + 3);
699+
auto *CondNode =
700+
cast<CondCodeSDNode>(N->getOperand(EO_SELECT.FirstIndex + 4));
701+
return MatchMinMax(L, R, TrueValue, FalseValue, CondNode->get());
702+
}
703+
690704
return false;
691705
}
692706
};

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,23 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
307307
SDValue UMinLikeULT = DAG->getSelect(DL, MVT::i32, ICMP_ULT, Op0, Op1);
308308
SDValue UMinLikeULE = DAG->getSelect(DL, MVT::i32, ICMP_ULE, Op0, Op1);
309309

310+
SDValue CCSMaxLikeGT = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETGT);
311+
SDValue CCSMaxLikeGE = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETGE);
312+
SDValue CCSMaxLikeLT = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETLT);
313+
SDValue CCSMaxLikeLE = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETLE);
314+
SDValue CCUMaxLikeUGT = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETUGT);
315+
SDValue CCUMaxLikeUGE = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETUGE);
316+
SDValue CCUMaxLikeULT = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETULT);
317+
SDValue CCUMaxLikeULE = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETULE);
318+
SDValue CCSMinLikeLT = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETLT);
319+
SDValue CCSMinLikeGT = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETGT);
320+
SDValue CCSMinLikeLE = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETLE);
321+
SDValue CCSMinLikeGE = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETGE);
322+
SDValue CCUMinLikeULT = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETULT);
323+
SDValue CCUMinLikeUGT = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETUGT);
324+
SDValue CCUMinLikeULE = DAG->getSelectCC(DL, Op0, Op1, Op0, Op1, ISD::SETULE);
325+
SDValue CCUMinLikeUGE = DAG->getSelectCC(DL, Op0, Op1, Op1, Op0, ISD::SETUGE);
326+
310327
SDValue SFAdd = DAG->getNode(ISD::STRICT_FADD, DL, {Float32VT, MVT::Other},
311328
{DAG->getEntryNode(), Op2, Op2});
312329

@@ -357,21 +374,37 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
357374
EXPECT_TRUE(sd_match(SMax, m_SMaxLike(m_Value(), m_Value())));
358375
EXPECT_TRUE(sd_match(SMaxLikeGT, m_SMaxLike(m_Value(), m_Value())));
359376
EXPECT_TRUE(sd_match(SMaxLikeGE, m_SMaxLike(m_Value(), m_Value())));
377+
EXPECT_TRUE(sd_match(CCSMaxLikeGT, m_SMaxLike(m_Value(), m_Value())));
378+
EXPECT_TRUE(sd_match(CCSMaxLikeGE, m_SMaxLike(m_Value(), m_Value())));
379+
EXPECT_TRUE(sd_match(CCSMaxLikeLT, m_SMaxLike(m_Value(), m_Value())));
380+
EXPECT_TRUE(sd_match(CCSMaxLikeLE, m_SMaxLike(m_Value(), m_Value())));
360381
EXPECT_TRUE(sd_match(SMin, m_c_BinOp(ISD::SMIN, m_Value(), m_Value())));
361382
EXPECT_TRUE(sd_match(SMin, m_SMin(m_Value(), m_Value())));
362383
EXPECT_TRUE(sd_match(SMin, m_SMinLike(m_Value(), m_Value())));
363384
EXPECT_TRUE(sd_match(SMinLikeLT, m_SMinLike(m_Value(), m_Value())));
364385
EXPECT_TRUE(sd_match(SMinLikeLE, m_SMinLike(m_Value(), m_Value())));
386+
EXPECT_TRUE(sd_match(CCSMinLikeGT, m_SMinLike(m_Value(), m_Value())));
387+
EXPECT_TRUE(sd_match(CCSMinLikeGE, m_SMinLike(m_Value(), m_Value())));
388+
EXPECT_TRUE(sd_match(CCSMinLikeLT, m_SMinLike(m_Value(), m_Value())));
389+
EXPECT_TRUE(sd_match(CCSMinLikeLE, m_SMinLike(m_Value(), m_Value())));
365390
EXPECT_TRUE(sd_match(UMax, m_c_BinOp(ISD::UMAX, m_Value(), m_Value())));
366391
EXPECT_TRUE(sd_match(UMax, m_UMax(m_Value(), m_Value())));
367392
EXPECT_TRUE(sd_match(UMax, m_UMaxLike(m_Value(), m_Value())));
368393
EXPECT_TRUE(sd_match(UMaxLikeUGT, m_UMaxLike(m_Value(), m_Value())));
369394
EXPECT_TRUE(sd_match(UMaxLikeUGE, m_UMaxLike(m_Value(), m_Value())));
395+
EXPECT_TRUE(sd_match(CCUMaxLikeUGT, m_UMaxLike(m_Value(), m_Value())));
396+
EXPECT_TRUE(sd_match(CCUMaxLikeUGE, m_UMaxLike(m_Value(), m_Value())));
397+
EXPECT_TRUE(sd_match(CCUMaxLikeULT, m_UMaxLike(m_Value(), m_Value())));
398+
EXPECT_TRUE(sd_match(CCUMaxLikeULE, m_UMaxLike(m_Value(), m_Value())));
370399
EXPECT_TRUE(sd_match(UMin, m_c_BinOp(ISD::UMIN, m_Value(), m_Value())));
371400
EXPECT_TRUE(sd_match(UMin, m_UMin(m_Value(), m_Value())));
372401
EXPECT_TRUE(sd_match(UMin, m_UMinLike(m_Value(), m_Value())));
373402
EXPECT_TRUE(sd_match(UMinLikeULT, m_UMinLike(m_Value(), m_Value())));
374403
EXPECT_TRUE(sd_match(UMinLikeULE, m_UMinLike(m_Value(), m_Value())));
404+
EXPECT_TRUE(sd_match(CCUMinLikeUGT, m_UMinLike(m_Value(), m_Value())));
405+
EXPECT_TRUE(sd_match(CCUMinLikeUGE, m_UMinLike(m_Value(), m_Value())));
406+
EXPECT_TRUE(sd_match(CCUMinLikeULT, m_UMinLike(m_Value(), m_Value())));
407+
EXPECT_TRUE(sd_match(CCUMinLikeULE, m_UMinLike(m_Value(), m_Value())));
375408

376409
// By default, it matches any of the results.
377410
EXPECT_TRUE(

0 commit comments

Comments
 (0)