@@ -16332,25 +16332,22 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
1633216332 // (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b))
1633316333 if ((!LegalOperations || N0.hasOneUse()) &&
1633416334 TLI.isOperationLegal(N0.getOpcode(), VT)) {
16335- EVT SrcVT = N0.getValueType();
1633616335 EVT TruncVT = VT;
1633716336 unsigned SrcBits = SrcVT.getScalarSizeInBits();
1633816337 unsigned TruncBits = TruncVT.getScalarSizeInBits();
16339- unsigned NeededBits = SrcBits - TruncBits;
1634016338
1634116339 SDValue A = N0.getOperand(0);
1634216340 SDValue B = N0.getOperand(1);
1634316341 bool CanFold = false;
1634416342
1634516343 if (N0.getOpcode() == ISD::ABDU) {
16346- KnownBits KnownA = DAG.computeKnownBits(A);
16347- KnownBits KnownB = DAG.computeKnownBits(B);
16348- CanFold = KnownA.countMinLeadingZeros() >= NeededBits &&
16349- KnownB.countMinLeadingZeros() >= NeededBits;
16344+ APInt UpperBits = APInt::getBitsSetFrom(SrcBits, TruncBits);
16345+ CanFold = DAG.MaskedValueIsZero(B, UpperBits) &&
16346+ DAG.MaskedValueIsZero(A, UpperBits);
1635016347 } else {
16351- unsigned SignBitsA = DAG.ComputeNumSignBits(A) ;
16352- unsigned SignBitsB = DAG.ComputeNumSignBits(B);
16353- CanFold = SignBitsA > NeededBits && SignBitsB > NeededBits;
16348+ unsigned NeededBits = SrcBits - TruncBits ;
16349+ CanFold = DAG.ComputeNumSignBits(B) > NeededBits &&
16350+ DAG.ComputeNumSignBits(A) > NeededBits;
1635416351 }
1635516352
1635616353 if (CanFold) {
0 commit comments