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 x_91 = 0.0f;
  float x_91_phi = 0.0f;
  int x_94_phi = 0;
  x_91_phi = -0.5f;
  x_94_phi = 1;
  while (true) {
    float x_104 = 0.0f;
    float x_113 = 0.0f;
    int x_95 = 0;
    float x_92_phi = 0.0f;
    x_91 = x_91_phi;
    int const x_94 = x_94_phi;
    if ((x_94 < 800)) {
    } else {
      break;
    }
    float x_112 = 0.0f;
    float x_113_phi = 0.0f;
    if (((x_94 % 32) == 0)) {
      x_104 = (x_91 + 0.400000006f);
      x_92_phi = x_104;
    } else {
      float const x_106 = *(thirty_two);
      x_113_phi = x_91;
      if (((float(x_94) % rint(x_106)) <= 0.01f)) {
        x_112 = (x_91 + 100.0f);
        x_113_phi = x_112;
      }
      x_113 = x_113_phi;
      x_92_phi = x_113;
    }
    float x_92 = 0.0f;
    x_92 = x_92_phi;
    float const x_115 = *(limit);
    if ((float(x_94) >= x_115)) {
      return x_92;
    }
    {
      x_95 = (x_94 + 1);
      x_91_phi = x_92;
      x_94_phi = x_95;
    }
  }
  return x_91;
}

void main_1(constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int x_68_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_52 = x_10.resolution.x;
  float const x_54 = rint((x_52 * 0.125f));
  float const x_56 = (*(tint_symbol_5)).x;
  param = x_56;
  param_1 = x_54;
  float const x_57 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_57;
  float const x_60 = (*(tint_symbol_5)).y;
  param_2 = x_60;
  param_3 = x_54;
  float const x_61 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_61;
  float const x_63 = c.x;
  float const x_64 = c.y;
  c.z = (x_63 + x_64);
  x_68_phi = 0;
  while (true) {
    int x_69 = 0;
    int const x_68 = x_68_phi;
    if ((x_68 < 3)) {
    } else {
      break;
    }
    int const x_74_save = x_68;
    float const x_75 = c[x_74_save];
    if ((x_75 >= 1.0f)) {
      float const x_79 = c[x_74_save];
      float const x_80 = c[x_74_save];
      c[x_74_save] = (x_79 * x_80);
    }
    {
      x_69 = (x_68 + 1);
      x_68_phi = x_69;
    }
  }
  float3 const x_82 = c;
  float3 const x_84 = normalize(fabs(x_82));
  *(tint_symbol_6) = float4(x_84.x, x_84.y, x_84.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[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_10, &(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\u26w.0.metal:39:25: error: invalid operands to binary expression ('float' and 'float')
      if (((float(x_94) % rint(x_106)) <= 0.01f)) {
            ~~~~~~~~~~~ ^ ~~~~~~~~~~~
1 error generated.

