#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct doesNotMatter {
  /* 0x0000 */ uint x_compute_data[1];
};

void main_1(constant buf0& x_9, device doesNotMatter& x_12, thread float4* const tint_symbol_1) {
  int GLF_live2_looplimiter1 = 0;
  int i = 0;
  int j = 0;
  float GLF_dead3x = 0.0f;
  float x_51 = 0.0f;
  int GLF_dead3k = 0;
  GLF_live2_looplimiter1 = 0;
  i = 0;
  while (true) {
    int const x_56 = i;
    if ((x_56 < 1)) {
    } else {
      break;
    }
    int const x_59 = GLF_live2_looplimiter1;
    if ((x_59 >= 3)) {
      j = 0;
      while (true) {
        int const x_67 = j;
        if ((x_67 < 1)) {
        } else {
          break;
        }
        float const x_13 = (*(tint_symbol_1)).x;
        if ((int(x_13) < 120)) {
        } else {
          threadgroup_barrier(mem_flags::mem_threadgroup);
        }
        {
          int const x_76 = j;
          j = as_type<int>((as_type<uint>(x_76) + as_type<uint>(1)));
        }
      }
      break;
    }
    {
      int const x_78 = i;
      i = as_type<int>((as_type<uint>(x_78) + as_type<uint>(1)));
    }
  }
  float const x_81 = x_9.injectionSwitch.x;
  float const x_83 = x_9.injectionSwitch.y;
  if ((x_81 > x_83)) {
    float const x_14 = (*(tint_symbol_1)).x;
    x_51 = x_14;
  } else {
    x_51 = 0.0f;
  }
  float const x_15 = x_51;
  GLF_dead3x = x_15;
  GLF_dead3k = 0;
  while (true) {
    int const x_93 = GLF_dead3k;
    if ((x_93 < 2)) {
    } else {
      break;
    }
    float const x_96 = GLF_dead3x;
    if ((x_96 > 4.0f)) {
      break;
    }
    float const x_16 = (*(tint_symbol_1)).x;
    GLF_dead3x = x_16;
    threadgroup_barrier(mem_flags::mem_threadgroup);
    {
      int const x_101 = GLF_dead3k;
      GLF_dead3k = as_type<int>((as_type<uint>(x_101) + as_type<uint>(1)));
    }
  }
  x_12.x_compute_data[0] = 42u;
  return;
}

kernel void tint_symbol(constant buf0& x_9 [[buffer(0)]], device doesNotMatter& x_12 [[buffer(1)]]) {
  thread float4 tint_symbol_2 = 0.0f;
  main_1(x_9, x_12, &(tint_symbol_2));
  return;
}

