[llvm] [SPIR-V] Diagnose stores into read-only storage classes (PR #207331)
Arseniy Obolenskiy via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 6 02:17:50 PDT 2026
https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/207331
>From 93af62914c00c24de47149cfef29ff9ad68c26af Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Fri, 3 Jul 2026 08:52:16 +0200
Subject: [PATCH 1/2] [SPIR-V] Diagnose stores into read-only storage classes
---
.../Target/SPIRV/SPIRVInstructionSelector.cpp | 10 +++++++++
.../SPIRV/store-to-read-only-addrspace.ll | 21 +++++++++++++++++++
2 files changed, 31 insertions(+)
create mode 100644 llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index 533181beeaf0d..274a3265f7115 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -2094,6 +2094,16 @@ bool SPIRVInstructionSelector::selectStore(MachineInstr &I) const {
return selectAtomicStore(I);
}
+ // Stores into a read-only storage class produce invalid SPIR-V. Reject such
+ // input with a diagnostic rather than silently emitting an OpStore that
+ // validation rejects.
+ SPIRV::StorageClass::StorageClass PtrSC = GR.getPointerStorageClass(Ptr);
+ if (PtrSC == SPIRV::StorageClass::UniformConstant ||
+ PtrSC == SPIRV::StorageClass::Input ||
+ PtrSC == SPIRV::StorageClass::PushConstant)
+ return diagnoseUnsupported(
+ I, "store into a read-only SPIR-V storage class is not allowed");
+
MachineIRBuilder MIRBuilder(I);
auto MIB = MIRBuilder.buildInstr(SPIRV::OpStore).addUse(Ptr).addUse(StoreVal);
if (!I.getNumMemOperands()) {
diff --git a/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll b/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
new file mode 100644
index 0000000000000..176f381d779c3
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
@@ -0,0 +1,21 @@
+; RUN: not llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o /dev/null 2>&1 | FileCheck %s
+; RUN: not llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o /dev/null 2>&1 | FileCheck %s
+
+; Storing into addrspace(2) (__constant / UniformConstant) is read-only in SPIR-V.
+; The backend must diagnose this rather than emit invalid SPIR-V.
+
+; CHECK: error: {{.*}}store into a read-only SPIR-V storage class is not allowed
+
+define spir_kernel void @fuzz_kernel(ptr addrspace(1) %in, ptr addrspace(2) %out, i32 %n) {
+entry:
+ %ok = icmp sgt i32 %n, 0
+ br i1 %ok, label %body, label %exit
+body:
+ %v = load i32, ptr addrspace(1) %in, align 4
+ %salt = mul i32 %n, -1640531527
+ %mix = xor i32 %v, %salt
+ store i32 %mix, ptr addrspace(2) %out, align 4
+ br label %exit
+exit:
+ ret void
+}
>From 94126573b48b1ded21eb945395215eee3370e95e Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Mon, 6 Jul 2026 10:43:33 +0200
Subject: [PATCH 2/2] Address comment
---
.../CodeGen/SPIRV/store-to-read-only-addrspace.ll | 15 ++-------------
1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll b/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
index 176f381d779c3..ab40bdce58c81 100644
--- a/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
+++ b/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
@@ -1,21 +1,10 @@
; RUN: not llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o /dev/null 2>&1 | FileCheck %s
; RUN: not llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o /dev/null 2>&1 | FileCheck %s
-; Storing into addrspace(2) (__constant / UniformConstant) is read-only in SPIR-V.
-; The backend must diagnose this rather than emit invalid SPIR-V.
; CHECK: error: {{.*}}store into a read-only SPIR-V storage class is not allowed
-define spir_kernel void @fuzz_kernel(ptr addrspace(1) %in, ptr addrspace(2) %out, i32 %n) {
-entry:
- %ok = icmp sgt i32 %n, 0
- br i1 %ok, label %body, label %exit
-body:
- %v = load i32, ptr addrspace(1) %in, align 4
- %salt = mul i32 %n, -1640531527
- %mix = xor i32 %v, %salt
- store i32 %mix, ptr addrspace(2) %out, align 4
- br label %exit
-exit:
+define spir_kernel void @store_to_constant(ptr addrspace(2) %out) {
+ store i32 0, ptr addrspace(2) %out
ret void
}
More information about the llvm-commits
mailing list