#include <metal_stdlib>

using namespace metal;
half tint_workgroupUniformLoad(threadgroup half* const p) {
  threadgroup_barrier(mem_flags::mem_threadgroup);
  half const result = *(p);
  threadgroup_barrier(mem_flags::mem_threadgroup);
  return result;
}

void workgroupUniformLoad_e07d08(threadgroup half* const tint_symbol, device half* const tint_symbol_1) {
  half res = tint_workgroupUniformLoad(tint_symbol);
  *(tint_symbol_1) = res;
}

void compute_main_inner(uint local_invocation_index, threadgroup half* const tint_symbol_2, device half* const tint_symbol_3) {
  {
    *(tint_symbol_2) = 0.0h;
  }
  threadgroup_barrier(mem_flags::mem_threadgroup);
  workgroupUniformLoad_e07d08(tint_symbol_2, tint_symbol_3);
}

kernel void compute_main(device half* tint_symbol_5 [[buffer(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) {
  threadgroup half tint_symbol_4;
  compute_main_inner(local_invocation_index, &(tint_symbol_4), tint_symbol_5);
  return;
}

