From a8da17eef3a2ae5828f8d51bde1fd743798121c4 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Mon, 18 Aug 2025 13:55:40 +0100 Subject: [PATCH 1/2] [DAG] visitTRUNCATE - early out from computeKnownBits/ComputeNumSignBits failures. NFC. Avoid unnecessary (costly) computeKnownBits/ComputeNumSignBits calls - use MaskedValueIsZero instead of computeKnownBits directly to simplify code. --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 785245b2d9e74..0e63f051b1d65 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -16332,25 +16332,22 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) { // (trunc (abdu/abds a, b)) -> (abdu/abds (trunc a), (trunc b)) if ((!LegalOperations || N0.hasOneUse()) && TLI.isOperationLegal(N0.getOpcode(), VT)) { - EVT SrcVT = N0.getValueType(); EVT TruncVT = VT; unsigned SrcBits = SrcVT.getScalarSizeInBits(); unsigned TruncBits = TruncVT.getScalarSizeInBits(); - unsigned NeededBits = SrcBits - TruncBits; SDValue A = N0.getOperand(0); SDValue B = N0.getOperand(1); bool CanFold = false; if (N0.getOpcode() == ISD::ABDU) { - KnownBits KnownA = DAG.computeKnownBits(A); - KnownBits KnownB = DAG.computeKnownBits(B); - CanFold = KnownA.countMinLeadingZeros() >= NeededBits && - KnownB.countMinLeadingZeros() >= NeededBits; + APInt UpperBits = APInt::getBitsSetFrom(SrcBits, TruncBits); + CanFold = DAG.MaskedValueIsZero(A, UpperBits) && + DAG.MaskedValueIsZero(B, UpperBits); } else { - unsigned SignBitsA = DAG.ComputeNumSignBits(A); - unsigned SignBitsB = DAG.ComputeNumSignBits(B); - CanFold = SignBitsA > NeededBits && SignBitsB > NeededBits; + unsigned NeededBits = SrcBits - TruncBits; + CanFold = DAG.ComputeNumSignBits(A) > NeededBits && + DAG.ComputeNumSignBits(B) > NeededBits; } if (CanFold) { From 3fb4dae2121ed3a0d4e6ed06a44a55d8ee1c2117 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Mon, 18 Aug 2025 14:19:29 +0100 Subject: [PATCH 2/2] Early out from the RHS first - more likely to be constant --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 0e63f051b1d65..43d4138df8b49 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -16342,12 +16342,12 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) { if (N0.getOpcode() == ISD::ABDU) { APInt UpperBits = APInt::getBitsSetFrom(SrcBits, TruncBits); - CanFold = DAG.MaskedValueIsZero(A, UpperBits) && - DAG.MaskedValueIsZero(B, UpperBits); + CanFold = DAG.MaskedValueIsZero(B, UpperBits) && + DAG.MaskedValueIsZero(A, UpperBits); } else { unsigned NeededBits = SrcBits - TruncBits; - CanFold = DAG.ComputeNumSignBits(A) > NeededBits && - DAG.ComputeNumSignBits(B) > NeededBits; + CanFold = DAG.ComputeNumSignBits(B) > NeededBits && + DAG.ComputeNumSignBits(A) > NeededBits; } if (CanFold) {