#include <metal_stdlib>

using namespace metal;
void atomicOr_d09248(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_or_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);
  atomicOr_d09248(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;
}

