#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_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(1)]], device doesNotMatter& x_12 [[buffer(0)]]) {
  thread float4 tint_symbol_2 = 0.0f;
  main_1(x_9, x_12, &(tint_symbol_2));
  return;
}

