blob: 421a73f4d75cb3046a3edb624344f4d3d56e6171 [file]
; Vulkan counterpart of atomicrmw-storage-class-semantics.ll.
;
; Vulkan forbids a storage-class MemorySemantics bit combined with a relaxed
; order (VUID-StandaloneSpirv-MemorySemantics-10871), so relaxed atomics must
; drop the bit instead of OR'ing it in. See
; atomiccmpxchg-storage-class-semantics-vulkan.ll for the cmpxchg case.
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s --check-prefixes=CHECK,NO-SC-BIT
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - -filetype=obj | spirv-val --target-env vulkan1.3 %}
; CHECK-DAG: %[[#Int:]] = OpTypeInt 32 0
; CHECK-DAG: %[[#Workgroup:]] = OpConstant %[[#Int]] 2
; None (0) semantics is emitted as OpConstantNull.
; CHECK-DAG: %[[#None:]] = OpConstantNull %[[#Int]]
; NOT-only prefix scans the whole module, since the constant precedes the atomics in output.
; NO-SC-BIT-NOT: OpConstant %[[#Int]] 256
@gs = external hidden addrspace(3) global i32, align 4
define void @rmw() #0 {
; CHECK: OpAtomicOr %[[#Int]] %[[#]] %[[#Workgroup]] %[[#None]] %[[#]]
%r = atomicrmw or ptr addrspace(3) @gs, i32 1 syncscope("workgroup") monotonic, align 4
ret void
}
define void @ld() #0 {
; CHECK: OpAtomicLoad %[[#Int]] %[[#]] %[[#Workgroup]] %[[#None]]
%v = load atomic i32, ptr addrspace(3) @gs syncscope("workgroup") monotonic, align 4
ret void
}
define void @st() #0 {
; CHECK: OpAtomicStore %[[#]] %[[#Workgroup]] %[[#None]] %[[#]]
store atomic i32 1, ptr addrspace(3) @gs syncscope("workgroup") monotonic, align 4
ret void
}
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }