#include <metal_stdlib>

using namespace metal;
void atomicMax_beccfc(threadgroup atomic_uint* const tint_symbol, device uint* const tint_symbol_1) {
  uint arg_1 = 1u;
  uint res = atomic_fetch_max_explicit(tint_symbol, arg_1, memory_order_relaxed);
  *(tint_symbol_1) = res;
}

void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_2, device uint* const tint_symbol_3) {
  {
    atomic_store_explicit(tint_symbol_2, 0u, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  atomicMax_beccfc(tint_symbol_2, tint_symbol_3);
}

kernel void compute_main(device uint* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup atomic_uint tint_symbol_4;
  compute_main_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
  return;
}

