SKIP: FAILED

#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  while (true) {
    int const x_136 = i;
    if ((x_136 < 800)) {
    } else {
      break;
    }
    int const x_139 = i;
    if (((x_139 % 32) == 0)) {
      float const x_145 = result;
      result = (x_145 + 0.400000006f);
    } else {
      int const x_147 = i;
      float const x_149 = *(thirty_two);
      if (((float(x_147) % rint(x_149)) <= 0.01f)) {
        float const x_155 = result;
        result = (x_155 + 100.0f);
      }
    }
    int const x_157 = i;
    float const x_159 = *(limit);
    if ((float(x_157) >= x_159)) {
      float const x_163 = result;
      return x_163;
    }
    {
      int const x_164 = i;
      i = (x_164 + 1);
    }
  }
  float const x_166 = result;
  return x_166;
}

void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int i_1 = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_63 = x_13.resolution.x;
  thirty_two_1 = rint((x_63 / 8.0f));
  float const x_67 = (*(tint_symbol_5)).x;
  param = x_67;
  float const x_68 = thirty_two_1;
  param_1 = x_68;
  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_69;
  float const x_72 = (*(tint_symbol_5)).y;
  param_2 = x_72;
  float const x_73 = thirty_two_1;
  param_3 = x_73;
  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_74;
  float3 const x_76 = c;
  float3 const x_79 = c;
  float4x2 const x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
  c.z = (((x_76 * float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)))).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
  i_1 = 0;
  while (true) {
    int const x_99 = i_1;
    if ((x_99 < 3)) {
    } else {
      break;
    }
    int const x_102 = i_1;
    float const x_104 = c[x_102];
    if ((x_104 >= 1.0f)) {
      int const x_108 = i_1;
      int const x_109 = i_1;
      float const x_111 = c[x_109];
      int const x_112 = i_1;
      float const x_114 = c[x_112];
      c[x_108] = (x_111 * x_114);
      float const x_118 = (*(tint_symbol_5)).y;
      if ((x_118 < 0.0f)) {
        break;
      }
    }
    {
      int const x_122 = i_1;
      i_1 = (x_122 + 1);
    }
  }
  float3 const x_124 = c;
  float3 const x_126 = normalize(fabs(x_124));
  *(tint_symbol_6) = float4(x_126.x, x_126.y, x_126.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_13, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

T:\tmp\uet8.0.metal:32:26: error: invalid operands to binary expression ('float' and 'float')
      if (((float(x_147) % rint(x_149)) <= 0.01f)) {
            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
1 error generated.

