#include <metal_stdlib>

using namespace metal;
void atomicMin_69d383(threadgroup atomic_uint* const tint_symbol) {
  uint res = 0u;
  uint const x_10 = atomic_fetch_min_explicit(tint_symbol, 1u, memory_order_relaxed);
  res = x_10;
  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);
  atomicMin_69d383(tint_symbol_1);
  return;
}

void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) {
  uint const x_30 = *(tint_symbol_2);
  compute_main_inner(x_30, 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;
}

