@@ -4018,23 +4018,17 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
4018
4018
}
4019
4019
}
4020
4020
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);
4038
4032
4039
4033
return SDValue();
4040
4034
}
0 commit comments