[llvm] [VectorCombine] Handle widening/narrowing bitcasts in foldShuffleToIdentity (PR #187870)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 30 06:43:35 PDT 2026
================
@@ -3714,13 +3760,76 @@ bool VectorCombine::foldShuffleToIdentity(Instruction &I) {
Worklist.push_back(generateInstLaneVectorFromOperand(Item, 0));
continue;
} else if (auto *BitCast = dyn_cast<BitCastInst>(FrontU)) {
- // TODO: Handle vector widening/narrowing bitcasts.
- auto *DstTy = dyn_cast<FixedVectorType>(BitCast->getDestTy());
- auto *SrcTy = dyn_cast<FixedVectorType>(BitCast->getSrcTy());
- if (DstTy && SrcTy &&
- SrcTy->getNumElements() == DstTy->getNumElements()) {
- Worklist.push_back(generateInstLaneVectorFromOperand(Item, 0));
- continue;
+ auto *BCDstTy = dyn_cast<FixedVectorType>(BitCast->getDestTy());
+ auto *BCSrcTy = dyn_cast<FixedVectorType>(BitCast->getSrcTy());
+ if (BCDstTy && BCSrcTy) {
+ unsigned DstElts = BCDstTy->getNumElements();
+ unsigned SrcElts = BCSrcTy->getNumElements();
+ if (DstElts == SrcElts) {
+ // Same element count - simple pass-through.
+ Worklist.push_back(generateInstLaneVectorFromOperand(Item, 0));
+ continue;
+ }
+ if (DstElts > SrcElts && DstElts % SrcElts == 0 &&
+ Item.size() % (DstElts / SrcElts) == 0) {
----------------
arsenm wrote:
I think the size % check is redundant. The total size is known the same since it started as a bitcast
https://github.com/llvm/llvm-project/pull/187870
More information about the llvm-commits
mailing list