[llvm-branch-commits] [llvm] [AMDGPU] Extract SIAtomicAddrSpace and fence MMRA parsing from SIMemoryLegalizer (PR #231854)

Fabian Ritter via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Oct 20 01:09:52 PDT 2026


================
@@ -478,4 +480,70 @@ bool isClobberedInFunction(const LoadInst *Load, MemorySSA *MSSA,
   return false;
 }
 
+static constexpr SIAtomicAddrSpace LLVMToSIAtomicAddrSpaceMapping[] = {
+    SIAtomicAddrSpace::FLAT,    //< AMDGPUAS::FLAT_ADDRESS
+    SIAtomicAddrSpace::GLOBAL,  //< AMDGPUAS::GLOBAL_ADDRESS
+    SIAtomicAddrSpace::GDS,     //< AMDGPUAS::REGION_ADDRESS
+    SIAtomicAddrSpace::LDS,     //< AMDGPUAS::LOCAL_ADDRESS
+    SIAtomicAddrSpace::GLOBAL,  //< AMDGPUAS::CONSTANT_ADDRESS
+    SIAtomicAddrSpace::SCRATCH, //< AMDGPUAS::PRIVATE_ADDRESS
+    SIAtomicAddrSpace::GLOBAL,  //< AMDGPUAS::CONSTANT_ADDRESS_32BIT
+    SIAtomicAddrSpace::GLOBAL,  //< AMDGPUAS::BUFFER_FAT_POINTER
+    SIAtomicAddrSpace::GLOBAL,  //< AMDGPUAS::BUFFER_RESOURCE
+    SIAtomicAddrSpace::GLOBAL,  //< AMDGPUAS::BUFFER_STRIDED_POINTER
+};
+
+SIAtomicAddrSpace toSIAtomicAddrSpace(unsigned LLVMAddrSpace) {
+  constexpr unsigned SizeOfLLVMToSIAtomicAddrSpaceMapping =
+      sizeof(LLVMToSIAtomicAddrSpaceMapping) /
+      sizeof(LLVMToSIAtomicAddrSpaceMapping[0]);
+  if (LLVMAddrSpace > AMDGPUAS::MAX_AMDGPU_ADDRESS)
+    return SIAtomicAddrSpace::GLOBAL;
+  if (LLVMAddrSpace < SizeOfLLVMToSIAtomicAddrSpaceMapping)
+    return LLVMToSIAtomicAddrSpaceMapping[LLVMAddrSpace];
+  return SIAtomicAddrSpace::OTHER;
+}
+
+static const StringMap<SIAtomicAddrSpace> ASNames = {{
+    {"global", SIAtomicAddrSpace::GLOBAL},
+    {"local", SIAtomicAddrSpace::LDS},
+}};
+
+std::optional<SIAtomicAddrSpace>
+getSynchronizeAddrSpace(const MMRAMetadata &MMRA,
+                        function_ref<void(StringRef)> Diag) {
+  static constexpr StringLiteral FenceASPrefix = "amdgpu-synchronize-as";
+
+  if (!MMRA)
+    return std::nullopt;
+
+  SIAtomicAddrSpace Result = SIAtomicAddrSpace::NONE;
+  for (const auto &[Prefix, Suffix] : MMRA) {
+    if (Prefix != FenceASPrefix)
+      continue;
+
+    if (auto It = ASNames.find(Suffix); It != ASNames.end()) {
+      Result |= It->second;
+    } else {
+      SmallString<128> Str;
+      raw_svector_ostream OS(Str);
+      OS << "unknown address space '" << Suffix << "'; expected one of ";
+      ListSeparator LS;
+      for (const auto &[Name, Val] : ASNames)
+        OS << LS << '\'' << Name << '\'';
+      Diag(Str);
----------------
ritter-x2a wrote:

Now passing the `Function` and a `DebugLoc` to `getSynchronizeAddrSpace`, to do the `LLVMContext::diagnose` call here.

https://github.com/llvm/llvm-project/pull/231854


More information about the llvm-branch-commits mailing list