[llvm] 4a3f33d - GlobalISel: Fix mishandling vector-as-scalar in return values (#175780)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 22 08:24:12 PST 2026
Author: Matt Arsenault
Date: 2026-01-22T17:24:05+01:00
New Revision: 4a3f33d800c760a9fae244dfebacff0e8df4361c
URL: https://github.com/llvm/llvm-project/commit/4a3f33d800c760a9fae244dfebacff0e8df4361c
DIFF: https://github.com/llvm/llvm-project/commit/4a3f33d800c760a9fae244dfebacff0e8df4361c.diff
LOG: GlobalISel: Fix mishandling vector-as-scalar in return values (#175780)
This fixes 2 cases when the AMDGPU ABI is fixed to pass <2 x i16>
values as packed on gfx6/gfx7. The ABI does not pack values
currently; this is a pre-fix for that change.
Insert a bitcast if there is a single part with a different size.
Previously this would miscompile by going through the scalarization
and extend path, dropping the high element.
Also fix assertions in odd cases, like <3 x i16> -> i32. This needs
to unmerge with excess elements from the widened source vector.
All of this code is in need of a cleanup; this should look more
like the DAG version using getVectorTypeBreakdown.
Added:
Modified:
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
index e2ed45eec0ecd..66b6570e7659c 100644
--- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
@@ -568,6 +568,13 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
const TypeSize PartSize = PartTy.getSizeInBits();
+ if (PartSize == SrcTy.getSizeInBits() && DstRegs.size() == 1) {
+ // TODO: Handle int<->ptr casts. It just happens the ABI lowering
+ // assignments are not pointer aware.
+ B.buildBitcast(DstRegs[0], SrcReg);
+ return;
+ }
+
if (PartTy.isVector() == SrcTy.isVector() &&
PartTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits()) {
assert(DstRegs.size() == 1);
@@ -576,7 +583,8 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
}
if (SrcTy.isVector() && !PartTy.isVector() &&
- TypeSize::isKnownGT(PartSize, SrcTy.getElementType().getSizeInBits())) {
+ TypeSize::isKnownGT(PartSize, SrcTy.getElementType().getSizeInBits()) &&
+ SrcTy.getElementCount() == ElementCount::getFixed(DstRegs.size())) {
// Vector was scalarized, and the elements extended.
auto UnmergeToEltTy = B.buildUnmerge(SrcTy.getElementType(), SrcReg);
for (int i = 0, e = DstRegs.size(); i != e; ++i)
@@ -614,9 +622,21 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
MachineRegisterInfo &MRI = *B.getMRI();
LLT DstTy = MRI.getType(DstRegs[0]);
- LLT LCMTy = getCoverTy(SrcTy, PartTy);
+ LLT CoverTy = getCoverTy(SrcTy, PartTy);
+ if (SrcTy.isVector() && DstRegs.size() > 1) {
+ TypeSize FullCoverSize =
+ DstTy.getSizeInBits().multiplyCoefficientBy(DstRegs.size());
+
+ LLT EltTy = SrcTy.getElementType();
+ TypeSize EltSize = EltTy.getSizeInBits();
+ if (FullCoverSize.isKnownMultipleOf(EltSize)) {
+ TypeSize VecSize = FullCoverSize.divideCoefficientBy(EltSize);
+ CoverTy =
+ LLT::vector(ElementCount::get(VecSize, VecSize.isScalable()), EltTy);
+ }
+ }
- if (PartTy.isVector() && LCMTy == PartTy) {
+ if (PartTy.isVector() && CoverTy == PartTy) {
assert(DstRegs.size() == 1);
B.buildPadVectorWithUndefElements(DstRegs[0], SrcReg);
return;
@@ -624,11 +644,11 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
const unsigned DstSize = DstTy.getSizeInBits();
const unsigned SrcSize = SrcTy.getSizeInBits();
- unsigned CoveringSize = LCMTy.getSizeInBits();
+ unsigned CoveringSize = CoverTy.getSizeInBits();
Register UnmergeSrc = SrcReg;
- if (!LCMTy.isVector() && CoveringSize != SrcSize) {
+ if (!CoverTy.isVector() && CoveringSize != SrcSize) {
// For scalars, it's common to be able to use a simple extension.
if (SrcTy.isScalar() && DstTy.isScalar()) {
CoveringSize = alignTo(SrcSize, DstSize);
@@ -641,12 +661,12 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
SmallVector<Register, 8> MergeParts(1, SrcReg);
for (unsigned Size = SrcSize; Size != CoveringSize; Size += SrcSize)
MergeParts.push_back(Undef);
- UnmergeSrc = B.buildMergeLikeInstr(LCMTy, MergeParts).getReg(0);
+ UnmergeSrc = B.buildMergeLikeInstr(CoverTy, MergeParts).getReg(0);
}
}
- if (LCMTy.isVector() && CoveringSize != SrcSize)
- UnmergeSrc = B.buildPadVectorWithUndefElements(LCMTy, SrcReg).getReg(0);
+ if (CoverTy.isVector() && CoveringSize != SrcSize)
+ UnmergeSrc = B.buildPadVectorWithUndefElements(CoverTy, SrcReg).getReg(0);
B.buildUnmerge(DstRegs, UnmergeSrc);
}
More information about the llvm-commits
mailing list