[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