@@ -4091,13 +4091,13 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
40914091 }
40924092
40934093 // smax(a,b) - smin(a,b) --> abds(a,b)
4094- if (hasOperation(ISD::ABDS, VT) &&
4094+ if ((!LegalOperations || hasOperation(ISD::ABDS, VT) ) &&
40954095 sd_match(N0, m_SMax(m_Value(A), m_Value(B))) &&
40964096 sd_match(N1, m_SMin(m_Specific(A), m_Specific(B))))
40974097 return DAG.getNode(ISD::ABDS, DL, VT, A, B);
40984098
40994099 // umax(a,b) - umin(a,b) --> abdu(a,b)
4100- if (hasOperation(ISD::ABDU, VT) &&
4100+ if ((!LegalOperations || hasOperation(ISD::ABDU, VT) ) &&
41014101 sd_match(N0, m_UMax(m_Value(A), m_Value(B))) &&
41024102 sd_match(N1, m_UMin(m_Specific(A), m_Specific(B))))
41034103 return DAG.getNode(ISD::ABDU, DL, VT, A, B);
@@ -5263,6 +5263,10 @@ SDValue DAGCombiner::visitABD(SDNode *N) {
52635263 if (N0.isUndef() || N1.isUndef())
52645264 return DAG.getConstant(0, DL, VT);
52655265
5266+ // fold (abd x, x) -> 0
5267+ if (N0 == N1)
5268+ return DAG.getConstant(0, DL, VT);
5269+
52665270 SDValue X;
52675271
52685272 // fold (abds x, 0) -> abs x
@@ -10924,6 +10928,7 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
1092410928 (Opc0 != ISD::ZERO_EXTEND && Opc0 != ISD::SIGN_EXTEND &&
1092510929 Opc0 != ISD::SIGN_EXTEND_INREG)) {
1092610930 // fold (abs (sub nsw x, y)) -> abds(x, y)
10931+ // Don't fold this for unsupported types as we lose the NSW handling.
1092710932 if (AbsOp1->getFlags().hasNoSignedWrap() && hasOperation(ISD::ABDS, VT) &&
1092810933 TLI.preferABDSToABSWithNSW(VT)) {
1092910934 SDValue ABD = DAG.getNode(ISD::ABDS, DL, VT, Op0, Op1);
@@ -10946,7 +10951,8 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
1094610951 // fold abs(zext(x) - zext(y)) -> zext(abdu(x, y))
1094710952 EVT MaxVT = VT0.bitsGT(VT1) ? VT0 : VT1;
1094810953 if ((VT0 == MaxVT || Op0->hasOneUse()) &&
10949- (VT1 == MaxVT || Op1->hasOneUse()) && hasOperation(ABDOpcode, MaxVT)) {
10954+ (VT1 == MaxVT || Op1->hasOneUse()) &&
10955+ (!LegalTypes || hasOperation(ABDOpcode, MaxVT))) {
1095010956 SDValue ABD = DAG.getNode(ABDOpcode, DL, MaxVT,
1095110957 DAG.getNode(ISD::TRUNCATE, DL, MaxVT, Op0),
1095210958 DAG.getNode(ISD::TRUNCATE, DL, MaxVT, Op1));
@@ -10956,7 +10962,7 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
1095610962
1095710963 // fold abs(sext(x) - sext(y)) -> abds(sext(x), sext(y))
1095810964 // fold abs(zext(x) - zext(y)) -> abdu(zext(x), zext(y))
10959- if (hasOperation(ABDOpcode, VT)) {
10965+ if (!LegalOperations || hasOperation(ABDOpcode, VT)) {
1096010966 SDValue ABD = DAG.getNode(ABDOpcode, DL, VT, Op0, Op1);
1096110967 return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
1096210968 }
@@ -11580,7 +11586,7 @@ SDValue DAGCombiner::foldSelectToABD(SDValue LHS, SDValue RHS, SDValue True,
1158011586 unsigned ABDOpc = IsSigned ? ISD::ABDS : ISD::ABDU;
1158111587 EVT VT = LHS.getValueType();
1158211588
11583- if (!hasOperation(ABDOpc, VT))
11589+ if (LegalOperations && !hasOperation(ABDOpc, VT))
1158411590 return SDValue();
1158511591
1158611592 switch (CC) {
0 commit comments