[llvm] [SPIR-V] Handle spirv.MemoryModel metadata (PR #186138)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 12 08:20:33 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/186138.diff
4 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp (+21)
- (added) llvm/test/CodeGen/SPIRV/memory-model-md-glsl450.ll (+12)
- (added) llvm/test/CodeGen/SPIRV/memory-model-md-shader.ll (+12)
- (added) llvm/test/CodeGen/SPIRV/memory-model-md-vulkan.ll (+12)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp
index d65d8ec53c6d0..18bf3229c9621 100644
--- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp
@@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//
#include "SPIRVSubtarget.h"
+#include "MCTargetDesc/SPIRVBaseInfo.h"
#include "SPIRV.h"
#include "SPIRVCommandLine.h"
#include "SPIRVGlobalRegistry.h"
@@ -207,6 +208,26 @@ void SPIRVSubtarget::resolveEnvFromModule(const Module &M) {
}
}
+ if (!HasShaderAttr) {
+ if (auto *MemModel = M.getNamedMetadata("spirv.MemoryModel")) {
+ assert(MemModel->getNumOperands() > 0 && "Invalid spirv.MemoryModel");
+ auto *MemMD = MemModel->getOperand(0);
+ assert(MemMD->getNumOperands() > 1 &&
+ "Invalid spirv.MemoryModel operand");
+ unsigned MemModelVal =
+ mdconst::extract<ConstantInt>(MemMD->getOperand(1))->getZExtValue();
+ switch (MemModelVal) {
+ case SPIRV::MemoryModel::Simple:
+ case SPIRV::MemoryModel::GLSL450:
+ case SPIRV::MemoryModel::VulkanKHR:
+ HasShaderAttr = true;
+ break;
+ case SPIRV::MemoryModel::OpenCL:
+ break;
+ }
+ }
+ }
+
setEnv(HasShaderAttr ? Shader : Kernel);
}
diff --git a/llvm/test/CodeGen/SPIRV/memory-model-md-glsl450.ll b/llvm/test/CodeGen/SPIRV/memory-model-md-glsl450.ll
new file mode 100644
index 0000000000000..c74725651ea7c
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/memory-model-md-glsl450.ll
@@ -0,0 +1,12 @@
+; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+
+; CHECK: OpMemoryModel Logical GLSL450
+define void @main() {
+entry:
+ ret void
+}
+
+; AddressingModel=Logical (0), MemoryModel=GLSL450 (1)
+!spirv.MemoryModel = !{!0}
+!0 = !{i32 0, i32 1}
diff --git a/llvm/test/CodeGen/SPIRV/memory-model-md-shader.ll b/llvm/test/CodeGen/SPIRV/memory-model-md-shader.ll
new file mode 100644
index 0000000000000..8e455314a9ef7
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/memory-model-md-shader.ll
@@ -0,0 +1,12 @@
+; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+
+; CHECK: OpMemoryModel Physical32 Simple
+define void @main() {
+entry:
+ ret void
+}
+
+; AddressingModel=Physical32 (1), MemoryModel=Simple (0)
+!spirv.MemoryModel = !{!0}
+!0 = !{i32 1, i32 0}
diff --git a/llvm/test/CodeGen/SPIRV/memory-model-md-vulkan.ll b/llvm/test/CodeGen/SPIRV/memory-model-md-vulkan.ll
new file mode 100644
index 0000000000000..a9ec9522c7a3b
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/memory-model-md-vulkan.ll
@@ -0,0 +1,12 @@
+; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+
+; CHECK: OpMemoryModel Logical Vulkan
+define void @main() {
+entry:
+ ret void
+}
+
+; AddressingModel=Logical (0), MemoryModel=VulkanKHR (3)
+!spirv.MemoryModel = !{!0}
+!0 = !{i32 0, i32 3}
``````````
</details>
https://github.com/llvm/llvm-project/pull/186138
More information about the llvm-commits
mailing list