#version 460
#if defined(GL_ARB_gpu_shader_int64)
#extension GL_ARB_gpu_shader_int64 : require
#else
#error No extension available for 64-bit integers.
#endif
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;

struct CmpXchgResult
{
    uint _m0;
    bool _m1;
};

struct CmpXchgResult_1
{
    uint64_t _m0;
    bool _m1;
};

layout(set = 0, binding = 0, std430) writeonly buffer SSBO
{
    uint _m0[];
} _9;

layout(set = 0, binding = 1, std430) writeonly buffer _12_14
{
    uint64_t _m0[];
} _14;

shared uint _18[64];
shared uint64_t _21[64];

void main()
{
    uint _31 = atomicCompSwap(_18[gl_GlobalInvocationID.x], 20u, 30u);
    uint _40 = atomicCompSwap(_18[gl_GlobalInvocationID.x], 20u, 30u);
    _9._m0[gl_GlobalInvocationID.x] = CmpXchgResult(_31, _31 == 20u)._m0;
    uint64_t _48 = atomicCompSwap(_21[gl_GlobalInvocationID.x], 20ul, 30ul);
    uint64_t _55 = atomicCompSwap(_21[gl_GlobalInvocationID.x], 20ul, 30ul);
    _14._m0[gl_GlobalInvocationID.x] = CmpXchgResult_1(_48, _48 == 20ul)._m0;
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 64
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability Int64Atomics
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %24
OpExecutionMode %3 LocalSize 64 1 1
OpName %3 "main"
OpName %7 "SSBO"
OpName %12 "SSBO"
OpName %37 "CmpXchgResult"
OpName %52 "CmpXchgResult"
OpDecorate %6 ArrayStride 4
OpMemberDecorate %7 0 Offset 0
OpDecorate %7 Block
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 0
OpDecorate %9 NonReadable
OpDecorate %11 ArrayStride 8
OpMemberDecorate %12 0 Offset 0
OpDecorate %12 Block
OpDecorate %14 DescriptorSet 0
OpDecorate %14 Binding 1
OpDecorate %14 NonReadable
OpDecorate %24 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeRuntimeArray %5
%7 = OpTypeStruct %6
%8 = OpTypePointer StorageBuffer %7
%9 = OpVariable %8 StorageBuffer
%10 = OpTypeInt 64 0
%11 = OpTypeRuntimeArray %10
%12 = OpTypeStruct %11
%13 = OpTypePointer StorageBuffer %12
%14 = OpVariable %13 StorageBuffer
%15 = OpConstant %5 64
%16 = OpTypeArray %5 %15
%17 = OpTypePointer Workgroup %16
%18 = OpVariable %17 Workgroup
%19 = OpTypeArray %10 %15
%20 = OpTypePointer Workgroup %19
%21 = OpVariable %20 Workgroup
%22 = OpTypeVector %5 3
%23 = OpTypePointer Input %22
%24 = OpVariable %23 Input
%25 = OpTypePointer Input %5
%27 = OpConstant %5 0
%29 = OpTypePointer Workgroup %5
%32 = OpConstant %5 2
%33 = OpConstant %5 30
%34 = OpConstant %5 20
%35 = OpTypeBool
%37 = OpTypeStruct %5 %35
%44 = OpTypePointer StorageBuffer %5
%46 = OpTypePointer Workgroup %10
%49 = OpConstant %10 30
%50 = OpConstant %10 20
%52 = OpTypeStruct %10 %35
%59 = OpConstant %5 3
%60 = OpTypePointer StorageBuffer %10
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %62
%62 = OpLabel
%26 = OpAccessChain %25 %24 %27
%28 = OpLoad %5 %26
%30 = OpAccessChain %29 %18 %28
%31 = OpAtomicCompareExchange %5 %30 %32 %27 %27 %33 %34
%36 = OpIEqual %35 %31 %34
%38 = OpCompositeConstruct %37 %31 %36
%39 = OpCompositeExtract %5 %38 0
%40 = OpAtomicCompareExchange %5 %30 %32 %27 %27 %33 %34
%41 = OpIEqual %35 %40 %34
%42 = OpCompositeConstruct %37 %40 %41
%43 = OpShiftLeftLogical %5 %28 %32
%45 = OpAccessChain %44 %9 %27 %28
OpStore %45 %39
%47 = OpAccessChain %46 %21 %28
%48 = OpAtomicCompareExchange %10 %47 %32 %27 %27 %49 %50
%51 = OpIEqual %35 %48 %50
%53 = OpCompositeConstruct %52 %48 %51
%54 = OpCompositeExtract %10 %53 0
%55 = OpAtomicCompareExchange %10 %47 %32 %27 %27 %49 %50
%56 = OpIEqual %35 %55 %50
%57 = OpCompositeConstruct %52 %55 %56
%58 = OpShiftLeftLogical %5 %28 %59
%61 = OpAccessChain %60 %14 %27 %28
OpStore %61 %54
OpReturn
OpFunctionEnd
#endif
