[llvm] [InstCombine] SimplifyDemandedBits: add basic bitcast handling, Fixes #173780 (PR #173865)

Ayush Pareek via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 29 09:23:32 PST 2025


https://github.com/ayushpareek2003 updated https://github.com/llvm/llvm-project/pull/173865

>From eb6ca5781a9fced39cd5857564467df06ff65aaf Mon Sep 17 00:00:00 2001
From: Ayush Pareek <AYUSHPAREEK1980 at GMAIL.COM>
Date: Mon, 29 Dec 2025 18:47:32 +0530
Subject: [PATCH 1/5] refactored simplifydemandedBits logic for Mask handling

---
 .../Target/X86/X86InstCombineIntrinsic.cpp    | 25 +++++--------------
 1 file changed, 6 insertions(+), 19 deletions(-)

diff --git a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
index cbfaf0f60333f..a6ac22c5b4bbd 100644
--- a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
+++ b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
@@ -2891,25 +2891,12 @@ X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
       return SelectInst::Create(NewSelector, Op1, Op0, "blendv");
     }
     unsigned BitWidth = Mask->getType()->getScalarSizeInBits();
-
-    if (Mask->getType()->isIntOrIntVectorTy()) {
-      KnownBits Known(BitWidth);
-      if (IC.SimplifyDemandedBits(&II, 2, APInt::getSignMask(BitWidth), Known))
-        return &II;
-    } else if (auto *BC = dyn_cast<BitCastInst>(Mask)) {
-      if (BC->hasOneUse()) {
-        Value *Src = BC->getOperand(0);
-        if (Src->getType()->isIntOrIntVectorTy()) {
-          unsigned SrcBitWidth = Src->getType()->getScalarSizeInBits();
-          if (SrcBitWidth == BitWidth) {
-            KnownBits KnownSrc(SrcBitWidth);
-            if (IC.SimplifyDemandedBits(BC, 0, APInt::getSignMask(SrcBitWidth),
-                                        KnownSrc))
-              return &II;
-          }
-        }
-      }
-    }
+    KnownBits Known(BitWidth);
+    
+    if (IC.SimplifyDemandedBits(&II, 2,
+                                APInt::getSignMask(BitWidth),
+                                Known))
+      return &II;
     Mask = InstCombiner::peekThroughBitcast(Mask);
 
     // Bitshift upto the signbit can always be converted to an efficient

>From d2c72562a7769f538b667486042e5dec60a044db Mon Sep 17 00:00:00 2001
From: Ayush Pareek <AYUSHPAREEK1980 at GMAIL.COM>
Date: Mon, 29 Dec 2025 18:30:41 +0530
Subject: [PATCH 2/5] Enhance SimplifyDemandedBits with bitcast handling

Add support for simplifying demanded bits through lossless bitcasts.
---
 .../InstCombine/InstCombineSimplifyDemanded.cpp  | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 550dfc57a348b..444da7ee1490b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -175,6 +175,22 @@ bool InstCombinerImpl::SimplifyDemandedBits(Instruction *I, unsigned OpNo,
     return false;
   }
 
+  if (auto *BC = dyn_cast<BitCastInst>(VInst)) {
+    Value *Src = BC->getOperand(0);
+    Type *SrcTy = Src->getType();
+    Type *DstTy = BC->getType();
+
+    // Only push demanded bits through lossless bitcasts
+    if (SrcTy->getScalarSizeInBits() ==
+        DstTy->getScalarSizeInBits()) {
+      return SimplifyDemandedBits(I, OpNo,
+                                  DemandedMask,
+                                  Known,
+                                  Q,
+                                  Depth + 1);
+    }
+  }
+
   if (Depth == MaxAnalysisRecursionDepth)
     return false;
 

