#include <metal_stdlib>

using namespace metal;
void uses_a(threadgroup int* const tint_symbol) {
  *(tint_symbol) = as_type<int>((as_type<uint>(*(tint_symbol)) + as_type<uint>(1)));
}

void uses_b(threadgroup int* const tint_symbol_1) {
  *(tint_symbol_1) = as_type<int>((as_type<uint>(*(tint_symbol_1)) * as_type<uint>(2)));
}

void uses_a_and_b(threadgroup int* const tint_symbol_2, threadgroup int* const tint_symbol_3) {
  *(tint_symbol_2) = *(tint_symbol_3);
}

void no_uses() {
}

void outer(threadgroup int* const tint_symbol_4, threadgroup int* const tint_symbol_5) {
  *(tint_symbol_4) = 0;
  uses_a(tint_symbol_4);
  uses_a_and_b(tint_symbol_5, tint_symbol_4);
  uses_b(tint_symbol_5);
  no_uses();
}

void main1_inner(uint local_invocation_index, threadgroup int* const tint_symbol_6) {
  {
    *(tint_symbol_6) = 0;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  *(tint_symbol_6) = 42;
  uses_a(tint_symbol_6);
}

kernel void main1(uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup int tint_symbol_7;
  main1_inner(local_invocation_index, &(tint_symbol_7));
  return;
}

void main2_inner(uint local_invocation_index_1, threadgroup int* const tint_symbol_8) {
  {
    *(tint_symbol_8) = 0;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  *(tint_symbol_8) = 7;
  uses_b(tint_symbol_8);
}

kernel void main2(uint local_invocation_index_1 [[thread_index_in_threadgroup]]) {
  threadgroup int tint_symbol_9;
  main2_inner(local_invocation_index_1, &(tint_symbol_9));
  return;
}

void main3_inner(uint local_invocation_index_2, threadgroup int* const tint_symbol_10, threadgroup int* const tint_symbol_11) {
  {
    *(tint_symbol_10) = 0;
    *(tint_symbol_11) = 0;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  outer(tint_symbol_10, tint_symbol_11);
  no_uses();
}

kernel void main3(uint local_invocation_index_2 [[thread_index_in_threadgroup]]) {
  threadgroup int tint_symbol_12;
  threadgroup int tint_symbol_13;
  main3_inner(local_invocation_index_2, &(tint_symbol_12), &(tint_symbol_13));
  return;
}

kernel void main4() {
  no_uses();
  return;
}

