#include <metal_stdlib>

using namespace metal;
struct SB_RW_atomic {
  /* 0x0000 */ atomic_uint arg_0;
};

struct SB_RW {
  uint arg_0;
};

void atomicExchange_d59712(device SB_RW_atomic* const tint_symbol) {
  uint arg_1 = 0u;
  uint res = 0u;
  arg_1 = 1u;
  uint const x_18 = arg_1;
  uint const x_13 = atomic_exchange_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed);
  res = x_13;
  return;
}

void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) {
  atomicExchange_d59712(tint_symbol_1);
  return;
}

fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) {
  fragment_main_1(tint_symbol_2);
  return;
}

void compute_main_1(device SB_RW_atomic* const tint_symbol_3) {
  atomicExchange_d59712(tint_symbol_3);
  return;
}

kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) {
  compute_main_1(tint_symbol_4);
  return;
}

