Author: Sameer Sahasrabuddhe
Date: 2026-05-27T05:27:19Z
New Revision: 4f54064a6e192eb182ba5e718f1b6d70065a6609

URL: 
https://github.com/llvm/llvm-project/commit/4f54064a6e192eb182ba5e718f1b6d70065a6609
DIFF: 
https://github.com/llvm/llvm-project/commit/4f54064a6e192eb182ba5e718f1b6d70065a6609.diff

LOG: [IR] Introduce an appendTags() idiom to set MMRA metadata [NFC] (#199621)

This is a simple set-union of new tags and existing tags. This is safer
than directly setting metadata, which can over-write existing MMRAs.

Assisted-By: Claude Opus 4.6

---------

Co-authored-by: Pierre van Houtryve <[email protected]>

Added: 
    

Modified: 
    clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
    llvm/include/llvm/IR/MemoryModelRelaxationAnnotations.h
    llvm/lib/IR/MemoryModelRelaxationAnnotations.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp 
b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
index cb883e8780e59..a88dbb71b3ddf 100644
--- a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
@@ -440,7 +440,6 @@ void 
CodeGenFunction::AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst,
                                                      const CallExpr *E) {
   constexpr const char *Tag = "amdgpu-synchronize-as";
 
-  LLVMContext &Ctx = Inst->getContext();
   SmallVector<MMRAMetadata::TagT, 3> MMRAs;
   for (unsigned K = 2; K < E->getNumArgs(); ++K) {
     llvm::Value *V = EmitScalarExpr(E->getArg(K));
@@ -454,9 +453,7 @@ void 
CodeGenFunction::AddAMDGPUFenceAddressSpaceMMRA(llvm::Instruction *Inst,
               "expected an address space name as a string literal");
   }
 
-  llvm::sort(MMRAs);
-  MMRAs.erase(llvm::unique(MMRAs), MMRAs.end());
-  Inst->setMetadata(LLVMContext::MD_mmra, MMRAMetadata::getMD(Ctx, MMRAs));
+  MMRAMetadata::appendTags(*Inst, MMRAs);
 }
 
 static Value *GetAMDGPUPredicate(CodeGenFunction &CGF, Twine Name) {

diff  --git a/llvm/include/llvm/IR/MemoryModelRelaxationAnnotations.h 
b/llvm/include/llvm/IR/MemoryModelRelaxationAnnotations.h
index fcfb2db85a880..49e64a1a188c4 100644
--- a/llvm/include/llvm/IR/MemoryModelRelaxationAnnotations.h
+++ b/llvm/include/llvm/IR/MemoryModelRelaxationAnnotations.h
@@ -83,6 +83,10 @@ class MMRAMetadata {
   /// \returns true if \p MD is a well-formed MMRA tag.
   LLVM_ABI static bool isTagMD(const Metadata *MD);
 
+  /// Appends \p Tags to the !mmra metadata on \p I,
+  /// merging with any existing MMRA metadata.
+  LLVM_ABI static void appendTags(Instruction &I, ArrayRef<TagT> Tags);
+
   /// @}
 
   /// \name Compatibility Helpers

diff  --git a/llvm/lib/IR/MemoryModelRelaxationAnnotations.cpp 
b/llvm/lib/IR/MemoryModelRelaxationAnnotations.cpp
index 819cad3366787..376e27bd2c8b0 100644
--- a/llvm/lib/IR/MemoryModelRelaxationAnnotations.cpp
+++ b/llvm/lib/IR/MemoryModelRelaxationAnnotations.cpp
@@ -98,6 +98,21 @@ MDNode *MMRAMetadata::combine(LLVMContext &Ctx, const 
MMRAMetadata &A,
   return MDTuple::get(Ctx, Result);
 }
 
+void MMRAMetadata::appendTags(Instruction &I, ArrayRef<TagT> Tags) {
+  if (Tags.empty())
+    return;
+  SmallVector<MMRAMetadata::TagT> MMRAs(Tags);
+  LLVMContext &Ctx = I.getContext();
+  if (MDNode *Existing = I.getMetadata(LLVMContext::MD_mmra)) {
+    // Merge with existing MMRA tags.
+    MMRAMetadata Parsed(Existing);
+    MMRAs.append(Parsed.begin(), Parsed.end());
+  }
+  llvm::sort(MMRAs);
+  MMRAs.erase(llvm::unique(MMRAs), MMRAs.end());
+  I.setMetadata(LLVMContext::MD_mmra, MMRAMetadata::getMD(Ctx, MMRAs));
+}
+
 bool MMRAMetadata::hasTag(StringRef Prefix, StringRef Suffix) const {
   return Tags.count({Prefix, Suffix});
 }


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to