#include <metal_stdlib>

using namespace metal;
struct S_atomic {
  int x;
  atomic_uint a;
  uint y;
};

struct S {
  int x;
  uint a;
  uint y;
};

void compute_main_inner(uint local_invocation_index_2, threadgroup S_atomic* const tint_symbol) {
  (*(tint_symbol)).x = 0;
  atomic_store_explicit(&((*(tint_symbol)).a), 0u, memory_order_relaxed);
  (*(tint_symbol)).y = 0u;
  threadgroup_barrier(mem_flags::mem_threadgroup);
  atomic_store_explicit(&((*(tint_symbol)).a), 1u, memory_order_relaxed);
  return;
}

void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) {
  uint const x_35 = *(tint_symbol_1);
  compute_main_inner(x_35, tint_symbol_2);
  return;
}

void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
  {
    (*(tint_symbol_3)).x = 0;
    atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed);
    (*(tint_symbol_3)).y = 0u;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  *(tint_symbol_4) = local_invocation_index_1_param;
  compute_main_1(tint_symbol_4, tint_symbol_3);
}

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

