[llvm] [SPIR-V] Handle spirv.MemoryModel metadata (PR #186138)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 12 08:11:15 PDT 2026
https://github.com/aobolensk created https://github.com/llvm/llvm-project/pull/186138
None
>From 5018a0efb728cf75e00357d593c71a0cd42d76ca Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Thu, 12 Mar 2026 16:09:58 +0100
Subject: [PATCH] [SPIR-V] Handle Shader attr info from spirv.MemoryModel
metadata
---
llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp | 21 +++++++++++++++++++
.../CodeGen/SPIRV/memory-model-md-glsl450.ll | 12 +++++++++++
.../CodeGen/SPIRV/memory-model-md-shader.ll | 12 +++++++++++
.../CodeGen/SPIRV/memory-model-md-vulkan.ll | 12 +++++++++++
4 files changed, 57 insertions(+)
create mode 100644 llvm/test/CodeGen/SPIRV/memory-model-md-glsl450.ll
create mode 100644 llvm/test/CodeGen/SPIRV/memory-model-md-shader.ll
create mode 100644 llvm/test/CodeGen/SPIRV/memory-model-md-vulkan.ll
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}
More information about the llvm-commits
mailing list