#include <metal_stdlib>

using namespace metal;
void atomicStore_726882(threadgroup atomic_uint* const tint_symbol) {
  uint arg_1 = 0u;
  arg_1 = 1u;
  uint const x_18 = arg_1;
  atomic_store_explicit(tint_symbol, x_18, memory_order_relaxed);
  return;
}

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

void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
  uint const x_31 = *(tint_symbol_2);
  compute_main_inner(x_31, tint_symbol_3);
  return;
}

void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) {
  {
    atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  *(tint_symbol_5) = local_invocation_index_1_param;
  compute_main_1(tint_symbol_5, tint_symbol_4);
}

kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
  threadgroup atomic_uint tint_symbol_6;
  thread uint tint_symbol_7 = 0u;
  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7));
  return;
}

