#version 460
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

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

void main()
{
    uint _19;
    if (gl_GlobalInvocationID.x == 0u)
    {
        _19 = 0u;
    }
    else
    {
        uint _20;
        uint _23 = 0u;
        uint _24 = 0u;
        bool _30;
        for (;;)
        {
            _30 = imageLoad(_8, int(_24)).x == 40u;
            uint frontier_phi_6_pred;
            for (;;)
            {
                uint _48;
                if (_30)
                {
                    if (_24 == 10u)
                    {
                        frontier_phi_6_pred = _23;
                        break;
                    }
                    _48 = imageLoad(_8, int(_24 * 4u)).x;
                }
                else
                {
                    _48 = imageLoad(_8, int(_24 * 3u)).x;
                }
                frontier_phi_6_pred = (_48 + _23) + imageLoad(_8, int(_24 * 2u)).x;
                break;
            }
            _20 = frontier_phi_6_pred;
            uint _25 = _24 + 1u;
            if (_25 == gl_GlobalInvocationID.x)
            {
                break;
            }
            else
            {
                _23 = _20;
                _24 = _25;
                continue;
            }
        }
        _19 = _20;
    }
    imageStore(_8, int(0u), uvec4(_19));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 70
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %12
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "main"
OpName %54 "frontier_phi_6.pred"
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %12 BuiltIn GlobalInvocationId
%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
%10 = OpTypeVector %5 3
%11 = OpTypePointer Input %10
%12 = OpVariable %11 Input
%13 = OpTypePointer Input %5
%15 = OpConstant %5 0
%17 = OpTypeBool
%21 = OpTypeVector %5 4
%27 = OpConstant %5 2
%31 = OpConstant %5 40
%33 = OpConstant %5 10
%35 = OpConstant %5 12
%37 = OpConstant %5 3
%41 = OpConstant %5 1
%44 = OpConstant %5 4
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %55
%55 = OpLabel
%9 = OpLoad %6 %8
%14 = OpAccessChain %13 %12 %15
%16 = OpLoad %5 %14
%18 = OpIEqual %17 %16 %15
OpSelectionMerge %67 None
OpBranchConditional %18 %67 %56
%56 = OpLabel
OpBranch %57
%57 = OpLabel
%23 = OpPhi %5 %15 %56 %20 %65
%24 = OpPhi %5 %15 %56 %25 %65
%26 = OpShiftLeftLogical %5 %24 %27
%28 = OpImageRead %21 %9 %24
%29 = OpCompositeExtract %5 %28 0
%30 = OpIEqual %17 %29 %31
OpLoopMerge %66 %65 None
OpBranch %58
%58 = OpLabel
OpLoopMerge %64 %68 None
OpBranch %59
%59 = OpLabel
OpSelectionMerge %63 None
OpBranchConditional %30 %61 %60
%61 = OpLabel
%32 = OpIEqual %17 %24 %33
OpSelectionMerge %62 None
OpBranchConditional %32 %64 %62
%62 = OpLabel
%43 = OpShiftLeftLogical %5 %24 %44
%45 = OpIMul %5 %24 %44
%46 = OpImageRead %21 %9 %45
%47 = OpCompositeExtract %5 %46 0
OpBranch %63
%60 = OpLabel
%34 = OpIMul %5 %24 %35
%36 = OpIMul %5 %24 %37
%38 = OpImageRead %21 %9 %36
%39 = OpCompositeExtract %5 %38 0
OpBranch %63
%63 = OpLabel
%48 = OpPhi %5 %39 %60 %47 %62
%49 = OpIAdd %5 %48 %23
%50 = OpShiftLeftLogical %5 %24 %37
%51 = OpIMul %5 %24 %27
%52 = OpImageRead %21 %9 %51
%53 = OpCompositeExtract %5 %52 0
%40 = OpIAdd %5 %49 %53
OpBranch %64
%68 = OpLabel
OpBranch %58
%64 = OpLabel
%54 = OpPhi %5 %23 %61 %40 %63
%20 = OpCopyObject %5 %54
OpBranch %65
%65 = OpLabel
%25 = OpIAdd %5 %24 %41
%42 = OpIEqual %17 %25 %16
OpBranchConditional %42 %66 %57
%66 = OpLabel
OpBranch %67
%67 = OpLabel
%19 = OpPhi %5 %15 %55 %20 %66
%22 = OpCompositeConstruct %21 %19 %19 %19 %19
OpImageWrite %9 %15 %22
OpReturn
OpFunctionEnd
#endif
