#include <metal_stdlib>
using namespace metal;
struct S {
  int a;
  int b;
};
struct tint_module_vars_struct {
  device int* s;
  threadgroup atomic_int* g1;
};
struct tint_symbol_2 {
  atomic_int tint_symbol_1;
};

int accept_value(int val) {
  return val;
}
int accept_ptr_deref_call_func(thread int* const val) {
  int const v = (*val);
  return (v + accept_value((*val)));
}
int accept_ptr_deref_pass_through(thread int* const val) {
  int const v_1 = (*val);
  return (v_1 + accept_ptr_deref_call_func(val));
}
int accept_ptr_to_struct_and_access(thread S* const val) {
  return ((*val).a + (*val).b);
}
int accept_ptr_to_struct_access_pass_ptr(thread S* const val) {
  thread int* const b = (&(*val).a);
  (*b) = 2;
  return (*b);
}
int tint_f32_to_i32(float value) {
  return select(2147483647, select((-2147483647 - 1), int(value), (value >= -2147483648.0f)), (value <= 2147483520.0f));
}
int accept_ptr_vec_access_elements(thread float3* const v1) {
  (*v1)[0u] = cross((*v1), (*v1))[0u];
  return tint_f32_to_i32((*v1)[0u]);
}
int call_builtin_with_mod_scope_ptr(tint_module_vars_struct tint_module_vars) {
  return atomic_load_explicit(tint_module_vars.g1, memory_order_relaxed);
}
void tint_symbol_inner(uint tint_local_index, tint_module_vars_struct tint_module_vars) {
  if ((tint_local_index == 0u)) {
    atomic_store_explicit(tint_module_vars.g1, 0, memory_order_relaxed);
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  int v1 = 0;
  S v2 = S{};
  thread S* const v3 = (&v2);
  float3 v4 = float3(0.0f);
  int const t1 = atomic_load_explicit(tint_module_vars.g1, memory_order_relaxed);
  int const v_2 = accept_ptr_deref_pass_through((&v1));
  int const v_3 = (v_2 + accept_ptr_to_struct_and_access((&v2)));
  int const v_4 = (v_3 + accept_ptr_to_struct_and_access(v3));
  int const v_5 = (v_4 + accept_ptr_vec_access_elements((&v4)));
  int const v_6 = (v_5 + accept_ptr_to_struct_access_pass_ptr((&v2)));
  (*tint_module_vars.s) = ((v_6 + call_builtin_with_mod_scope_ptr(tint_module_vars)) + t1);
}
kernel void tint_symbol(uint tint_local_index [[thread_index_in_threadgroup]], device int* s [[buffer(0)]], threadgroup tint_symbol_2* v_7 [[threadgroup(0)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.s=s, .g1=(&(*v_7).tint_symbol_1)};
  tint_symbol_inner(tint_local_index, tint_module_vars);
}
