| ; Verify that volatile atomic load/store are accepted and produce |
| ; OpAtomicLoad/OpAtomicStore. On non-Vulkan targets the volatile qualifier |
| ; is silently dropped; on Vulkan the Volatile memory semantics bit is set. |
| |
| ; Non-Vulkan: no Volatile memory semantics. |
| ; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=NONVK |
| ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| |
| ; Vulkan: Volatile memory semantics (0x8000) ORed into the semantics operand. |
| ; RUN: llc -O0 -mtriple=spirv-unknown-vulkan1.3-compute %s -o - | FileCheck %s --check-prefix=VULKAN |
| |
| ; NONVK-DAG: %[[#C514:]] = OpConstant %[[#]] 514 |
| ; NONVK-DAG: %[[#C516:]] = OpConstant %[[#]] 516 |
| ; NONVK: OpAtomicLoad %[[#]] %[[#]] %[[#]] %[[#C514]] |
| ; NONVK: OpAtomicStore %[[#]] %[[#]] %[[#C516]] %[[#]] |
| |
| ; 0x8000 | 0x2 (Acquire) | 0x200 (CrossWorkgroupMemory) = 33282 |
| ; 0x8000 | 0x4 (Release) | 0x200 (CrossWorkgroupMemory) = 33284 |
| ; VULKAN-DAG: %[[#VA:]] = OpConstant %[[#]] 33282 |
| ; VULKAN-DAG: %[[#VR:]] = OpConstant %[[#]] 33284 |
| ; VULKAN: OpAtomicLoad %[[#]] %[[#]] %[[#]] %[[#VA]] |
| ; VULKAN: OpAtomicStore %[[#]] %[[#]] %[[#VR]] %[[#]] |
| |
| define i32 @load_volatile(ptr addrspace(1) %ptr) { |
| %val = load atomic volatile i32, ptr addrspace(1) %ptr syncscope("device") acquire, align 4 |
| ret i32 %val |
| } |
| |
| define void @store_volatile(ptr addrspace(1) %ptr, i32 %val) { |
| store atomic volatile i32 %val, ptr addrspace(1) %ptr syncscope("device") release, align 4 |
| ret void |
| } |