>From 49ccf7cb2590df980335029a52bad8a991272878 Mon Sep 17 00:00:00 2001
From: Ayush Pareek <AYUSHPAREEK1980 at GMAIL.COM>
Date: Mon, 29 Dec 2025 19:29:45 +0530
Subject: [PATCH 3/5] test for SimplifyDemandedBits bitcast handling

---
 .../simplify-demanded-bits-bitcast.ll         | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100644 llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll

diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll
new file mode 100644
index 0000000000000..73fc12373af48
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll
@@ -0,0 +1,20 @@
+; RUN: opt -passes=instcombine -S %s | FileCheck %s
+
+; this test verifies that SimplifyDemandedBits can peek through
+; lossless bitcasts with identical scalar bit widths.
+
+define i32 @bitcast_signbit_only(i32 %x) {
+; CHECK-LABEL: @bitcast_signbit_only(
+; CHECK-NEXT: ret i32 0
+
+  ; Clear the sign bit explicitly
+  %masked = and i32 %x, 2147483647   ; 0x7fffffff
+
+  ; Bitcast i32 -> float -> i32
+  %f = bitcast i32 %masked to float
+  %bc = bitcast float %f to i32
+
+  ; Use only the sign bit
+  %sign = ashr i32 %bc, 31
+  ret i32 %sign
+}

>From b35924831324f1d58625e009a62c5e4096c13cbd Mon Sep 17 00:00:00 2001
From: Ayush Pareek <AYUSHPAREEK1980 at GMAIL.COM>
Date: Mon, 29 Dec 2025 21:15:10 +0530
Subject: [PATCH 4/5] Update test for SimplifyDemandedBits with bitcasts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Updated the test to use a single v1i32 → i32 bitcast as suggested
This avoids double-bitcast canonicalization and ensures the demanded-bits analysis exercises the bitcast-handling logic added in this patch
---
 .../simplify-demanded-bits-bitcast.ll         | 29 ++++++++-----------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll
index 73fc12373af48..71e47e2bd6d82 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-bits-bitcast.ll
@@ -1,20 +1,15 @@
 ; RUN: opt -passes=instcombine -S %s | FileCheck %s
 
-; this test verifies that SimplifyDemandedBits can peek through
-; lossless bitcasts with identical scalar bit widths.
-
-define i32 @bitcast_signbit_only(i32 %x) {
-; CHECK-LABEL: @bitcast_signbit_only(
-; CHECK-NEXT: ret i32 0
-
-  ; Clear the sign bit explicitly
-  %masked = and i32 %x, 2147483647   ; 0x7fffffff
-
-  ; Bitcast i32 -> float -> i32
-  %f = bitcast i32 %masked to float
-  %bc = bitcast float %f to i32
-
-  ; Use only the sign bit
-  %sign = ashr i32 %bc, 31
-  ret i32 %sign
+define i1 @demanded_signbit_v1i32_bitcast(<1 x i32> %x) {
+; CHECK-LABEL: @demanded_signbit_v1i32_bitcast(
+; CHECK: extractelement <1 x i32>
+; CHECK: icmp slt i32
+; CHECK: ret i1
+
+  ; Single bitcast: v1i32 -> i32
+  %bc = bitcast <1 x i32> %x to i32
+
+  ; Only the sign bit is demanded here
+  %cmp = icmp slt i32 %bc, 0
+  ret i1 %cmp
 }

>From 2f353fe150ce5b394c0a87a9bb946fe178c6d3d8 Mon Sep 17 00:00:00 2001
From: ayush-1024 <ayush at kavida.ai>
Date: Mon, 29 Dec 2025 22:52:40 +0530
Subject: [PATCH 5/5] done

---
 utils/bazel/.bazelignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/utils/bazel/.bazelignore b/utils/bazel/.bazelignore
index 1463bcc9c490e..63a529ff0a933 100644
--- a/utils/bazel/.bazelignore
+++ b/utils/bazel/.bazelignore
@@ -1,2 +1,4 @@
 llvm-project-overlay
 examples
+
+



More information about the llvm-commits mailing list