#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_2, 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;
}

