#include <metal_stdlib>

using namespace metal;

struct atomic_compare_exchange_resultu32 {
  uint old_value;
  bool exchanged;
};
atomic_compare_exchange_resultu32 atomicCompareExchangeWeak_1(threadgroup atomic_uint* atomic, uint compare, uint value) {
  uint old_value = compare;
  bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed);
  return {old_value, exchanged};
}

struct x__atomic_compare_exchange_resultu32 {
  uint old_value;
  bool exchanged;
};

void atomicCompareExchangeWeak_83580d(threadgroup atomic_uint* const tint_symbol_2) {
  x__atomic_compare_exchange_resultu32 res = {.old_value=0u, .exchanged=false};
  atomic_compare_exchange_resultu32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, 1u, 1u);
  uint const old_value_1 = tint_symbol.old_value;
  uint const x_17 = old_value_1;
  x__atomic_compare_exchange_resultu32 const tint_symbol_1 = {.old_value=x_17, .exchanged=(x_17 == 1u)};
  res = tint_symbol_1;
  return;
}

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

void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_uint* const tint_symbol_5) {
  uint const x_35 = *(tint_symbol_4);
  compute_main_inner(x_35, tint_symbol_5);
  return;
}

void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_6, thread uint* const tint_symbol_7) {
  {
    atomic_store_explicit(tint_symbol_6, 0u, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  *(tint_symbol_7) = local_invocation_index_1_param;
  compute_main_1(tint_symbol_7, tint_symbol_6);
}

kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
  threadgroup atomic_uint tint_symbol_8;
  thread uint tint_symbol_9 = 0u;
  compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9));
  return;
}

