@@ -397,7 +397,7 @@ namespace {
397397
398398 SDValue foldShiftToAvg(SDNode *N);
399399 // Fold `a bitwiseop (~b +/- c)` -> `a bitwiseop ~(b -/+ c)`
400- SDValue foldBitwiseOpWithNeg(SDNode *N);
400+ SDValue foldBitwiseOpWithNeg(SDNode *N, const SDLoc &DL, EVT VT );
401401
402402 SDValue combineMinNumMaxNum(const SDLoc &DL, EVT VT, SDValue LHS,
403403 SDValue RHS, SDValue True, SDValue False,
@@ -7532,7 +7532,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
75327532
75337533 // Fold (and X, (add (not Y), Z)) -> (and X, (not (sub Y, Z)))
75347534 // Fold (and X, (sub (not Y), Z)) -> (and X, (not (add Y, Z)))
7535- if (SDValue Folded = foldBitwiseOpWithNeg(N))
7535+ if (SDValue Folded = foldBitwiseOpWithNeg(N, DL, VT ))
75367536 return Folded;
75377537
75387538 // Fold (and (srl X, C), 1) -> (srl X, BW-1) for signbit extraction
@@ -8214,7 +8214,7 @@ SDValue DAGCombiner::visitOR(SDNode *N) {
82148214
82158215 // Fold (or X, (add (not Y), Z)) -> (or X, (not (sub Y, Z)))
82168216 // Fold (or X, (sub (not Y), Z)) -> (or X, (not (add Y, Z)))
8217- if (SDValue Folded = foldBitwiseOpWithNeg(N))
8217+ if (SDValue Folded = foldBitwiseOpWithNeg(N, DL, VT ))
82188218 return Folded;
82198219
82208220 // fold (or x, 0) -> x
@@ -9870,7 +9870,7 @@ SDValue DAGCombiner::visitXOR(SDNode *N) {
98709870 }
98719871 // Fold (xor X, (add (not Y), Z)) -> (xor X, (not (sub Y, Z)))
98729872 // Fold (xor X, (sub (not Y), Z)) -> (xor X, (not (add Y, Z)))
9873- if (SDValue Folded = foldBitwiseOpWithNeg(N))
9873+ if (SDValue Folded = foldBitwiseOpWithNeg(N, DL, VT ))
98749874 return Folded;
98759875
98769876 // Simplify: xor (op x...), (op y...) -> (op (xor x, y))
@@ -11625,28 +11625,21 @@ SDValue DAGCombiner::foldShiftToAvg(SDNode *N) {
1162511625 return DAG.getNode(FloorISD, SDLoc(N), N->getValueType(0), {A, B});
1162611626}
1162711627
11628- SDValue DAGCombiner::foldBitwiseOpWithNeg(SDNode *N) {
11628+ SDValue DAGCombiner::foldBitwiseOpWithNeg(SDNode *N, const SDLoc &DL, EVT VT ) {
1162911629 if (!TLI.hasAndNot(SDValue(N, 0)))
1163011630 return SDValue();
1163111631
1163211632 unsigned Opc = N->getOpcode();
11633- if (Opc != ISD::AND && Opc != ISD::OR && Opc != ISD::XOR)
11634- return SDValue();
11635-
11636- SDValue N1 = N->getOperand(1);
11637- EVT VT = N1.getValueType();
11638- SDLoc DL(N);
1163911633 SDValue X, Y, Z, NotY;
11640-
11641- if (sd_match(N, m_c_BinOp(Opc, m_Value(X),
11642- m_Add(m_AllOf(m_Value(NotY), m_Not(m_Value(Y))),
11643- m_Value(Z)))))
11634+ if (sd_match(N, m_BitwiseLogic(m_Value(X), m_Add(m_AllOf(m_Value(NotY),
11635+ m_Not(m_Value(Y))),
11636+ m_Value(Z)))))
1164411637 return DAG.getNode(Opc, DL, VT, X,
1164511638 DAG.getNOT(DL, DAG.getNode(ISD::SUB, DL, VT, Y, Z), VT));
1164611639
11647- if (sd_match(N, m_c_BinOp(Opc, m_Value(X ),
11648- m_Sub(m_AllOf(m_Value(NotY), m_Not(m_Value(Y))),
11649- m_Value(Z)))) &&
11640+ if (sd_match(N, m_BitwiseLogic(m_Value(X), m_Sub(m_AllOf( m_Value(NotY ),
11641+ m_Not(m_Value(Y))),
11642+ m_Value(Z)))) &&
1165011643 NotY->hasOneUse())
1165111644 return DAG.getNode(Opc, DL, VT, X,
1165211645 DAG.getNOT(DL, DAG.getNode(ISD::ADD, DL, VT, Y, Z), VT));
0 commit comments