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

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 18 05:57:13 PDT 2025


https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/154111

Avoid unnecessary (costly) computeKnownBits/ComputeNumSignBits calls - use MaskedValueIsZero instead of computeKnownBits directly to simplify code.

>From a8da17eef3a2ae5828f8d51bde1fd743798121c4 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 18 Aug 2025 13:55:40 +0100
Subject: [PATCH] [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) {



More information about the llvm-commits mailing list