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

via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 29 05:23:37 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: Ayush Pareek (ayushpareek2003)

<details>
<summary>Changes</summary>

this patch teaches InstCombine's SimplifyDemandedBits to peek through lossless bitcasts with identical scalar bit widths. This avoids the need for target-specific handling of bitcasted masks (e.g. X86 blend intrinsics).
Fixes #<!-- -->173780


---
Full diff: https://github.com/llvm/llvm-project/pull/173865.diff


2 Files Affected:

- (modified) llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp (+6-19) 
- (modified) llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp (+16) 


``````````diff
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
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;
 

``````````

</details>


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


More information about the llvm-commits mailing list