#include <metal_stdlib>

using namespace metal;

struct atomic_compare_exchange_result_i32 {
  int old_value;
  bool exchanged;
};
atomic_compare_exchange_result_i32 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 tint_private_vars_struct {
  uint local_invocation_index_1;
};

void tint_zero_workgroup_memory(uint local_idx, threadgroup atomic_int* const tint_symbol_2) {
  if ((local_idx < 1u)) {
    atomic_store_explicit(tint_symbol_2, 0, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
}

struct x__atomic_compare_exchange_resulti32 {
  int old_value;
  bool exchanged;
};

void atomicCompareExchangeWeak_e88938(threadgroup atomic_int* const tint_symbol_3) {
  int arg_1 = 0;
  int arg_2 = 0;
  x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32{};
  arg_1 = 1;
  arg_2 = 1;
  int const x_22 = arg_2;
  int const x_23 = arg_1;
  atomic_compare_exchange_result_i32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_3, 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_2, threadgroup atomic_int* const tint_symbol_4) {
  atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed);
  threadgroup_barrier(mem_flags::mem_threadgroup);
  atomicCompareExchangeWeak_e88938(tint_symbol_4);
  return;
}

void compute_main_1(thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_5) {
  uint const x_41 = (*(tint_private_vars)).local_invocation_index_1;
  compute_main_inner(x_41, tint_symbol_5);
  return;
}

void compute_main_inner_1(uint local_invocation_index_1_param, thread tint_private_vars_struct* const tint_private_vars, threadgroup atomic_int* const tint_symbol_6) {
  tint_zero_workgroup_memory(local_invocation_index_1_param, tint_symbol_6);
  (*(tint_private_vars)).local_invocation_index_1 = local_invocation_index_1_param;
  compute_main_1(tint_private_vars, tint_symbol_6);
}

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

