Skip to content

Commit 57d5e0f

Browse files
[AMDGPU] Fix buffer offset validation per PR feedback 2
1 parent 55c93d4 commit 57d5e0f

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
@@ -4470,7 +4470,7 @@ bool AMDGPUAsmParser::validateOffset(const MCInst &Inst,
44704470
const unsigned OffsetSize = 24;
44714471
if (!isUIntN(OffsetSize - 1, Op.getImm())) {
44724472
Error(getFlatOffsetLoc(Operands),
4473-
Twine("expected a ") + Twine(OffsetSize - 1) + "-bit positive offset for buffer ops");
4473+
Twine("expected a ") + Twine(OffsetSize - 1) + "-bit non-negative offset for buffer ops");
44744474
return false;
44754475
}
44764476
} else {
@@ -4552,15 +4552,12 @@ bool AMDGPUAsmParser::validateSMEMOffset(const MCInst &Inst,
45524552
AMDGPU::isLegalSMRDEncodedSignedOffset(getSTI(), Offset, IsBuffer))
45534553
return true;
45544554

4555-
// Generate appropriate error message based on generation and buffer type
4556-
if (isGFX12Plus() && IsBuffer)
4557-
Error(getSMEMOffsetLoc(Operands),
4558-
"expected a 23-bit positive offset for S_BUFFER ops");
4559-
else
4560-
Error(getSMEMOffsetLoc(Operands),
4561-
isGFX12Plus() ? "expected a 24-bit signed offset"
4562-
: (isVI() || IsBuffer) ? "expected a 20-bit unsigned offset"
4563-
: "expected a 21-bit signed offset");
4555+
Error(getSMEMOffsetLoc(Operands),
4556+
isGFX12Plus() && IsBuffer
4557+
? "expected a 23-bit non-negative offset for S_BUFFER ops"
4558+
: isGFX12Plus() ? "expected a 24-bit signed offset"
4559+
: (isVI() || IsBuffer) ? "expected a 20-bit unsigned offset"
4560+
: "expected a 21-bit signed offset");
45644561

45654562
return false;
45664563
}

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -812,10 +812,8 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
812812
}
813813
}
814814

815-
// Validate buffer offset for GFX12+ - must be positive
816-
if ((MCII->get(MI.getOpcode()).TSFlags &
817-
(SIInstrFlags::MTBUF | SIInstrFlags::MUBUF)) &&
818-
isGFX12Plus()) {
815+
// Validate buffer instruction offsets for GFX12+ - must be non-negative
816+
if (isGFX12Plus() && isBufferInstruction(MI)) {
819817
int OffsetIdx =
820818
AMDGPU::getNamedOperandIdx(MI.getOpcode(), AMDGPU::OpName::offset);
821819
if (OffsetIdx != -1) {
@@ -2622,6 +2620,20 @@ const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(StringRef Id,
26222620
return MCSymbolRefExpr::create(Sym, Ctx);
26232621
}
26242622

2623+
bool AMDGPUDisassembler::isBufferInstruction(const MCInst &MI) const {
2624+
const uint64_t TSFlags = MCII->get(MI.getOpcode()).TSFlags;
2625+
2626+
// Check for MUBUF and MTBUF instructions
2627+
if (TSFlags & (SIInstrFlags::MTBUF | SIInstrFlags::MUBUF))
2628+
return true;
2629+
2630+
// Check for SMEM buffer instructions (S_BUFFER_* instructions)
2631+
if ((TSFlags & SIInstrFlags::SMRD) && AMDGPU::getSMEMIsBuffer(MI.getOpcode()))
2632+
return true;
2633+
2634+
return false;
2635+
}
2636+
26252637
//===----------------------------------------------------------------------===//
26262638
// AMDGPUSymbolizer
26272639
//===----------------------------------------------------------------------===//

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

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

238238
bool isMacDPP(MCInst &MI) const;
239+
240+
/// Check if the instruction is a buffer operation (MUBUF, MTBUF, or S_BUFFER)
241+
bool isBufferInstruction(const MCInst &MI) const;
239242
};
240243

241244
//===----------------------------------------------------------------------===//

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2955,11 +2955,8 @@ bool isLegalSMRDEncodedUnsignedOffset(const MCSubtargetInfo &ST,
29552955
bool isLegalSMRDEncodedSignedOffset(const MCSubtargetInfo &ST,
29562956
int64_t EncodedOffset, bool IsBuffer) {
29572957
if (isGFX12Plus(ST)) {
2958-
// GFX12+ S_BUFFER_*: InstOffset is signed 24, but must be positive (23-bit)
2959-
if (IsBuffer) {
2960-
constexpr const unsigned OffsetSize = 23;
2961-
return isUIntN(OffsetSize, EncodedOffset);
2962-
}
2958+
if (IsBuffer && EncodedOffset < 0)
2959+
return false;
29632960
return isInt<24>(EncodedOffset);
29642961
}
29652962

0 commit comments

Comments
 (0)