[llvm] 5c24318 - [SPIR-V] Diagnose stores into read-only storage classes (#207331)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 6 05:17:02 PDT 2026


Author: Arseniy Obolenskiy
Date: 2026-07-06T14:16:57+02:00
New Revision: 5c243188cf637c91f09a66986a1c0d90b92c33bb

URL: https://github.com/llvm/llvm-project/commit/5c243188cf637c91f09a66986a1c0d90b92c33bb
DIFF: https://github.com/llvm/llvm-project/commit/5c243188cf637c91f09a66986a1c0d90b92c33bb.diff

LOG: [SPIR-V] Diagnose stores into read-only storage classes (#207331)

Added: 
    llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll

Modified: 
    llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Removed: 
    


################################################################################
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..ab40bdce58c81
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/store-to-read-only-addrspace.ll
@@ -0,0 +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
+
+
+; CHECK: error: {{.*}}store into a read-only SPIR-V storage class is not allowed
+
+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