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
