#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) {
  int arg_1 = 0;
  int arg_2 = 0;
  x__atomic_compare_exchange_resulti32 res = {};
  arg_1 = 1;
  arg_2 = 1;
  int const x_22 = arg_2;
  int const x_23 = arg_1;
  atomic_compare_exchange_resulti32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, x_23, x_22);
  int const old_value_1 = tint_symbol.old_value;
  int const x_24 = old_value_1;
  x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_24, .exchanged=(x_24 == x_22)};
  res = tint_symbol_1;
  return;
}

void compute_main_inner(uint local_invocation_index, 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_41 = *(tint_symbol_4);
  compute_main_inner(x_41, 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;
}

