#version 460
#extension GL_KHR_shader_subgroup_basic : require
layout(local_size_x = 32, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, r32ui) uniform uimageBuffer _8;
layout(set = 0, binding = 1, r32ui) uniform readonly uimageBuffer _9;

shared uint _13[32];

void main()
{
    bool _20 = gl_LocalInvocationIndex < 16u;
    if (_20)
    {
        _13[gl_LocalInvocationIndex] = imageLoad(_8, int(gl_LocalInvocationIndex + 1024u)).x;
    }
    else
    {
        _13[gl_LocalInvocationIndex ^ 1u] = imageLoad(_9, int(gl_LocalInvocationIndex + 1024u)).x;
    }
    subgroupMemoryBarrierShared();
    subgroupBarrier();
    if (_20)
    {
        if (imageLoad(_8, int(gl_LocalInvocationIndex)).x == 50u)
        {
            imageStore(_8, int(gl_LocalInvocationIndex), uvec4(_13[gl_LocalInvocationIndex ^ 31u]));
        }
    }
}

/* WARNINGS:
- Has group shared access, but no group shared barrier anywhere.
*/


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 56
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %17
OpExecutionMode %3 LocalSize 32 1 1
OpName %3 "main"
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 1
OpDecorate %9 NonWritable
OpDecorate %17 BuiltIn LocalInvocationIndex
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeImage %5 Buffer 0 0 0 2 R32ui
%7 = OpTypePointer UniformConstant %6
%8 = OpVariable %7 UniformConstant
%9 = OpVariable %7 UniformConstant
%10 = OpConstant %5 32
%11 = OpTypeArray %5 %10
%12 = OpTypePointer Workgroup %11
%13 = OpVariable %12 Workgroup
%16 = OpTypePointer Input %5
%17 = OpVariable %16 Input
%19 = OpTypeBool
%21 = OpConstant %5 16
%23 = OpConstant %5 1024
%25 = OpTypeVector %5 4
%28 = OpTypePointer Workgroup %5
%34 = OpConstant %5 1
%39 = OpConstant %5 50
%41 = OpConstant %5 31
%53 = OpConstant %5 3
%54 = OpConstant %5 264
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %45
%45 = OpLabel
%14 = OpLoad %6 %9
%15 = OpLoad %6 %8
%18 = OpLoad %5 %17
%20 = OpULessThan %19 %18 %21
%22 = OpIAdd %5 %18 %23
OpSelectionMerge %48 None
OpBranchConditional %20 %47 %46
%47 = OpLabel
%24 = OpIAdd %5 %18 %23
%26 = OpImageRead %25 %15 %24
%27 = OpCompositeExtract %5 %26 0
%29 = OpAccessChain %28 %13 %18
OpStore %29 %27
OpBranch %48
%46 = OpLabel
%30 = OpIAdd %5 %18 %23
%31 = OpImageRead %25 %14 %30
%32 = OpCompositeExtract %5 %31 0
%33 = OpBitwiseXor %5 %18 %34
%35 = OpAccessChain %28 %13 %33
OpStore %35 %32
OpBranch %48
%48 = OpLabel
OpControlBarrier %53 %53 %54
OpSelectionMerge %52 None
OpBranchConditional %20 %49 %52
%49 = OpLabel
%36 = OpImageRead %25 %15 %18
%37 = OpCompositeExtract %5 %36 0
%38 = OpIEqual %19 %37 %39
OpSelectionMerge %51 None
OpBranchConditional %38 %50 %51
%50 = OpLabel
%40 = OpBitwiseXor %5 %18 %41
%42 = OpAccessChain %28 %13 %40
%43 = OpLoad %5 %42
%44 = OpCompositeConstruct %25 %43 %43 %43 %43
OpImageWrite %15 %18 %44
OpBranch %51
%51 = OpLabel
OpBranch %52
%52 = OpLabel
OpReturn
OpFunctionEnd
#endif
