@@ -4140,13 +4140,13 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
4140
4140
}
4141
4141
4142
4142
// smax(a,b) - smin(a,b) --> abds(a,b)
4143
- if (hasOperation(ISD::ABDS, VT) &&
4143
+ if ((!LegalOperations || hasOperation(ISD::ABDS, VT) ) &&
4144
4144
sd_match(N0, m_SMax(m_Value(A), m_Value(B))) &&
4145
4145
sd_match(N1, m_SMin(m_Specific(A), m_Specific(B))))
4146
4146
return DAG.getNode(ISD::ABDS, DL, VT, A, B);
4147
4147
4148
4148
// umax(a,b) - umin(a,b) --> abdu(a,b)
4149
- if (hasOperation(ISD::ABDU, VT) &&
4149
+ if ((!LegalOperations || hasOperation(ISD::ABDU, VT) ) &&
4150
4150
sd_match(N0, m_UMax(m_Value(A), m_Value(B))) &&
4151
4151
sd_match(N1, m_UMin(m_Specific(A), m_Specific(B))))
4152
4152
return DAG.getNode(ISD::ABDU, DL, VT, A, B);
@@ -10914,7 +10914,8 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
10914
10914
(Opc0 != ISD::ZERO_EXTEND && Opc0 != ISD::SIGN_EXTEND &&
10915
10915
Opc0 != ISD::SIGN_EXTEND_INREG)) {
10916
10916
// fold (abs (sub nsw x, y)) -> abds(x, y)
10917
- if (AbsOp1->getFlags().hasNoSignedWrap() && hasOperation(ISD::ABDS, VT) &&
10917
+ if (AbsOp1->getFlags().hasNoSignedWrap() &&
10918
+ (!LegalOperations || hasOperation(ISD::ABDS, VT)) &&
10918
10919
TLI.preferABDSToABSWithNSW(VT)) {
10919
10920
SDValue ABD = DAG.getNode(ISD::ABDS, DL, VT, Op0, Op1);
10920
10921
return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
@@ -10936,7 +10937,8 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
10936
10937
// fold abs(zext(x) - zext(y)) -> zext(abdu(x, y))
10937
10938
EVT MaxVT = VT0.bitsGT(VT1) ? VT0 : VT1;
10938
10939
if ((VT0 == MaxVT || Op0->hasOneUse()) &&
10939
- (VT1 == MaxVT || Op1->hasOneUse()) && hasOperation(ABDOpcode, MaxVT)) {
10940
+ (VT1 == MaxVT || Op1->hasOneUse()) &&
10941
+ (!LegalOperations || hasOperation(ABDOpcode, MaxVT))) {
10940
10942
SDValue ABD = DAG.getNode(ABDOpcode, DL, MaxVT,
10941
10943
DAG.getNode(ISD::TRUNCATE, DL, MaxVT, Op0),
10942
10944
DAG.getNode(ISD::TRUNCATE, DL, MaxVT, Op1));
@@ -10946,7 +10948,7 @@ SDValue DAGCombiner::foldABSToABD(SDNode *N, const SDLoc &DL) {
10946
10948
10947
10949
// fold abs(sext(x) - sext(y)) -> abds(sext(x), sext(y))
10948
10950
// fold abs(zext(x) - zext(y)) -> abdu(zext(x), zext(y))
10949
- if (hasOperation(ABDOpcode, VT)) {
10951
+ if (!LegalOperations || hasOperation(ABDOpcode, VT)) {
10950
10952
SDValue ABD = DAG.getNode(ABDOpcode, DL, VT, Op0, Op1);
10951
10953
return DAG.getZExtOrTrunc(ABD, DL, SrcVT);
10952
10954
}
@@ -12315,7 +12317,7 @@ SDValue DAGCombiner::visitVSELECT(SDNode *N) {
12315
12317
N1.getOperand(1) == N2.getOperand(0)) {
12316
12318
bool IsSigned = isSignedIntSetCC(CC);
12317
12319
unsigned ABDOpc = IsSigned ? ISD::ABDS : ISD::ABDU;
12318
- if (hasOperation(ABDOpc, VT)) {
12320
+ if (!LegalOperations || hasOperation(ABDOpc, VT)) {
12319
12321
switch (CC) {
12320
12322
case ISD::SETGT:
12321
12323
case ISD::SETGE:
0 commit comments