#include <metal_stdlib>

using namespace metal;
void atomicAnd_45a819(threadgroup atomic_int* const tint_symbol) {
  int arg_1 = 0;
  int res = 0;
  arg_1 = 1;
  int const x_19 = arg_1;
  int const x_15 = atomic_fetch_and_explicit(tint_symbol, x_19, memory_order_relaxed);
  res = x_15;
  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);
  atomicAnd_45a819(tint_symbol_1);
  return;
}

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

