@@ -16279,40 +16279,6 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1627916279 // because targets may prefer a wider type during later combines and invert
1628016280 // this transform.
1628116281 switch (N0.getOpcode()) {
16282- case ISD::AVGCEILU:
16283- case ISD::AVGFLOORU:
16284- if (!LegalOperations && N0.hasOneUse() &&
16285- TLI.isOperationLegal(N0.getOpcode(), VT)) {
16286- SDValue X = N0.getOperand(0);
16287- SDValue Y = N0.getOperand(1);
16288- unsigned SrcBits = X.getScalarValueSizeInBits();
16289- unsigned DstBits = VT.getScalarSizeInBits();
16290- APInt UpperBits = APInt::getBitsSetFrom(SrcBits, DstBits);
16291- if (DAG.MaskedValueIsZero(X, UpperBits) &&
16292- DAG.MaskedValueIsZero(Y, UpperBits)) {
16293- SDValue Tx = DAG.getNode(ISD::TRUNCATE, DL, VT, X);
16294- SDValue Ty = DAG.getNode(ISD::TRUNCATE, DL, VT, Y);
16295- return DAG.getNode(N0.getOpcode(), DL, VT, Tx, Ty);
16296- }
16297- }
16298- break;
16299- case ISD::AVGCEILS:
16300- case ISD::AVGFLOORS:
16301- if (!LegalOperations && N0.hasOneUse() &&
16302- TLI.isOperationLegal(N0.getOpcode(), VT)) {
16303- SDValue X = N0.getOperand(0);
16304- SDValue Y = N0.getOperand(1);
16305- unsigned SrcBits = X.getScalarValueSizeInBits();
16306- unsigned DstBits = VT.getScalarSizeInBits();
16307- unsigned NeededSignBits = SrcBits - DstBits + 1;
16308- if (DAG.ComputeNumSignBits(X) >= NeededSignBits &&
16309- DAG.ComputeNumSignBits(Y) >= NeededSignBits) {
16310- SDValue Tx = DAG.getNode(ISD::TRUNCATE, DL, VT, X);
16311- SDValue Ty = DAG.getNode(ISD::TRUNCATE, DL, VT, Y);
16312- return DAG.getNode(N0.getOpcode(), DL, VT, Tx, Ty);
16313- }
16314- }
16315- break;
1631616282 case ISD::ADD:
1631716283 case ISD::SUB:
1631816284 case ISD::MUL:
@@ -16361,10 +16327,15 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1636116327 DAG, DL);
1636216328 }
1636316329 break;
16364- case ISD::ABDU:
16330+ case ISD::AVGFLOORS:
16331+ case ISD::AVGFLOORU:
16332+ case ISD::AVGCEILS:
16333+ case ISD::AVGCEILU:
1636516334 case ISD::ABDS:
16335+ case ISD::ABDU:
16336+ // (trunc (avg a, b)) -> (avg (trunc a), (trunc b))
1636616337 // (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b))
16367- if (( !LegalOperations || N0.hasOneUse() ) &&
16338+ if (!LegalOperations && N0.hasOneUse() &&
1636816339 TLI.isOperationLegal(N0.getOpcode(), VT)) {
1636916340 EVT TruncVT = VT;
1637016341 unsigned SrcBits = SrcVT.getScalarSizeInBits();
@@ -16374,7 +16345,8 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1637416345 SDValue B = N0.getOperand(1);
1637516346 bool CanFold = false;
1637616347
16377- if (N0.getOpcode() == ISD::ABDU) {
16348+ if (N0.getOpcode() == ISD::AVGFLOORU || N0.getOpcode() == ISD::AVGCEILU ||
16349+ N0.getOpcode() == ISD::ABDU) {
1637816350 APInt UpperBits = APInt::getBitsSetFrom(SrcBits, TruncBits);
1637916351 CanFold = DAG.MaskedValueIsZero(B, UpperBits) &&
1638016352 DAG.MaskedValueIsZero(A, UpperBits);
0 commit comments