Skip to content

Commit 0968234

Browse files
committed
AMDGPU/GlobalISel: Minor refactor of MUBUF complex patterns
This will make it easier to support the small variants in the complex patterns for atomics.
1 parent bef2717 commit 0968234

File tree

2 files changed

+50
-25
lines changed

2 files changed

+50
-25
lines changed

llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2696,27 +2696,22 @@ void AMDGPUInstructionSelector::splitIllegalMUBUFOffset(
26962696
ImmOffset = 0;
26972697
}
26982698

2699-
InstructionSelector::ComplexRendererFns
2700-
AMDGPUInstructionSelector::selectMUBUFAddr64(MachineOperand &Root) const {
2699+
bool AMDGPUInstructionSelector::selectMUBUFAddr64Impl(
2700+
MachineOperand &Root, Register &VAddr, Register &RSrcReg,
2701+
Register &SOffset, int64_t &Offset) const {
27012702
// FIXME: Predicates should stop this from reaching here.
27022703
// addr64 bit was removed for volcanic islands.
27032704
if (!STI.hasAddr64() || STI.useFlatForGlobal())
2704-
return {};
2705+
return false;
27052706

27062707
MUBUFAddressData AddrData = parseMUBUFAddress(Root.getReg());
27072708
if (!shouldUseAddr64(AddrData))
2708-
return {};
2709+
return false;
27092710

27102711
Register N0 = AddrData.N0;
27112712
Register N2 = AddrData.N2;
27122713
Register N3 = AddrData.N3;
2713-
int64_t Offset = AddrData.Offset;
2714-
2715-
// VGPR pointer
2716-
Register VAddr;
2717-
2718-
// SGPR offset.
2719-
Register SOffset;
2714+
Offset = AddrData.Offset;
27202715

27212716
// Base pointer for the SRD.
27222717
Register SRDPtr;
@@ -2747,8 +2742,40 @@ AMDGPUInstructionSelector::selectMUBUFAddr64(MachineOperand &Root) const {
27472742
}
27482743

27492744
MachineIRBuilder B(*Root.getParent());
2750-
Register RSrcReg = buildAddr64RSrc(B, *MRI, TII, SRDPtr);
2745+
RSrcReg = buildAddr64RSrc(B, *MRI, TII, SRDPtr);
2746+
splitIllegalMUBUFOffset(B, SOffset, Offset);
2747+
return true;
2748+
}
2749+
2750+
bool AMDGPUInstructionSelector::selectMUBUFOffsetImpl(
2751+
MachineOperand &Root, Register &RSrcReg, Register &SOffset,
2752+
int64_t &Offset) const {
2753+
MUBUFAddressData AddrData = parseMUBUFAddress(Root.getReg());
2754+
if (shouldUseAddr64(AddrData))
2755+
return false;
2756+
2757+
// N0 -> offset, or
2758+
// (N0 + C1) -> offset
2759+
Register SRDPtr = AddrData.N0;
2760+
Offset = AddrData.Offset;
2761+
2762+
// TODO: Look through extensions for 32-bit soffset.
2763+
MachineIRBuilder B(*Root.getParent());
2764+
2765+
RSrcReg = buildOffsetSrc(B, *MRI, TII, SRDPtr);
27512766
splitIllegalMUBUFOffset(B, SOffset, Offset);
2767+
return true;
2768+
}
2769+
2770+
InstructionSelector::ComplexRendererFns
2771+
AMDGPUInstructionSelector::selectMUBUFAddr64(MachineOperand &Root) const {
2772+
Register VAddr;
2773+
Register RSrcReg;
2774+
Register SOffset;
2775+
int64_t Offset = 0;
2776+
2777+
if (!selectMUBUFAddr64Impl(Root, VAddr, RSrcReg, SOffset, Offset))
2778+
return {};
27522779

27532780
// FIXME: Use defaulted operands for trailing 0s and remove from the complex
27542781
// pattern.
@@ -2778,21 +2805,12 @@ AMDGPUInstructionSelector::selectMUBUFAddr64(MachineOperand &Root) const {
27782805

27792806
InstructionSelector::ComplexRendererFns
27802807
AMDGPUInstructionSelector::selectMUBUFOffset(MachineOperand &Root) const {
2781-
MUBUFAddressData AddrData = parseMUBUFAddress(Root.getReg());
2782-
if (shouldUseAddr64(AddrData))
2783-
return {};
2784-
2785-
// N0 -> offset, or
2786-
// (N0 + C1) -> offset
2787-
Register SRDPtr = AddrData.N0;
2788-
int64_t Offset = AddrData.Offset;
2808+
Register RSrcReg;
27892809
Register SOffset;
2810+
int64_t Offset = 0;
27902811

2791-
// TODO: Look through extensions for 32-bit soffset.
2792-
MachineIRBuilder B(*Root.getParent());
2793-
2794-
Register RSrcReg = buildOffsetSrc(B, *MRI, TII, SRDPtr);
2795-
splitIllegalMUBUFOffset(B, SOffset, Offset);
2812+
if (!selectMUBUFOffsetImpl(Root, RSrcReg, SOffset, Offset))
2813+
return {};
27962814

27972815
return {{
27982816
[=](MachineInstrBuilder &MIB) { // rsrc

llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,13 @@ class AMDGPUInstructionSelector : public InstructionSelector {
199199

200200
MUBUFAddressData parseMUBUFAddress(Register Src) const;
201201

202+
bool selectMUBUFAddr64Impl(MachineOperand &Root, Register &VAddr,
203+
Register &RSrcReg, Register &SOffset,
204+
int64_t &Offset) const;
205+
206+
bool selectMUBUFOffsetImpl(MachineOperand &Root, Register &RSrcReg,
207+
Register &SOffset, int64_t &Offset) const;
208+
202209
InstructionSelector::ComplexRendererFns
203210
selectMUBUFAddr64(MachineOperand &Root) const;
204211

0 commit comments

Comments
 (0)