Skip to content

Commit 4911278

Browse files
[AMDGPU] Fix buffer offset validation per PR feedback 2
1 parent ae166cb commit 4911278

File tree

6 files changed

+154
-105
lines changed

6 files changed

+154
-105
lines changed

llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4788,7 +4788,7 @@ bool AMDGPUAsmParser::validateOffset(const MCInst &Inst,
47884788
const unsigned OffsetSize = 24;
47894789
if (!isUIntN(OffsetSize - 1, Op.getImm())) {
47904790
Error(getFlatOffsetLoc(Operands),
4791-
Twine("expected a ") + Twine(OffsetSize - 1) + "-bit positive offset for buffer ops");
4791+
Twine("expected a ") + Twine(OffsetSize - 1) + "-bit non-negative offset for buffer ops");
47924792
return false;
47934793
}
47944794
} else {
@@ -4870,15 +4870,12 @@ bool AMDGPUAsmParser::validateSMEMOffset(const MCInst &Inst,
48704870
AMDGPU::isLegalSMRDEncodedSignedOffset(getSTI(), Offset, IsBuffer))
48714871
return true;
48724872

4873-
// Generate appropriate error message based on generation and buffer type
4874-
if (isGFX12Plus() && IsBuffer)
4875-
Error(getSMEMOffsetLoc(Operands),
4876-
"expected a 23-bit positive offset for S_BUFFER ops");
4877-
else
4878-
Error(getSMEMOffsetLoc(Operands),
4879-
isGFX12Plus() ? "expected a 24-bit signed offset"
4880-
: (isVI() || IsBuffer) ? "expected a 20-bit unsigned offset"
4881-
: "expected a 21-bit signed offset");
4873+
Error(getSMEMOffsetLoc(Operands),
4874+
isGFX12Plus() && IsBuffer
4875+
? "expected a 23-bit non-negative offset for S_BUFFER ops"
4876+
: isGFX12Plus() ? "expected a 24-bit signed offset"
4877+
: (isVI() || IsBuffer) ? "expected a 20-bit unsigned offset"
4878+
: "expected a 21-bit signed offset");
48824879

48834880
return false;
48844881
}

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -843,10 +843,8 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
843843
}
844844
}
845845

846-
// Validate buffer offset for GFX12+ - must be positive
847-
if ((MCII->get(MI.getOpcode()).TSFlags &
848-
(SIInstrFlags::MTBUF | SIInstrFlags::MUBUF)) &&
849-
isGFX12Plus()) {
846+
// Validate buffer instruction offsets for GFX12+ - must be non-negative
847+
if (isGFX12Plus() && isBufferInstruction(MI)) {
850848
int OffsetIdx =
851849
AMDGPU::getNamedOperandIdx(MI.getOpcode(), AMDGPU::OpName::offset);
852850
if (OffsetIdx != -1) {
@@ -2786,6 +2784,20 @@ const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(StringRef Id,
27862784
return MCSymbolRefExpr::create(Sym, Ctx);
27872785
}
27882786

2787+
bool AMDGPUDisassembler::isBufferInstruction(const MCInst &MI) const {
2788+
const uint64_t TSFlags = MCII->get(MI.getOpcode()).TSFlags;
2789+
2790+
// Check for MUBUF and MTBUF instructions
2791+
if (TSFlags & (SIInstrFlags::MTBUF | SIInstrFlags::MUBUF))
2792+
return true;
2793+
2794+
// Check for SMEM buffer instructions (S_BUFFER_* instructions)
2795+
if ((TSFlags & SIInstrFlags::SMRD) && AMDGPU::getSMEMIsBuffer(MI.getOpcode()))
2796+
return true;
2797+
2798+
return false;
2799+
}
2800+
27892801
//===----------------------------------------------------------------------===//
27902802
// AMDGPUSymbolizer
27912803
//===----------------------------------------------------------------------===//

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ class AMDGPUDisassembler : public MCDisassembler {
185185
bool hasKernargPreload() const;
186186

187187
bool isMacDPP(MCInst &MI) const;
188+
189+
/// Check if the instruction is a buffer operation (MUBUF, MTBUF, or S_BUFFER)
190+
bool isBufferInstruction(const MCInst &MI) const;
188191
};
189192

190193
//===----------------------------------------------------------------------===//

llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3221,11 +3221,8 @@ bool isLegalSMRDEncodedUnsignedOffset(const MCSubtargetInfo &ST,
32213221
bool isLegalSMRDEncodedSignedOffset(const MCSubtargetInfo &ST,
32223222
int64_t EncodedOffset, bool IsBuffer) {
32233223
if (isGFX12Plus(ST)) {
3224-
// GFX12+ S_BUFFER_*: InstOffset is signed 24, but must be positive (23-bit)
3225-
if (IsBuffer) {
3226-
constexpr const unsigned OffsetSize = 23;
3227-
return isUIntN(OffsetSize, EncodedOffset);
3228-
}
3224+
if (IsBuffer && EncodedOffset < 0)
3225+
return false;
32293226
return isInt<24>(EncodedOffset);
32303227
}
32313228

0 commit comments

Comments
 (0)