#include <metal_stdlib>

using namespace metal;
struct S0_atomic {
  int x;
  atomic_uint a;
  int y;
  int z;
};

struct S0 {
  int x;
  uint a;
  int y;
  int z;
};

struct S1_atomic {
  int x;
  S0_atomic a;
  int y;
  int z;
};

struct S1 {
  int x;
  S0 a;
  int y;
  int z;
};

struct S2_atomic {
  int x;
  int y;
  int z;
  S1_atomic a;
};

struct S2 {
  int x;
  int y;
  int z;
  S1 a;
};

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

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

void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S2_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) {
  {
    (*(tint_symbol_3)).x = 0;
    (*(tint_symbol_3)).y = 0;
    (*(tint_symbol_3)).z = 0;
    (*(tint_symbol_3)).a.x = 0;
    (*(tint_symbol_3)).a.a.x = 0;
    atomic_store_explicit(&((*(tint_symbol_3)).a.a.a), 0u, memory_order_relaxed);
    (*(tint_symbol_3)).a.a.y = 0;
    (*(tint_symbol_3)).a.a.z = 0;
    (*(tint_symbol_3)).a.y = 0;
    (*(tint_symbol_3)).a.z = 0;
  }
  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 S2_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;
}

