[llvm] [llvm][ValueTracking] ComputeNumSignBitsImpl - add basic handling of BITCAST nodes (PR #97967)

Nhat Nguyen via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 7 14:47:36 PDT 2024


https://github.com/changkhothuychung updated https://github.com/llvm/llvm-project/pull/97967

>From efa8ecadf468a88f79ccb536b636fb864ccfd3cb Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Sun, 7 Jul 2024 14:48:34 -0400
Subject: [PATCH 1/2] initial attempt

---
 llvm/lib/Analysis/ValueTracking.cpp | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 0dbb39d7c8ec4..906dc2abff0f3 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -3599,6 +3599,21 @@ static unsigned ComputeNumSignBitsImpl(const Value *V,
   if (auto *U = dyn_cast<Operator>(V)) {
     switch (Operator::getOpcode(V)) {
     default: break;
+
+    case Intruction::BIT_CAST: {
+      Value *Src = U->getOperand(0);
+      unsigned NumSrcEltBits = Src->getType()->getScalarSizeInBits();
+      if ((NumSrcEltBits % TyBits) != 0)
+        break;
+
+      // fast handling
+      unsigned NumSrcSignBits = ComputeNumSignBits(Src, Depth + 1, Q);
+      if (NumSrcEltBits == NumSrcSignBits)
+        return TyBits;
+
+      break;
+    }
+
     case Instruction::SExt:
       Tmp = TyBits - U->getOperand(0)->getType()->getScalarSizeInBits();
       return ComputeNumSignBits(U->getOperand(0), Depth + 1, Q) + Tmp;

>From b83ce2b4fc33045fb2c4b3d3a4b7dafe58845e04 Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Sun, 7 Jul 2024 17:47:20 -0400
Subject: [PATCH 2/2] typo fix

---
 llvm/lib/Analysis/ValueTracking.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 906dc2abff0f3..2b766c41c4d66 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -3600,7 +3600,7 @@ static unsigned ComputeNumSignBitsImpl(const Value *V,
     switch (Operator::getOpcode(V)) {
     default: break;
 
-    case Intruction::BIT_CAST: {
+    case Instruction::BIT_CAST: {
       Value *Src = U->getOperand(0);
       unsigned NumSrcEltBits = Src->getType()->getScalarSizeInBits();
       if ((NumSrcEltBits % TyBits) != 0)



More information about the llvm-commits mailing list