@@ -4089,13 +4089,13 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
40894089 }
40904090
40914091 // smax(a,b) - smin(a,b) --> abds(a,b)
4092- if (hasOperation(ISD::ABDS, VT) &&
4092+ if ((!LegalOperations || hasOperation(ISD::ABDS, VT) ) &&
40934093 sd_match(N0, m_SMax(m_Value(A), m_Value(B))) &&
40944094 sd_match(N1, m_SMin(m_Specific(A), m_Specific(B))))
40954095 return DAG.getNode(ISD::ABDS, DL, VT, A, B);
40964096
40974097 // umax(a,b) - umin(a,b) --> abdu(a,b)
4098- if (hasOperation(ISD::ABDU, VT) &&
4098+ if ((!LegalOperations || hasOperation(ISD::ABDU, VT) ) &&
40994099 sd_match(N0, m_UMax(m_Value(A), m_Value(B))) &&
41004100 sd_match(N1, m_UMin(m_Specific(A), m_Specific(B))))
41014101 return DAG.getNode(ISD::ABDU, DL, VT, A, B);
@@ -10922,6 +10922,7 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
1092210922 (Opc0 != ISD::ZERO_EXTEND && Opc0 != ISD::SIGN_EXTEND &&
1092310923 Opc0 != ISD::SIGN_EXTEND_INREG)) {
1092410924 // fold (abs (sub nsw x, y)) -> abds(x, y)
10925+ // Don't fold this for unsupported types as we lose the NSW handling.
1092510926 if (AbsOp1->getFlags().hasNoSignedWrap() && hasOperation(ISD::ABDS, VT) &&
1092610927 TLI.preferABDSToABSWithNSW(VT)) {
1092710928 SDValue ABD = DAG.getNode(ISD::ABDS, DL, VT, Op0, Op1);
@@ -10944,7 +10945,8 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
1094410945 // fold abs(zext(x) - zext(y)) -> zext(abdu(x, y))
1094510946 EVT MaxVT = VT0.bitsGT(VT1) ? VT0 : VT1;
1094610947 if ((VT0 == MaxVT || Op0->hasOneUse()) &&
10947- (VT1 == MaxVT || Op1->hasOneUse()) && hasOperation(ABDOpcode, MaxVT)) {
10948+ (VT1 == MaxVT || Op1->hasOneUse()) &&
10949+ (!LegalOperations || hasOperation(ABDOpcode, MaxVT))) {
1094810950 SDValue ABD = DAG.getNode(ABDOpcode, DL, MaxVT,
1094910951 DAG.getNode(ISD::TRUNCATE, DL, MaxVT, Op0),
1095010952 DAG.getNode(ISD::TRUNCATE, DL, MaxVT, Op1));
@@ -10954,7 +10956,7 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
1095410956
1095510957 // fold abs(sext(x) - sext(y)) -> abds(sext(x), sext(y))
1095610958 // fold abs(zext(x) - zext(y)) -> abdu(zext(x), zext(y))
10957- if (hasOperation(ABDOpcode, VT)) {
10959+ if (!LegalOperations || hasOperation(ABDOpcode, VT)) {
1095810960 SDValue ABD = DAG.getNode(ABDOpcode, DL, VT, Op0, Op1);
1095910961 return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
1096010962 }
@@ -12376,7 +12378,7 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
1237612378 N1.getOperand(1) == N2.getOperand(0)) {
1237712379 bool IsSigned = isSignedIntSetCC(CC);
1237812380 unsigned ABDOpc = IsSigned ? ISD::ABDS : ISD::ABDU;
12379- if (hasOperation(ABDOpc, VT)) {
12381+ if (!LegalOperations || hasOperation(ABDOpc, VT)) {
1238012382 switch (CC) {
1238112383 case ISD::SETGT:
1238212384 case ISD::SETGE:
0 commit comments