[llvm] 8bbdac9 - [MIParser] - Add support for MMRAs (#180320)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 9 09:01:08 PST 2026
Author: Ryan Mitchell
Date: 2026-02-09T18:01:02+01:00
New Revision: 8bbdac9e52498e773283fba48e7eb8eec03ef14c
URL: https://github.com/llvm/llvm-project/commit/8bbdac9e52498e773283fba48e7eb8eec03ef14c
DIFF: https://github.com/llvm/llvm-project/commit/8bbdac9e52498e773283fba48e7eb8eec03ef14c.diff
LOG: [MIParser] - Add support for MMRAs (#180320)
Probably just forgotten in #78569
Added:
llvm/test/CodeGen/MIR/AMDGPU/instr-mmra-error.mir
llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir
Modified:
llvm/lib/CodeGen/MIRParser/MILexer.cpp
llvm/lib/CodeGen/MIRParser/MILexer.h
llvm/lib/CodeGen/MIRParser/MIParser.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
index f9852c6c889b8..a8f656820e306 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp
@@ -294,6 +294,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
MIToken::kw_machine_block_address_taken)
.Case("call-frame-size", MIToken::kw_call_frame_size)
.Case("noconvergent", MIToken::kw_noconvergent)
+ .Case("mmra", MIToken::kw_mmra)
.Default(MIToken::Identifier);
}
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h
index a9dc9af6858da..1284973df5dd2 100644
--- a/llvm/lib/CodeGen/MIRParser/MILexer.h
+++ b/llvm/lib/CodeGen/MIRParser/MILexer.h
@@ -147,6 +147,7 @@ struct MIToken {
kw_machine_block_address_taken,
kw_call_frame_size,
kw_noconvergent,
+ kw_mmra,
// Metadata types.
kw_distinct,
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index 05bbf4bc64dff..9329adcb995b8 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -523,6 +523,7 @@ class MIParser {
bool parsePreOrPostInstrSymbol(MCSymbol *&Symbol);
bool parseHeapAllocMarker(MDNode *&Node);
bool parsePCSections(MDNode *&Node);
+ bool parseMMRA(MDNode *&Node);
bool parseTargetImmMnemonic(const unsigned OpCode, const unsigned OpIdx,
MachineOperand &Dest, const MIRFormatter &MF);
@@ -1077,7 +1078,7 @@ bool MIParser::parse(MachineInstr *&MI) {
while (!Token.isNewlineOrEOF() && Token.isNot(MIToken::kw_pre_instr_symbol) &&
Token.isNot(MIToken::kw_post_instr_symbol) &&
Token.isNot(MIToken::kw_heap_alloc_marker) &&
- Token.isNot(MIToken::kw_pcsections) &&
+ Token.isNot(MIToken::kw_pcsections) && Token.isNot(MIToken::kw_mmra) &&
Token.isNot(MIToken::kw_cfi_type) &&
Token.isNot(MIToken::kw_deactivation_symbol) &&
Token.isNot(MIToken::kw_debug_location) &&
@@ -1113,7 +1114,9 @@ bool MIParser::parse(MachineInstr *&MI) {
if (Token.is(MIToken::kw_pcsections))
if (parsePCSections(PCSections))
return true;
-
+ MDNode *MMRA = nullptr;
+ if (Token.is(MIToken::kw_mmra) && parseMMRA(MMRA))
+ return true;
unsigned CFIType = 0;
if (Token.is(MIToken::kw_cfi_type)) {
lex();
@@ -1210,6 +1213,8 @@ bool MIParser::parse(MachineInstr *&MI) {
MI->setHeapAllocMarker(MF, HeapAllocMarker);
if (PCSections)
MI->setPCSections(MF, PCSections);
+ if (MMRA)
+ MI->setMMRAMetadata(MF, MMRA);
if (CFIType)
MI->setCFIType(MF, CFIType);
if (DS)
@@ -3614,6 +3619,20 @@ bool MIParser::parsePCSections(MDNode *&Node) {
return false;
}
+bool MIParser::parseMMRA(MDNode *&Node) {
+ assert(Token.is(MIToken::kw_mmra) && "Invalid token for MMRA!");
+ lex();
+ if (parseMDNode(Node))
+ return true;
+ if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
+ Token.is(MIToken::lbrace))
+ return false;
+ if (Token.isNot(MIToken::comma))
+ return error("expected ',' before the next machine operand");
+ lex();
+ return false;
+}
+
static void initSlots2BasicBlocks(
const Function &F,
DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
diff --git a/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra-error.mir b/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra-error.mir
new file mode 100644
index 0000000000000..8d2d75136383c
--- /dev/null
+++ b/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra-error.mir
@@ -0,0 +1,49 @@
+# RUN: split-file %s %t
+# RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -run-pass=none -filetype=null %t/expected-id.mir 2>&1 | FileCheck -check-prefix=ERR0 %s
+# RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -run-pass=none -filetype=null %t/undefined-id.mir 2>&1 | FileCheck -check-prefix=ERR1 %s
+# RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -run-pass=none -filetype=null %t/missing-comma.mir 2>&1 | FileCheck -check-prefix=ERR2 %s
+
+;--- expected-id.mir
+# ERR0: expected metadata id after '!'
+--- |
+ define void @test_expected_id() { unreachable }
+ !0 = !{!"amdgpu-synchronize-as", !"local"}
+...
+---
+name: test_expected_id
+body: |
+ bb.0:
+ liveins: $vgpr0, $vgpr1
+ ATOMIC_FENCE 5, 2, mmra ! _
+ S_ENDPGM 0
+...
+
+;--- undefined-id.mir
+# ERR1: use of undefined metadata '!1'
+--- |
+ define void @test_undefined_id() { unreachable }
+ !0 = !{!"amdgpu-synchronize-as", !"local"}
+...
+---
+name: test_undefined_id
+body: |
+ bb.0:
+ liveins: $vgpr0, $vgpr1
+ ATOMIC_FENCE 5, 2, mmra !1
+ S_ENDPGM 0
+...
+
+;--- missing-comma.mir
+# ERR2: expected ',' before the next machine operand
+--- |
+ define void @test_missing_comma() { unreachable }
+ !0 = !{!"amdgpu-synchronize-as", !"local"}
+...
+---
+name: test_missing_comma
+body: |
+ bb.0:
+ liveins: $vgpr0, $vgpr1
+ ATOMIC_FENCE 5, 2, mmra !0 implicit $exec
+ S_ENDPGM 0
+...
diff --git a/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir b/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir
new file mode 100644
index 0000000000000..433d43b69a817
--- /dev/null
+++ b/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir
@@ -0,0 +1,25 @@
+# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -run-pass=none -o - %s | FileCheck %s
+# This test ensures that the MIR parser parses mmra metadata correctly.
+
+--- |
+
+ define void @test_mmra(ptr addrspace(1) %ptr) {
+ entry:
+ fence syncscope("workgroup") release, !mmra !0
+ ret void
+ }
+
+ !0 = !{!"amdgpu-synchronize-as", !"local"}
+
+...
+---
+name: test_mmra
+body: |
+ bb.0.entry:
+ liveins: $vgpr0, $vgpr1
+
+ ; CHECK-LABEL: name: test_mmra
+ ; CHECK: ATOMIC_FENCE 5, 2, mmra !0
+ ATOMIC_FENCE 5, 2, mmra !0
+ S_ENDPGM 0
+...
More information about the llvm-commits
mailing list