Skip to content

Commit deb8a47

Browse files
committed
[AMDGPU][GlobalISel] Properly handle lane op legalization for larger vector types
1 parent 5073b5f commit deb8a47

File tree

6 files changed

+2767
-34
lines changed

6 files changed

+2767
-34
lines changed

llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5565,6 +5565,7 @@ bool AMDGPULegalizerInfo::legalizeLaneOp(LegalizerHelper &Helper,
55655565
return false;
55665566

55675567
LLT PartialResTy = LLT::scalar(SplitSize);
5568+
bool NeedsBitcast = false;
55685569
if (Ty.isVector()) {
55695570
LLT EltTy = Ty.getElementType();
55705571
unsigned EltSize = EltTy.getSizeInBits();
@@ -5573,8 +5574,10 @@ bool AMDGPULegalizerInfo::legalizeLaneOp(LegalizerHelper &Helper,
55735574
} else if (EltSize == 16 || EltSize == 32) {
55745575
unsigned NElem = SplitSize / EltSize;
55755576
PartialResTy = Ty.changeElementCount(ElementCount::getFixed(NElem));
5577+
} else {
5578+
// Handle all other cases via S32/S64 pieces
5579+
NeedsBitcast = true;
55765580
}
5577-
// Handle all other cases via S32/S64 pieces;
55785581
}
55795582

55805583
SmallVector<Register, 4> PartialRes;
@@ -5600,7 +5603,12 @@ bool AMDGPULegalizerInfo::legalizeLaneOp(LegalizerHelper &Helper,
56005603
PartialRes.push_back(createLaneOp(Src0, Src1, Src2, PartialResTy));
56015604
}
56025605

5603-
B.buildMergeLikeInstr(DstReg, PartialRes);
5606+
if (NeedsBitcast)
5607+
B.buildBitcast(DstReg, B.buildMergeLikeInstr(
5608+
LLT::scalar(Ty.getSizeInBits()), PartialRes));
5609+
else
5610+
B.buildMergeLikeInstr(DstReg, PartialRes);
5611+
56045612
MI.eraseFromParent();
56055613
return true;
56065614
}

0 commit comments

Comments
 (0)