Skip to content

Commit 627bb31

Browse files
committed
AMDGPU/GlobalISel: Avoid illegal vector exts for add/sub/mul
When expanding scalar packed operations, we should not introduce illegal vector casts LegalizerHelper introduces. We're not in a legalizer context, and there's no RegBankSelect apply or legalize worklist.
1 parent ed72bca commit 627bb31

File tree

3 files changed

+397
-18
lines changed

3 files changed

+397
-18
lines changed

llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,20 +2096,24 @@ void AMDGPURegisterBankInfo::applyMappingImpl(
20962096
MachineIRBuilder B(MI);
20972097
ApplyRegBankMapping ApplySALU(*this, MRI, &AMDGPU::SGPRRegBank);
20982098
GISelObserverWrapper Observer(&ApplySALU);
2099-
LegalizerHelper Helper(*MF, Observer, B);
21002099

21012100
if (DstTy.isVector()) {
2102-
// FIXME: Multi-step legalization is awkward here. We're relying on the
2103-
// fact that widenScalar leaves the instruction in place in this case, and
2104-
// we have to do it in this order.
2105-
if (Helper.widenScalar(MI, 0, LLT::vector(2, 32)) !=
2106-
LegalizerHelper::Legalized)
2107-
llvm_unreachable("widen scalar should have succeeded");
2101+
B.setChangeObserver(Observer);
21082102

2109-
if (Helper.fewerElementsVector(MI, 0, S32) != LegalizerHelper::Legalized)
2110-
llvm_unreachable("fewerElementsVector should have succeeded");
2103+
Register WideSrc0Lo, WideSrc0Hi;
2104+
Register WideSrc1Lo, WideSrc1Hi;
21112105

2106+
std::tie(WideSrc0Lo, WideSrc0Hi)
2107+
= unpackV2S16ToS32(B, MI.getOperand(1).getReg(), AMDGPU::G_ANYEXT);
2108+
std::tie(WideSrc1Lo, WideSrc1Hi)
2109+
= unpackV2S16ToS32(B, MI.getOperand(2).getReg(), AMDGPU::G_ANYEXT);
2110+
auto Lo = B.buildInstr(MI.getOpcode(), {S32}, {WideSrc0Lo, WideSrc1Lo});
2111+
auto Hi = B.buildInstr(MI.getOpcode(), {S32}, {WideSrc0Hi, WideSrc1Hi});
2112+
B.buildBuildVectorTrunc(DstReg, {Lo.getReg(0), Hi.getReg(0)});
2113+
MI.eraseFromParent();
21122114
} else {
2115+
LegalizerHelper Helper(*MF, Observer, B);
2116+
21132117
if (Helper.widenScalar(MI, 0, S32) != LegalizerHelper::Legalized)
21142118
llvm_unreachable("widen scalar should have succeeded");
21152119
}

0 commit comments

Comments
 (0)