#include <metal_stdlib>

using namespace metal;

struct atomic_compare_exchange_resulti32 {
  int old_value;
  bool exchanged;
};
template <typename A, typename T>
atomic_compare_exchange_resulti32 atomicCompareExchangeWeak_1(threadgroup A* atomic, T compare, T value) {
  T old_value = compare;
  bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed);
  return {old_value, exchanged};
}

void atomicCompareExchangeWeak_e88938(threadgroup atomic_int* const tint_symbol) {
  int arg_1 = 1;
  int arg_2 = 1;
  atomic_compare_exchange_resulti32 res = atomicCompareExchangeWeak_1(tint_symbol, arg_1, arg_2);
}

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

kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup atomic_int tint_symbol_2;
  compute_main_inner(local_invocation_index, &(tint_symbol_2));
  return;
}

