#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
#extension GL_EXT_buffer_reference2 : require
#extension GL_EXT_buffer_reference_uvec2 : require
layout(local_size_x_id = 0, local_size_y_id = 1, local_size_z_id = 2) in;

layout(buffer_reference) buffer NodeReadonlyU32Ptr;
layout(buffer_reference) buffer NodeReadonlyU32ArrayPtr;
layout(buffer_reference) buffer NodeReadonlyU64Ptr;
layout(buffer_reference) buffer _50;
layout(buffer_reference) buffer uintPointer;

layout(constant_id = 4) const bool NodeEntryIndirectPayloadStride = false;
layout(constant_id = 3) const bool NodeIsProgramEntry = false;
layout(constant_id = 5) const bool DispatchGridIsUpperBound = true;
layout(constant_id = 6) const bool DispatchStaticPayload = false;
layout(constant_id = 7) const uint MaxBroadcastGridX = 1024u;
const uint GridXMinus1 = (MaxBroadcastGridX - 1u);
layout(constant_id = 8) const uint MaxBroadcastGridY = 1u;
const uint GridYMinus1 = (MaxBroadcastGridY - 1u);
layout(constant_id = 9) const uint MaxBroadcastGridZ = 1u;
const uint GridZMinus1 = (MaxBroadcastGridZ - 1u);
const uvec3 ThreadGroupSize = uvec3(gl_WorkGroupSize.x, gl_WorkGroupSize.y, gl_WorkGroupSize.z);

struct anon_data
{
    uint _m0;
    uint _m1;
};

const uint _174 = (MaxBroadcastGridX * MaxBroadcastGridY);
const uint _175 = (_174 * MaxBroadcastGridZ);
const uint _239 = (MaxBroadcastGridX * MaxBroadcastGridY);
const uint _240 = (_239 * MaxBroadcastGridZ);

layout(buffer_reference, buffer_reference_align = 4) buffer uintPointer
{
    uint value;
};

layout(buffer_reference, buffer_reference_align = 4, std430) readonly buffer NodeReadonlyU32Ptr
{
    uint value;
};

layout(buffer_reference, buffer_reference_align = 4, std430) readonly buffer NodeReadonlyU32ArrayPtr
{
    uint offsets[];
};

layout(buffer_reference, buffer_reference_align = 8, std430) readonly buffer NodeReadonlyU64Ptr
{
    uint64_t value;
};

layout(buffer_reference, buffer_reference_align = 4, std430) buffer _50
{
    anon_data data;
};

layout(push_constant, std430) uniform NodeDispatchRegisters
{
    uint64_t PayloadLinearBDA;
    NodeReadonlyU32Ptr NodeLinearOffsetBDA;
    NodeReadonlyU32Ptr NodeEndNodesBDA;
    uvec2 NodePayloadStrideOrOffsetsBDA;
    uint64_t NodePayloadOutputBDA;
    uint64_t NodePayloadOutputAtomicBDA;
    uvec2 NodeLocalRootSignatureBDA;
    uint NodePayloadOutputOffset;
    uint NodeRemainingRecursionLevels;
} NodeDispatch;

layout(set = 0, binding = 0, r32ui) uniform uimageBuffer RWBuf0;

uint64_t NodeInputPayloadBDA;
uint NodeInputStride;
uvec3 WorkgroupID;
uvec3 GlobalInvocationID;
uint NodeCoalesceOffset;
uint NodeCoalesceCount;
shared bool FinishCrossGroupSharingBroadcast;

bool FinishCrossGroupSharing(uint64_t CounterBDA)
{
    if (gl_LocalInvocationIndex == 0u)
    {
        uint _79 = atomicAdd(uintPointer(CounterBDA).value, uint(-1));
        FinishCrossGroupSharingBroadcast = _79 == 1u;
    }
    barrier();
    return FinishCrossGroupSharingBroadcast;
}

void node_main()
{
    uint64_t _53 = NodeInputPayloadBDA;
    _50 _54 = _50(_53);
    uint _59 = atomicAdd(_54.data._m1, 1u);
    _54.data._m1 += 3u;
    groupMemoryBarrier();
    barrier();
    uint64_t _84 = NodeInputPayloadBDA;
    bool _87 = FinishCrossGroupSharing(_84 + 8ul);
    if (_87)
    {
        uint _93 = imageAtomicAdd(RWBuf0, int(gl_LocalInvocationIndex), _54.data._m1);
    }
}

