@@ -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