[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