[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