Skip to content

Commit ce7ca2c

Browse files
committed
AMDGPU/GlobalISel: Select llvm.amdgcn.struct.buffer.load
1 parent 198624c commit ce7ca2c

File tree

5 files changed

+468
-30
lines changed

5 files changed

+468
-30
lines changed

llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2435,10 +2435,10 @@ bool AMDGPULegalizerInfo::legalizeRawBufferStore(MachineInstr &MI,
24352435
return Ty == S32;
24362436
}
24372437

2438-
bool AMDGPULegalizerInfo::legalizeRawBufferLoad(MachineInstr &MI,
2439-
MachineRegisterInfo &MRI,
2440-
MachineIRBuilder &B,
2441-
bool IsFormat) const {
2438+
bool AMDGPULegalizerInfo::legalizeBufferLoad(MachineInstr &MI,
2439+
MachineRegisterInfo &MRI,
2440+
MachineIRBuilder &B,
2441+
bool IsFormat) const {
24422442
B.setInstr(MI);
24432443

24442444
// FIXME: Verifier should enforce 1 MMO for these intrinsics.
@@ -2448,9 +2448,19 @@ bool AMDGPULegalizerInfo::legalizeRawBufferLoad(MachineInstr &MI,
24482448

24492449
Register Dst = MI.getOperand(0).getReg();
24502450
Register RSrc = MI.getOperand(2).getReg();
2451-
Register VOffset = MI.getOperand(3).getReg();
2452-
Register SOffset = MI.getOperand(4).getReg();
2453-
unsigned AuxiliaryData = MI.getOperand(5).getImm();
2451+
2452+
// The struct intrinsic variants add one additional operand over raw.
2453+
const bool HasVIndex = MI.getNumOperands() == 7;
2454+
Register VIndex;
2455+
int OpOffset = 0;
2456+
if (HasVIndex) {
2457+
VIndex = MI.getOperand(3).getReg();
2458+
OpOffset = 1;
2459+
}
2460+
2461+
Register VOffset = MI.getOperand(3 + OpOffset).getReg();
2462+
Register SOffset = MI.getOperand(4 + OpOffset).getReg();
2463+
unsigned AuxiliaryData = MI.getOperand(5 + OpOffset).getImm();
24542464
unsigned ImmOffset;
24552465
unsigned TotalOffset;
24562466

@@ -2493,17 +2503,18 @@ bool AMDGPULegalizerInfo::legalizeRawBufferLoad(MachineInstr &MI,
24932503
else
24942504
LoadDstReg = Dst;
24952505

2496-
Register VIndex = B.buildConstant(S32, 0).getReg(0);
2506+
if (!VIndex)
2507+
VIndex = B.buildConstant(S32, 0).getReg(0);
24972508

24982509
B.buildInstr(Opc)
2499-
.addDef(LoadDstReg) // vdata
2500-
.addUse(RSrc) // rsrc
2501-
.addUse(VIndex) // vindex
2502-
.addUse(VOffset) // voffset
2503-
.addUse(SOffset) // soffset
2504-
.addImm(ImmOffset) // offset(imm)
2505-
.addImm(AuxiliaryData) // cachepolicy, swizzled buffer(imm)
2506-
.addImm(0) // idxen(imm)
2510+
.addDef(LoadDstReg) // vdata
2511+
.addUse(RSrc) // rsrc
2512+
.addUse(VIndex) // vindex
2513+
.addUse(VOffset) // voffset
2514+
.addUse(SOffset) // soffset
2515+
.addImm(ImmOffset) // offset(imm)
2516+
.addImm(AuxiliaryData) // cachepolicy, swizzled buffer(imm)
2517+
.addImm(HasVIndex ? -1 : 0) // idxen(imm)
25072518
.addMemOperand(MMO);
25082519

25092520
if (LoadDstReg != Dst) {
@@ -2662,9 +2673,10 @@ bool AMDGPULegalizerInfo::legalizeIntrinsic(MachineInstr &MI,
26622673
case Intrinsic::amdgcn_raw_buffer_store_format:
26632674
return legalizeRawBufferStore(MI, MRI, B, true);
26642675
case Intrinsic::amdgcn_raw_buffer_load:
2665-
return legalizeRawBufferLoad(MI, MRI, B, false);
2676+
case Intrinsic::amdgcn_struct_buffer_load:
2677+
return legalizeBufferLoad(MI, MRI, B, false);
26662678
case Intrinsic::amdgcn_raw_buffer_load_format:
2667-
return legalizeRawBufferLoad(MI, MRI, B, true);
2679+
return legalizeBufferLoad(MI, MRI, B, true);
26682680
case Intrinsic::amdgcn_atomic_inc:
26692681
return legalizeAtomicIncDec(MI, B, true);
26702682
case Intrinsic::amdgcn_atomic_dec:

llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ class AMDGPULegalizerInfo : public LegalizerInfo {
114114
MachineIRBuilder &B, bool IsFormat) const;
115115
bool legalizeRawBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
116116
MachineIRBuilder &B, bool IsFormat) const;
117+
bool legalizeBufferLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
118+
MachineIRBuilder &B, bool IsFormat) const;
119+
117120
bool legalizeAtomicIncDec(MachineInstr &MI, MachineIRBuilder &B,
118121
bool IsInc) const;
119122

llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2343,9 +2343,7 @@ void AMDGPURegisterBankInfo::applyMappingImpl(
23432343
executeInWaterfallLoop(MI, MRI, {2, 4});
23442344
return;
23452345
}
2346-
case Intrinsic::amdgcn_struct_buffer_load:
23472346
case Intrinsic::amdgcn_struct_buffer_store:
2348-
case Intrinsic::amdgcn_struct_tbuffer_load:
23492347
case Intrinsic::amdgcn_struct_tbuffer_store: {
23502348
applyDefaultMapping(OpdMapper);
23512349
executeInWaterfallLoop(MI, MRI, {2, 5});

0 commit comments

Comments
 (0)