#include <metal_stdlib>

using namespace metal;

struct atomic_compare_exchange_resulti32 {
  int old_value;
  bool exchanged;
};
atomic_compare_exchange_resulti32 atomicCompareExchangeWeak_1(threadgroup atomic_int* atomic, int compare, int value) {
  int 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_resulti32 {
  int old_value;
  bool exchanged;
};

void atomicCompareExchangeWeak_e88938(threadgroup atomic_int* const tint_symbol_2) {
  x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32{};
  atomic_compare_exchange_resulti32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, 1, 1);
  int const old_value_1 = tint_symbol.old_value;
  int const x_18 = old_value_1;
  x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_18, .exchanged=(x_18 == 1)};
  res = tint_symbol_1;
  return;
}

void compute_main_inner(uint local_invocation_index_2, threadgroup atomic_int* const tint_symbol_3) {
  atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed);
  threadgroup_barrier(mem_flags::mem_threadgroup);
  atomicCompareExchangeWeak_e88938(tint_symbol_3);
  return;
}

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

void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_6, thread uint* const tint_symbol_7) {
  {
    atomic_store_explicit(tint_symbol_6, 0, 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_int 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;
}

