#include <metal_stdlib>

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

struct S_atomic {
  int x;
  atomic_uint a;
  uint y;
};

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

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

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

void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup S_atomic* const tint_symbol_2) {
  uint const x_35 = (*(tint_private_vars)).local_invocation_index_1;
  compute_main_inner(x_35, 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 S_atomic* const tint_symbol_3) {
  tint_zero_workgroup_memory(local_invocation_index_1_param, tint_symbol_3);
  (*(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 S_atomic tint_symbol_4;
  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_4));
  return;
}

