#include <metal_stdlib>

using namespace metal;
struct tint_symbol_1 {
  float in [[user(locn0)]];
  float2 coord [[user(locn1)]];
};

struct tint_symbol_2 {
  int value [[color(0)]];
};

int foo_inner(float in, float2 coord, thread bool* const tint_symbol_4, texture2d<float, access::sample> tint_symbol_5, sampler tint_symbol_6, device atomic_int* const tint_symbol_7) {
  if ((in == 0.0f)) {
    *(tint_symbol_4) = true;
  }
  int result = int(tint_symbol_5.sample(tint_symbol_6, coord)[0]);
  {
    int i = 0;
    while (true) {
      if (!((i < 10))) {
        break;
      }
      {
        result = as_type<int>((as_type<uint>(result) + as_type<uint>(i)));
      }
      {
        int tint_symbol_3 = 0;
        if (!(*(tint_symbol_4))) {
          tint_symbol_3 = atomic_fetch_add_explicit(tint_symbol_7, 1, memory_order_relaxed);
        }
        i = tint_symbol_3;
      }
    }
  }
  return result;
}

fragment tint_symbol_2 foo(texture2d<float, access::sample> tint_symbol_9 [[texture(0)]], sampler tint_symbol_10 [[sampler(0)]], device atomic_int* tint_symbol_11 [[buffer(0)]], tint_symbol_1 tint_symbol [[stage_in]]) {
  thread bool tint_symbol_8 = false;
  int const inner_result = foo_inner(tint_symbol.in, tint_symbol.coord, &(tint_symbol_8), tint_symbol_9, tint_symbol_10, tint_symbol_11);
  tint_symbol_2 wrapper_result = {};
  wrapper_result.value = inner_result;
  if (tint_symbol_8) {
    discard_fragment();
  }
  return wrapper_result;
}