void main()
{
    uint _108 = DispatchStaticPayload ? NodeDispatch.NodeLinearOffsetBDA.value : (((gl_WorkGroupID.y * 32768u) + gl_WorkGroupID.x) + NodeDispatch.NodeLinearOffsetBDA.value);
    NodeInputPayloadBDA = NodeDispatch.PayloadLinearBDA;
    if (NodeIsProgramEntry)
    {
        NodeInputStride = NodeDispatch.NodePayloadStrideOrOffsetsBDA.x;
        if (NodeEntryIndirectPayloadStride)
        {
            NodeInputPayloadBDA = NodeReadonlyU64Ptr(NodeDispatch.PayloadLinearBDA).value;
            NodeInputStride = NodeReadonlyU32Ptr(NodeDispatch.NodePayloadStrideOrOffsetsBDA).value;
        }
    }
    if (DispatchGridIsUpperBound)
    {
        if (NodeIsProgramEntry)
        {
            NodeInputPayloadBDA += uint64_t(_108 * NodeInputStride);
            uintPointer _137 = uintPointer(NodeInputPayloadBDA + 0ul);
            uint _139 = _137.value - 1u;
            uint _141 = uint(findMSB(_139)) + 1u;
            uint _146 = (int(_139) < int(0u)) ? 0u : (_137.value << 0u);
            for (uint amplification_index = gl_WorkGroupID.z; amplification_index < _146; amplification_index += gl_NumWorkGroups.z)
            {
                uvec3 _151 = uvec3(bitfieldExtract(amplification_index, int(0u), int(_141)), 0u, 0u);
                WorkgroupID = _151;
                GlobalInvocationID = (ThreadGroupSize * _151) + gl_LocalInvocationID;
                if (all(lessThanEqual(_151, uvec3(_139, 0u, 0u))))
                {
                    node_main();
                    barrier();
                }
            }
        }
        else
        {
            NodeInputPayloadBDA += uint64_t(NodeReadonlyU32ArrayPtr(NodeDispatch.NodePayloadStrideOrOffsetsBDA).offsets[_108]);
            uintPointer _202 = uintPointer(NodeInputPayloadBDA + 0ul);
            uint _204 = _202.value - 1u;
            uint _206 = uint(findMSB(_204)) + 1u;
            uint _211 = (int(_204) < int(0u)) ? 0u : (_202.value << 0u);
            for (uint amplification_index_1 = gl_WorkGroupID.z; amplification_index_1 < _211; amplification_index_1 += gl_NumWorkGroups.z)
            {
                uvec3 _216 = uvec3(bitfieldExtract(amplification_index_1, int(0u), int(_206)), 0u, 0u);
                WorkgroupID = _216;
                GlobalInvocationID = (ThreadGroupSize * _216) + gl_LocalInvocationID;
                if (all(lessThanEqual(_216, uvec3(_204, 0u, 0u))))
                {
                    node_main();
                    barrier();
                }
            }
        }
    }
    else
    {
        if (NodeIsProgramEntry)
        {
            NodeInputPayloadBDA += uint64_t(_108 * NodeInputStride);
            if (DispatchStaticPayload)
            {
                WorkgroupID = gl_WorkGroupID;
                GlobalInvocationID = gl_GlobalInvocationID;
                node_main();
            }
            else
            {
                for (uint amplification_index_2 = gl_WorkGroupID.z; amplification_index_2 < _175; amplification_index_2 += gl_NumWorkGroups.z)
                {
                    uint _180 = amplification_index_2 / MaxBroadcastGridX;
                    uvec3 _183 = uvec3(amplification_index_2 % MaxBroadcastGridX, _180 % MaxBroadcastGridY, _180 / MaxBroadcastGridY);
                    WorkgroupID = _183;
                    GlobalInvocationID = (ThreadGroupSize * _183) + gl_LocalInvocationID;
                    node_main();
                    barrier();
                }
            }
        }
        else
        {
            NodeInputPayloadBDA += uint64_t(NodeReadonlyU32ArrayPtr(NodeDispatch.NodePayloadStrideOrOffsetsBDA).offsets[_108]);
            if (DispatchStaticPayload)
            {
                WorkgroupID = gl_WorkGroupID;
                GlobalInvocationID = gl_GlobalInvocationID;
                node_main();
            }
            else
            {
                for (uint amplification_index_3 = gl_WorkGroupID.z; amplification_index_3 < _240; amplification_index_3 += gl_NumWorkGroups.z)
                {
                    uint _245 = amplification_index_3 / MaxBroadcastGridX;
                    uvec3 _248 = uvec3(amplification_index_3 % MaxBroadcastGridX, _245 % MaxBroadcastGridY, _245 / MaxBroadcastGridY);
                    WorkgroupID = _248;
                    GlobalInvocationID = (ThreadGroupSize * _248) + gl_LocalInvocationID;
                    node_main();
                    barrier();
                }
            }
        }
    }
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.6
; Generator: Unknown(30017); 21022
; Bound: 300
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability ImageBuffer
OpCapability VulkanMemoryModel
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_KHR_physical_storage_buffer"
%133 = OpExtInstImport "GLSL.std.450"
OpMemoryModel PhysicalStorageBuffer64 Vulkan
OpEntryPoint GLCompute %3 "main" %9 %11 %14 %15 %23 %24 %25 %46 %73 %75 %95 %130 %153 %166
OpExecutionModeId %3 LocalSizeId %40 %41 %42
OpName %3 "main"
OpName %9 "NodeInputPayloadBDA"
OpName %11 "NodeInputStride"
OpName %14 "WorkgroupID"
OpName %15 "GlobalInvocationID"
OpName %17 "NodeReadonlyU32Ptr"
OpMemberName %17 0 "value"
OpName %19 "NodeReadonlyU32ArrayPtr"
OpMemberName %19 0 "offsets"
OpName %21 "NodeDispatchRegisters"
OpMemberName %21 0 "PayloadLinearBDA"
OpMemberName %21 1 "NodeLinearOffsetBDA"
OpMemberName %21 2 "NodeEndNodesBDA"
OpMemberName %21 3 "NodePayloadStrideOrOffsetsBDA"
OpMemberName %21 4 "NodePayloadOutputBDA"
OpMemberName %21 5 "NodePayloadOutputAtomicBDA"
OpMemberName %21 6 "NodeLocalRootSignatureBDA"
OpMemberName %21 7 "NodePayloadOutputOffset"
OpMemberName %21 8 "NodeRemainingRecursionLevels"
OpName %23 "NodeDispatch"
OpName %24 "NodeCoalesceOffset"
OpName %25 "NodeCoalesceCount"
OpName %26 "NodeReadonlyU64Ptr"
OpMemberName %26 0 "value"
OpName %29 "NodeEntryIndirectPayloadStride"
OpName %30 "NodeIsProgramEntry"
OpName %31 "DispatchGridIsUpperBound"
OpName %32 "DispatchStaticPayload"
OpName %33 "MaxBroadcastGridX"
OpName %35 "GridXMinus1"
OpName %36 "MaxBroadcastGridY"
OpName %37 "GridYMinus1"
OpName %38 "MaxBroadcastGridZ"
OpName %39 "GridZMinus1"
OpName %43 "ThreadGroupSize"
OpName %46 "RWBuf0"
OpName %47 "node_main"
OpName %49 ""
OpName %50 ""
OpMemberName %50 0 "data"
OpName %68 "FinishCrossGroupSharing"
OpName %67 "CounterBDA"
OpName %75 "FinishCrossGroupSharingBroadcast"
OpName %147 "amplification_index"
OpName %176 "amplification_index"
OpName %212 "amplification_index"
OpName %241 "amplification_index"
OpDecorate %16 ArrayStride 4
OpDecorate %17 Block
OpMemberDecorate %17 0 Offset 0
OpMemberDecorate %17 0 NonWritable
OpDecorate %19 Block
OpMemberDecorate %19 0 Offset 0
OpMemberDecorate %19 0 NonWritable
OpMemberDecorate %21 0 Offset 0
OpMemberDecorate %21 1 Offset 8
OpMemberDecorate %21 2 Offset 16
OpMemberDecorate %21 3 Offset 24
OpMemberDecorate %21 4 Offset 32
OpMemberDecorate %21 5 Offset 40
OpMemberDecorate %21 6 Offset 48
OpMemberDecorate %21 7 Offset 56
OpMemberDecorate %21 8 Offset 60
OpDecorate %21 Block
OpDecorate %23 RestrictPointer
OpDecorate %26 Block
OpMemberDecorate %26 0 Offset 0
OpMemberDecorate %26 0 NonWritable
OpDecorate %29 SpecId 4
OpDecorate %30 SpecId 3
OpDecorate %31 SpecId 5
OpDecorate %32 SpecId 6
OpDecorate %33 SpecId 7
OpDecorate %36 SpecId 8
OpDecorate %38 SpecId 9
OpDecorate %40 SpecId 0
OpDecorate %41 SpecId 1
OpDecorate %42 SpecId 2
OpDecorate %46 DescriptorSet 0
OpDecorate %46 Binding 0
OpMemberDecorate %49 0 Offset 0
OpMemberDecorate %49 1 Offset 4
OpDecorate %50 Block
OpMemberDecorate %50 0 Offset 0
OpDecorate %73 BuiltIn LocalInvocationIndex
OpDecorate %95 BuiltIn WorkgroupId
OpDecorate %130 BuiltIn NumWorkgroups
OpDecorate %153 BuiltIn LocalInvocationId
OpDecorate %166 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeVector %5 2
%7 = OpTypeInt 64 0
%8 = OpTypePointer Private %7
%9 = OpVariable %8 Private
%10 = OpTypePointer Private %5
%11 = OpVariable %10 Private
%12 = OpTypeVector %5 3
%13 = OpTypePointer Private %12
%14 = OpVariable %13 Private
%15 = OpVariable %13 Private
%16 = OpTypeRuntimeArray %5
%17 = OpTypeStruct %5
%18 = OpTypePointer PhysicalStorageBuffer %17
%19 = OpTypeStruct %16
%20 = OpTypePointer PhysicalStorageBuffer %19
%21 = OpTypeStruct %7 %18 %18 %6 %7 %7 %6 %5 %5
%22 = OpTypePointer PushConstant %21
%23 = OpVariable %22 PushConstant
%24 = OpVariable %10 Private
%25 = OpVariable %10 Private
%26 = OpTypeStruct %7
%27 = OpTypePointer PhysicalStorageBuffer %26
%28 = OpTypeBool
%29 = OpSpecConstantFalse %28
%30 = OpSpecConstantFalse %28
%31 = OpSpecConstantTrue %28
%32 = OpSpecConstantFalse %28
%33 = OpSpecConstant %5 1024
%34 = OpConstant %5 1
%35 = OpSpecConstantOp %5 ISub %33 %34
%36 = OpSpecConstant %5 1
%37 = OpSpecConstantOp %5 ISub %36 %34
%38 = OpSpecConstant %5 1
%39 = OpSpecConstantOp %5 ISub %38 %34
%40 = OpSpecConstant %5 64
%41 = OpSpecConstant %5 1
%42 = OpSpecConstant %5 1
%43 = OpSpecConstantComposite %12 %40 %41 %42
%44 = OpTypeImage %5 Buffer 0 0 0 2 R32ui
%45 = OpTypePointer UniformConstant %44
%46 = OpVariable %45 UniformConstant
%49 = OpTypeStruct %5 %5
%50 = OpTypeStruct %49
%51 = OpTypePointer PhysicalStorageBuffer %50
%52 = OpTypePointer PhysicalStorageBuffer %49
%56 = OpConstant %5 0
%57 = OpTypePointer PhysicalStorageBuffer %5
%60 = OpConstant %5 2
%62 = OpConstant %5 5
%64 = OpConstant %5 3
%65 = OpConstant %5 24648
%66 = OpTypeFunction %28 %7
%72 = OpTypePointer Input %5
%73 = OpVariable %72 Input
%74 = OpTypePointer Workgroup %28
%75 = OpVariable %74 Workgroup
%81 = OpConstant %5 24840
%86 = OpConstant %7 8
%91 = OpTypePointer Image %5
%94 = OpTypePointer Input %12
%95 = OpVariable %94 Input
%100 = OpConstant %5 32768
%102 = OpTypePointer PushConstant %18
%109 = OpTypePointer PushConstant %7
%112 = OpTypePointer PushConstant %6
%117 = OpTypePointer PhysicalStorageBuffer %7
%130 = OpVariable %94 Input
%136 = OpConstant %7 0
%153 = OpVariable %94 Input
%156 = OpTypeVector %28 3
%166 = OpVariable %94 Input
%174 = OpSpecConstantOp %5 IMul %33 %36
%175 = OpSpecConstantOp %5 IMul %174 %38
%239 = OpSpecConstantOp %5 IMul %33 %36
%240 = OpSpecConstantOp %5 IMul %239 %38
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %253
%253 = OpLabel
%96 = OpLoad %12 %95
%97 = OpCompositeExtract %5 %96 0
%98 = OpCompositeExtract %5 %96 1
%99 = OpIMul %5 %98 %100
%101 = OpIAdd %5 %99 %97
%103 = OpAccessChain %102 %23 %34
%104 = OpLoad %18 %103
%105 = OpAccessChain %57 %104 %56
%106 = OpLoad %5 %105 Aligned 4
%107 = OpIAdd %5 %101 %106
%108 = OpSelect %5 %32 %106 %107
%110 = OpAccessChain %109 %23 %56
%111 = OpLoad %7 %110
OpStore %9 %111
OpSelectionMerge %257 None
OpBranchConditional %30 %254 %257
%254 = OpLabel
%113 = OpAccessChain %112 %23 %64
%114 = OpLoad %6 %113
%115 = OpCompositeExtract %5 %114 0
OpStore %11 %115
OpSelectionMerge %256 None
OpBranchConditional %29 %255 %256
%255 = OpLabel
%116 = OpConvertUToPtr %27 %111
%118 = OpAccessChain %117 %116 %56
%119 = OpLoad %7 %118 Aligned 8
OpStore %9 %119
%120 = OpBitcast %18 %114
%121 = OpAccessChain %57 %120 %56
%122 = OpLoad %5 %121 Aligned 4
OpStore %11 %122
OpBranch %256
%256 = OpLabel
OpBranch %257
%257 = OpLabel
OpSelectionMerge %290 None
OpBranchConditional %31 %278 %258
%278 = OpLabel
OpSelectionMerge %289 None
OpBranchConditional %30 %286 %279
%286 = OpLabel
%123 = OpLoad %7 %9
%124 = OpLoad %5 %11
%125 = OpIMul %5 %108 %124
%126 = OpUConvert %7 %125
%127 = OpIAdd %7 %123 %126
OpStore %9 %127
%128 = OpLoad %12 %95
%129 = OpCompositeExtract %5 %128 2
%131 = OpLoad %12 %130
%132 = OpCompositeExtract %5 %131 2
%134 = OpLoad %7 %9
%135 = OpIAdd %7 %134 %136
%137 = OpBitcast %57 %135
%138 = OpLoad %5 %137 Aligned 4
%139 = OpISub %5 %138 %34
%140 = OpExtInst %5 %133 FindUMsb %139
%141 = OpIAdd %5 %140 %34
%142 = OpIAdd %5 %141 %56
%143 = OpShiftLeftLogical %5 %138 %56
%144 = OpCompositeConstruct %12 %139 %56 %56
%145 = OpSLessThan %28 %139 %56
%146 = OpSelect %5 %145 %56 %143
OpBranch %287
%287 = OpLabel
%147 = OpPhi %5 %129 %286 %148 %294
%149 = OpULessThan %28 %147 %146
OpLoopMerge %288 %294 None
OpBranchConditional %149 %291 %288
%291 = OpLabel
%150 = OpBitFieldUExtract %5 %147 %56 %141
%151 = OpCompositeConstruct %12 %150 %56 %56
OpStore %14 %151
%152 = OpLoad %12 %153
%154 = OpIMul %12 %43 %151
%155 = OpIAdd %12 %154 %152
OpStore %15 %155
%158 = OpCompositeConstruct %12 %139 %56 %56
%157 = OpULessThanEqual %156 %151 %158
%159 = OpAll %28 %157
OpSelectionMerge %293 None
OpBranchConditional %159 %292 %293
%292 = OpLabel
%160 = OpFunctionCall %1 %47
OpControlBarrier %60 %60 %81
OpBranch %293
%293 = OpLabel
OpBranch %294
%294 = OpLabel
%148 = OpIAdd %5 %147 %132
OpBranch %287
%288 = OpLabel
OpBranch %289
%279 = OpLabel
%188 = OpLoad %7 %9
%189 = OpAccessChain %112 %23 %64
%190 = OpLoad %6 %189
%191 = OpBitcast %20 %190
%192 = OpInBoundsAccessChain %57 %191 %56 %108
%193 = OpLoad %5 %192 Aligned 4
%194 = OpUConvert %7 %193
%195 = OpIAdd %7 %188 %194
OpStore %9 %195
%196 = OpLoad %12 %95
%197 = OpCompositeExtract %5 %196 2
%198 = OpLoad %12 %130
%199 = OpCompositeExtract %5 %198 2
%200 = OpLoad %7 %9
%201 = OpIAdd %7 %200 %136
%202 = OpBitcast %57 %201
%203 = OpLoad %5 %202 Aligned 4
%204 = OpISub %5 %203 %34
%205 = OpExtInst %5 %133 FindUMsb %204
%206 = OpIAdd %5 %205 %34
%207 = OpIAdd %5 %206 %56
%208 = OpShiftLeftLogical %5 %203 %56
%209 = OpCompositeConstruct %12 %204 %56 %56
%210 = OpSLessThan %28 %204 %56
%211 = OpSelect %5 %210 %56 %208
OpBranch %280
%280 = OpLabel
%212 = OpPhi %5 %197 %279 %213 %285
%214 = OpULessThan %28 %212 %211
OpLoopMerge %281 %285 None
OpBranchConditional %214 %282 %281
%282 = OpLabel
%215 = OpBitFieldUExtract %5 %212 %56 %206
%216 = OpCompositeConstruct %12 %215 %56 %56
OpStore %14 %216
%217 = OpLoad %12 %153
%218 = OpIMul %12 %43 %216
%219 = OpIAdd %12 %218 %217
OpStore %15 %219
%221 = OpCompositeConstruct %12 %204 %56 %56
%220 = OpULessThanEqual %156 %216 %221
%222 = OpAll %28 %220
OpSelectionMerge %284 None
OpBranchConditional %222 %283 %284
%283 = OpLabel
%223 = OpFunctionCall %1 %47
OpControlBarrier %60 %60 %81
OpBranch %284
%284 = OpLabel
OpBranch %285
%285 = OpLabel
%213 = OpIAdd %5 %212 %199
OpBranch %280
%281 = OpLabel
OpBranch %289
%289 = OpLabel
OpBranch %290
%258 = OpLabel
OpSelectionMerge %277 None
OpBranchConditional %30 %268 %259
%268 = OpLabel
%161 = OpLoad %7 %9
%162 = OpLoad %5 %11
%163 = OpIMul %5 %108 %162
%164 = OpUConvert %7 %163
%165 = OpIAdd %7 %161 %164
OpStore %9 %165
OpSelectionMerge %276 None
OpBranchConditional %32 %275 %269
%275 = OpLabel
%167 = OpLoad %12 %95
%168 = OpLoad %12 %166
OpStore %14 %167
OpStore %15 %168
%169 = OpFunctionCall %1 %47
OpBranch %276
%269 = OpLabel
%170 = OpLoad %12 %95
%171 = OpCompositeExtract %5 %170 2
%172 = OpLoad %12 %130
%173 = OpCompositeExtract %5 %172 2
OpBranch %270
%270 = OpLabel
%176 = OpPhi %5 %171 %269 %177 %274
%178 = OpULessThan %28 %176 %175
OpLoopMerge %271 %274 None
OpBranchConditional %178 %272 %271
%272 = OpLabel
%179 = OpUMod %5 %176 %33
%180 = OpUDiv %5 %176 %33
%181 = OpUMod %5 %180 %36
%182 = OpUDiv %5 %180 %36
%183 = OpCompositeConstruct %12 %179 %181 %182
OpStore %14 %183
%184 = OpLoad %12 %153
%185 = OpIMul %12 %43 %183
%186 = OpIAdd %12 %185 %184
OpStore %15 %186
%187 = OpFunctionCall %1 %47
OpControlBarrier %60 %60 %81
OpBranch %273
%273 = OpLabel
OpBranch %274
%274 = OpLabel
%177 = OpIAdd %5 %176 %173
OpBranch %270
%271 = OpLabel
OpBranch %276
%276 = OpLabel
OpBranch %277
%259 = OpLabel
%224 = OpLoad %7 %9
%225 = OpAccessChain %112 %23 %64
%226 = OpLoad %6 %225
%227 = OpBitcast %20 %226
%228 = OpInBoundsAccessChain %57 %227 %56 %108
%229 = OpLoad %5 %228 Aligned 4
%230 = OpUConvert %7 %229
%231 = OpIAdd %7 %224 %230
OpStore %9 %231
OpSelectionMerge %267 None
OpBranchConditional %32 %266 %260
%266 = OpLabel
%232 = OpLoad %12 %95
%233 = OpLoad %12 %166
OpStore %14 %232
OpStore %15 %233
%234 = OpFunctionCall %1 %47
OpBranch %267
%260 = OpLabel
%235 = OpLoad %12 %95
%236 = OpCompositeExtract %5 %235 2
%237 = OpLoad %12 %130
%238 = OpCompositeExtract %5 %237 2
OpBranch %261
%261 = OpLabel
%241 = OpPhi %5 %236 %260 %242 %265
%243 = OpULessThan %28 %241 %240
OpLoopMerge %262 %265 None
OpBranchConditional %243 %263 %262
%263 = OpLabel
%244 = OpUMod %5 %241 %33
%245 = OpUDiv %5 %241 %33
%246 = OpUMod %5 %245 %36
%247 = OpUDiv %5 %245 %36
%248 = OpCompositeConstruct %12 %244 %246 %247
OpStore %14 %248
%249 = OpLoad %12 %153
%250 = OpIMul %12 %43 %248
%251 = OpIAdd %12 %250 %249
OpStore %15 %251
%252 = OpFunctionCall %1 %47
OpControlBarrier %60 %60 %81
OpBranch %264
%264 = OpLabel
OpBranch %265
%265 = OpLabel
%242 = OpIAdd %5 %241 %238
OpBranch %261
%262 = OpLabel
OpBranch %267
%267 = OpLabel
OpBranch %277
%277 = OpLabel
OpBranch %290
%290 = OpLabel
OpReturn
OpFunctionEnd
%47 = OpFunction %1 None %2
%48 = OpLabel
OpBranch %296
%296 = OpLabel
%53 = OpLoad %7 %9
%54 = OpConvertUToPtr %51 %53
%55 = OpAccessChain %52 %54 %56
%58 = OpAccessChain %57 %55 %34
%59 = OpAtomicIAdd %5 %58 %60 %56 %34
%61 = OpLoad %5 %58 Aligned|MakePointerVisible|NonPrivatePointer 4 %62
%63 = OpIAdd %5 %61 %64
OpStore %58 %63 Aligned|MakePointerAvailable|NonPrivatePointer 4 %62
OpControlBarrier %60 %60 %65
%84 = OpLoad %7 %9
%85 = OpIAdd %7 %84 %86
%87 = OpFunctionCall %28 %68 %85
OpSelectionMerge %298 None
OpBranchConditional %87 %297 %298
%297 = OpLabel
%88 = OpLoad %5 %73
%89 = OpLoad %5 %58 Aligned|MakePointerVisible|NonPrivatePointer 4 %62
%90 = OpLoad %44 %46
%92 = OpImageTexelPointer %91 %46 %88 %56
%93 = OpAtomicIAdd %5 %92 %62 %56 %89
OpBranch %298
%298 = OpLabel
OpReturn
OpFunctionEnd
%68 = OpFunction %28 None %66
%67 = OpFunctionParameter %7
%69 = OpLabel
%76 = OpLoad %5 %73
%77 = OpIEqual %28 %76 %56
OpSelectionMerge %71 None
OpBranchConditional %77 %70 %71
%70 = OpLabel
%78 = OpBitcast %57 %67
%79 = OpAtomicIDecrement %5 %78 %62 %56
%80 = OpIEqual %28 %79 %34
OpStore %75 %80 NonPrivatePointer
OpBranch %71
%71 = OpLabel
OpControlBarrier %60 %60 %81
%82 = OpLoad %28 %75 NonPrivatePointer
OpReturnValue %82
OpFunctionEnd
#endif
