Skip to content

Commit 3ccf293

Browse files
committed
[DAGCombiner][NFC] Refactor duplicate code to foldSelectToUMin
1 parent d882f5c commit 3ccf293

File tree

1 file changed

+30
-33
lines changed

1 file changed

+30
-33
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1218212208
SDValue 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

Comments
 (0)