[llvm] GlobalISel: Fix mishandling vector-as-scalar in return values (PR #175780)

Petar Avramovic via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 22 03:28:17 PST 2026


================
@@ -645,9 +654,22 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
     }
   }
 
-  if (LCMTy.isVector() && CoveringSize != SrcSize)
+  if (LCMTy.isVector() && CoveringSize != SrcSize) {
     UnmergeSrc = B.buildPadVectorWithUndefElements(LCMTy, SrcReg).getReg(0);
 
+    unsigned ExcessBits = CoveringSize - DstSize * DstRegs.size();
+    if (ExcessBits != 0) {
+      SmallVector<Register, 8> PaddedDstRegs(DstRegs.begin(), DstRegs.end());
+
+      MachineRegisterInfo &MRI = *B.getMRI();
+      for (unsigned I = 0; I != ExcessBits; I += PartSize)
+        PaddedDstRegs.push_back(MRI.createGenericVirtualRegister(PartTy));
+
+      B.buildUnmerge(PaddedDstRegs, UnmergeSrc);
+      return;
+    }
+  }
----------------
petar-avramovic wrote:

```
    %23:_(s16), %24:_(s16), %25:_(s16) = G_UNMERGE_VALUES %20(<3 x s16>)
    %26:_(s16) = G_IMPLICIT_DEF
    %27:_(<6 x s16>) = G_BUILD_VECTOR %23(s16), %24(s16), %25(s16), %26(s16), %26(s16), %26(s16)
    %21:_(s32), %22:_(s32), %28:_(s32) = G_UNMERGE_VALUES %27(<6 x s16>)
    $vgpr0 = COPY %21(s32)
    $vgpr1 = COPY %22(s32)
```
Not sure how this part is meant to work but padding DstRegs looks wrong
it is asked to return
<3 x s16>
in 2 s32 (DstRegs)
LCMTy is making larger type then needed it seems
and we return in more registers then target asked
`SmallVector<Register, 8> PaddedDstRegs(DstRegs.begin(), DstRegs.end());`

This might be getting into target specific territory 
Instead of LCMTy
need to calculate with how maybe elements to pad SrcTy to to have its size equal to `(DstRegs.size() * PartTy.getSizeInBits())`


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


More information about the llvm-commits mailing list