#include <metal_stdlib>

using namespace metal;
struct tint_private_vars_struct {
  uint local_invocation_index_1;
};

void atomicSub_0d26c2(threadgroup atomic_uint* const tint_symbol) {
  uint arg_1 = 0u;
  uint res = 0u;
  arg_1 = 1u;
  uint const x_18 = arg_1;
  uint const x_14 = atomic_fetch_sub_explicit(tint_symbol, x_18, memory_order_relaxed);
  res = x_14;
  return;
}

void compute_main_inner(uint local_invocation_index_2, threadgroup atomic_uint* const tint_symbol_1) {
  atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed);
  threadgroup_barrier(mem_flags::mem_threadgroup);
  atomicSub_0d26c2(tint_symbol_1);
  return;
}

void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_2) {
  uint const x_32 = (*(tint_private_vars)).local_invocation_index_1;
  compute_main_inner(x_32, tint_symbol_2);
  return;
}

void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_3) {
  {
    atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
  compute_main_1(tint_private_vars, tint_symbol_3);
}

kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
  thread tint_private_vars_struct tint_private_vars = {};
  threadgroup atomic_uint tint_symbol_4;
  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
  return;
}

