#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 tint_private_vars_struct {
  uint local_invocation_index_1;
};

struct x__atomic_compare_exchange_resultu32 {
  uint old_value;
  bool exchanged;
};

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

void compute_main_inner(uint local_invocation_index_2, 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 tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_4) {
  uint const x_40 = (*(tint_private_vars)).local_invocation_index_1;
  compute_main_inner(x_40, tint_symbol_4);
  return;
}

void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_uint* const tint_symbol_5) {
  {
    atomic_store_explicit(tint_symbol_5, 0u, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
  compute_main_1(tint_private_vars, tint_symbol_5);
}

kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) {
  thread tint_private_vars_struct tint_private_vars = {};
  threadgroup atomic_uint tint_symbol_6;
  compute_main_inner_1(local_invocation_index_1_param, &(tint_private_vars), &(tint_symbol_6));
  return;
}

