#include <metal_stdlib>

using namespace metal;
void atomicExchange_e114ba(threadgroup atomic_int* const tint_symbol) {
  int res = 0;
  int const x_11 = atomic_exchange_explicit(tint_symbol, 1, memory_order_relaxed);
  res = x_11;
  return;
}

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

void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* 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_int* const tint_symbol_4, thread uint* const tint_symbol_5) {
  {
    atomic_store_explicit(tint_symbol_4, 0, 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_int 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;
}

