#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 = x__atomic_compare_exchange_resultu32{};
  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;
}

