@@ -609,6 +609,8 @@ namespace {
609609 SDValue foldABSToABD(SDNode *N, const SDLoc &DL);
610610 SDValue foldSelectToABD(SDValue LHS, SDValue RHS, SDValue True,
611611 SDValue False, ISD::CondCode CC, const SDLoc &DL);
612+ SDValue foldSelectToUMin(SDValue LHS, SDValue RHS, SDValue True,
613+ SDValue False, ISD::CondCode CC, const SDLoc &DL);
612614 SDValue unfoldMaskedMerge(SDNode *N);
613615 SDValue unfoldExtremeBitClearingToShifts(SDNode *N);
614616 SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond,
@@ -12179,6 +12181,30 @@ SDValue DAGCombiner::foldSelectToABD(SDValue LHS, SDValue RHS, SDValue True,
1217912181 return SDValue();
1218012182}
1218112183
12184+ // ([v]select (ugt x, C), (add x, ~C), x) -> (umin (add x, ~C), x)
12185+ // ([v]select (ult x, C), x, (add x, -C)) -> (umin x, (add x, -C))
12186+ SDValue DAGCombiner::foldSelectToUMin(SDValue LHS, SDValue RHS, SDValue True,
12187+ SDValue False, ISD::CondCode CC,
12188+ const SDLoc &DL) {
12189+ APInt C;
12190+ EVT VT = True.getValueType();
12191+ if (sd_match(RHS, m_ConstInt(C)) && hasUMin(VT)) {
12192+ if (CC == ISD::SETUGT && LHS == False &&
12193+ sd_match(True, m_Add(m_Specific(False), m_SpecificInt(~C)))) {
12194+ SDValue AddC = DAG.getConstant(~C, DL, VT);
12195+ SDValue Add = DAG.getNode(ISD::ADD, DL, VT, False, AddC);
12196+ return DAG.getNode(ISD::UMIN, DL, VT, Add, False);
12197+ }
12198+ if (CC == ISD::SETULT && LHS == True &&
12199+ sd_match(False, m_Add(m_Specific(True), m_SpecificInt(-C)))) {
12200+ SDValue AddC = DAG.getConstant(-C, DL, VT);
12201+ SDValue Add = DAG.getNode(ISD::ADD, DL, VT, True, AddC);
12202+ return DAG.getNode(ISD::UMIN, DL, VT, True, Add);
12203+ }
12204+ }
12205+ return SDValue();
12206+ }
12207+
1218212208SDValue DAGCombiner::visitSELECT(SDNode *N) {
1218312209 SDValue N0 = N->getOperand(0);
1218412210 SDValue N1 = N->getOperand(1);
@@ -12364,24 +12390,8 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
1236412390
1236512391 // (select (ugt x, C), (add x, ~C), x) -> (umin (add x, ~C), x)
1236612392 // (select (ult x, C), x, (add x, -C)) -> (umin x, (add x, -C))
12367- APInt C;
12368- if (sd_match(Cond1, m_ConstInt(C)) && hasUMin(VT)) {
12369- if (CC == ISD::SETUGT && Cond0 == N2 &&
12370- sd_match(N1, m_Add(m_Specific(N2), m_SpecificInt(~C)))) {
12371- // The resulting code relies on an unsigned wrap in ADD.
12372- // Recreating ADD to drop possible nuw/nsw flags.
12373- SDValue AddC = DAG.getConstant(~C, DL, VT);
12374- SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N2, AddC);
12375- return DAG.getNode(ISD::UMIN, DL, VT, Add, N2);
12376- }
12377- if (CC == ISD::SETULT && Cond0 == N1 &&
12378- sd_match(N2, m_Add(m_Specific(N1), m_SpecificInt(-C)))) {
12379- // Ditto.
12380- SDValue AddC = DAG.getConstant(-C, DL, VT);
12381- SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, AddC);
12382- return DAG.getNode(ISD::UMIN, DL, VT, N1, Add);
12383- }
12384- }
12393+ if (SDValue UMin = foldSelectToUMin(Cond0, Cond1, N1, N2, CC, DL))
12394+ return UMin;
1238512395 }
1238612396
1238712397 if (!VT.isVector())
@@ -13421,21 +13431,8 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
1342113431
1342213432 // (vselect (ugt x, C), (add x, ~C), x) -> (umin (add x, ~C), x)
1342313433 // (vselect (ult x, C), x, (add x, -C)) -> (umin x, (add x, -C))
13424- APInt C;
13425- if (sd_match(RHS, m_ConstInt(C)) && hasUMin(VT)) {
13426- if (CC == ISD::SETUGT && LHS == N2 &&
13427- sd_match(N1, m_Add(m_Specific(N2), m_SpecificInt(~C)))) {
13428- SDValue AddC = DAG.getConstant(~C, DL, VT);
13429- SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N2, AddC);
13430- return DAG.getNode(ISD::UMIN, DL, VT, Add, N2);
13431- }
13432- if (CC == ISD::SETULT && LHS == N1 &&
13433- sd_match(N2, m_Add(m_Specific(N1), m_SpecificInt(-C)))) {
13434- SDValue AddC = DAG.getConstant(-C, DL, VT);
13435- SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, AddC);
13436- return DAG.getNode(ISD::UMIN, DL, VT, N1, Add);
13437- }
13438- }
13434+ if (SDValue UMin = foldSelectToUMin(LHS, RHS, N1, N2, CC, DL))
13435+ return UMin;
1343913436 }
1344013437
1344113438 if (SimplifySelectOps(N, N1, N2))
0 commit comments