[DAG] visitTRUNCATE - early out from computeKnownBits/ComputeNumSignBits failures. NFC. (#154111)

Avoid unnecessary (costly) computeKnownBits/ComputeNumSignBits calls - use MaskedValueIsZero instead of computeKnownBits directly to simplify code.
This commit is contained in:
Simon Pilgrim 2025-08-18 14:55:09 +01:00 committed by GitHub
parent 81c06d198e
commit 858d1dfa2c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -16332,25 +16332,22 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
// (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b)) // (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b))
if ((!LegalOperations || N0.hasOneUse()) && if ((!LegalOperations || N0.hasOneUse()) &&
TLI.isOperationLegal(N0.getOpcode(), VT)) { TLI.isOperationLegal(N0.getOpcode(), VT)) {
EVT SrcVT = N0.getValueType();
EVT TruncVT = VT; EVT TruncVT = VT;
unsigned SrcBits = SrcVT.getScalarSizeInBits(); unsigned SrcBits = SrcVT.getScalarSizeInBits();
unsigned TruncBits = TruncVT.getScalarSizeInBits(); unsigned TruncBits = TruncVT.getScalarSizeInBits();
unsigned NeededBits = SrcBits - TruncBits;
SDValue A = N0.getOperand(0); SDValue A = N0.getOperand(0);
SDValue B = N0.getOperand(1); SDValue B = N0.getOperand(1);
bool CanFold = false; bool CanFold = false;
if (N0.getOpcode() == ISD::ABDU) { if (N0.getOpcode() == ISD::ABDU) {
KnownBits KnownA = DAG.computeKnownBits(A); APInt UpperBits = APInt::getBitsSetFrom(SrcBits, TruncBits);
KnownBits KnownB = DAG.computeKnownBits(B); CanFold = DAG.MaskedValueIsZero(B, UpperBits) &&
CanFold = KnownA.countMinLeadingZeros() >= NeededBits && DAG.MaskedValueIsZero(A, UpperBits);
KnownB.countMinLeadingZeros() >= NeededBits;
} else { } else {
unsigned SignBitsA = DAG.ComputeNumSignBits(A); unsigned NeededBits = SrcBits - TruncBits;
unsigned SignBitsB = DAG.ComputeNumSignBits(B); CanFold = DAG.ComputeNumSignBits(B) > NeededBits &&
CanFold = SignBitsA > NeededBits && SignBitsB > NeededBits; DAG.ComputeNumSignBits(A) > NeededBits;
} }
if (CanFold) { if (CanFold) {