[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