Skip to content

Commit 23de386

Browse files
committed
[DAG] visitSUB - use sd_match to match SUB(MAX,MIN) -> ABD pattern. NFC.
Seriously simplifies the commutation matching logic.
1 parent 11aa95f commit 23de386

File tree

1 file changed

+11
-17
lines changed

1 file changed

+11
-17
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4018,23 +4018,17 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
40184018
}
40194019
}
40204020

4021-
// max(a,b) - min(a,b) --> abd(a,b)
4022-
auto MatchSubMaxMin = [&](unsigned Max, unsigned Min, unsigned Abd) {
4023-
if (N0.getOpcode() != Max || N1.getOpcode() != Min)
4024-
return SDValue();
4025-
if ((N0.getOperand(0) != N1.getOperand(0) ||
4026-
N0.getOperand(1) != N1.getOperand(1)) &&
4027-
(N0.getOperand(0) != N1.getOperand(1) ||
4028-
N0.getOperand(1) != N1.getOperand(0)))
4029-
return SDValue();
4030-
if (!hasOperation(Abd, VT))
4031-
return SDValue();
4032-
return DAG.getNode(Abd, DL, VT, N0.getOperand(0), N0.getOperand(1));
4033-
};
4034-
if (SDValue R = MatchSubMaxMin(ISD::SMAX, ISD::SMIN, ISD::ABDS))
4035-
return R;
4036-
if (SDValue R = MatchSubMaxMin(ISD::UMAX, ISD::UMIN, ISD::ABDU))
4037-
return R;
4021+
// smax(a,b) - smin(a,b) --> abds(a,b)
4022+
if (hasOperation(ISD::ABDS, VT) &&
4023+
sd_match(N0, m_SMax(m_Value(A), m_Value(B))) &&
4024+
sd_match(N1, m_SMin(m_Specific(A), m_Specific(B))))
4025+
return DAG.getNode(ISD::ABDS, DL, VT, A, B);
4026+
4027+
// umax(a,b) - umin(a,b) --> abdu(a,b)
4028+
if (hasOperation(ISD::ABDU, VT) &&
4029+
sd_match(N0, m_UMax(m_Value(A), m_Value(B))) &&
4030+
sd_match(N1, m_UMin(m_Specific(A), m_Specific(B))))
4031+
return DAG.getNode(ISD::ABDU, DL, VT, A, B);
40384032

40394033
return SDValue();
40404034
}

0 commit comments

Comments
 (0)